关于#c++#的问题:在AT89C51的P1口外接8个LED,使LED依次从左往右闪烁,点亮时间均为1S(同一时刻只有一个LED亮(用T0作定时器,晶振为12M采用查询方式)

在AT89C51的P1口外接8个LED,使LED依次从左往右闪烁,点亮时间均为1S(同一时刻只有一个LED亮(用T0作定时器,工作方式一,定时时间10mS,晶振为12M采用查询方式)。具体代码应该怎么写啊

参考GPT和自己的思路:首先,需要定义一个计数器count用来记录当前灯的位置,然后在中断函数里每10ms更新一次count,并根据count的值点亮相应的LED。具体代码如下所示:

#include <reg51.h> // 引入51单片机头文件

sbit LED1 = P1^0; // 定义LED1~LED8对应的IO口
sbit LED2 = P1^1;
sbit LED3 = P1^2;
sbit LED4 = P1^3;
sbit LED5 = P1^4;
sbit LED6 = P1^5;
sbit LED7 = P1^6;
sbit LED8 = P1^7;

unsigned char count = 0; // 定义计数器count

void main() {
  TMOD = 0x01; // 定时器0工作方式1
  TH0 = 0xFC; // 计时10ms,12M晶振,计算器初值为65536-12000=0xFC18
  TL0 = 0x18;
  ET0 = 1; // 打开定时器0中断
  EA = 1; // 打开总中断
  TR0 = 1; // 启动定时器0
  while (1) {} // 程序主循环
}

void timer0_isr() interrupt 1 { // 定时器0中断函数
  TH0 = 0xFC; // 计时10ms,12M晶振,计算器初值为65536-12000=0xFC18
  TL0 = 0x18;
  count++;
  if (count > 8) count = 1; // 计数器复位
  switch (count) { // 根据计数器的值点亮相应的LED
    case 1: LED1 = 1; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; LED7 = 0; LED8 = 0; break;
    case 2: LED1 = 0; LED2 = 1; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; LED7 = 0; LED8 = 0; break;
    case 3: LED1 = 0; LED2 = 0; LED3 = 1; LED4 = 0; LED5 = 0; LED6 = 0; LED7 = 0; LED8 = 0; break;
    case 4: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 1; LED5 = 0; LED6 = 0; LED7 = 0; LED8 = 0; break;
    case 5: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 1; LED6 = 0; LED7 = 0; LED8 = 0; break;
    case 6: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 1; LED7 = 0; LED8 = 0; break;
    case 7: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; LED7 = 1; LED8 = 0; break;
    case 8: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 0; LED5 = 0; LED6 = 0; LED7 = 0; LED8 = 1; break;
  }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7688588
  • 你也可以参考下这篇文章:蓝桥杯嵌入式基础板模块之LED模块不受控制的解决方法
  • 除此之外, 这篇博客: AT89C51 LED点亮程序中的 1、点亮一个灯 ,实现D1闪烁 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include<reg52.h>
    //类型声明
    typedef unsigned int u16;
    typedef unsigned char u8;
    //位定义
    sbit led=P2^0;
    //延时函数
    void delay(u16 i)
    {
       while(i--);
    }
    int main()
    {
       while(1)
       {
         led=1;  //led为共阳接法  此时led不亮
         delay(50000);
         led=0;
         delay(50000);
       }
       return 0}
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^