在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;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:#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;
}