2、编写程序让这8个LED依次不停地从右往左定时流水闪烁(每次亮一个灯,每个LED亮2s,外部晶振11.0592M,定时时间10ms,采用T1做定时器,方式一,用中断服务程序,给出c语言代码
时间: 2023-11-21 08:03:54 浏览: 77
好的,以下是一个基于C语言的代码示例,实现了您所需的功能:
```c
#include <reg52.h>
sbit LED1 = P1^0;
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 led_num = 0; // 当前应该亮的LED编号
unsigned int count = 0; // 定时器计数器
void timer1_isr() interrupt 3
{
TH1 = 0xFC; // 重新设置定时器初值,使其每10ms触发一次中断
TL1 = 0x66;
count++; // 计数器自增
if (count >= 200) // 如果计数器达到200,即2s时间到了
{
count = 0; // 重置计数器
switch (led_num) // 根据当前LED编号点亮对应的LED
{
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
case 4: LED5 = 1; break;
case 5: LED6 = 1; break;
case 6: LED7 = 1; break;
case 7: LED8 = 1; break;
default: break;
}
led_num++; // LED编号自增
if (led_num >= 8) // 如果LED编号超过了7,即全部LED都已经点亮过了,重置为0
{
led_num = 0;
}
// 熄灭上一个LED
switch (led_num - 1)
{
case 0: LED1 = 0; break;
case 1: LED2 = 0; break;
case 2: LED3 = 0; break;
case 3: LED4 = 0; break;
case 4: LED5 = 0; break;
case 5: LED6 = 0; break;
case 6: LED7 = 0; break;
case 7: LED8 = 0; break;
default: break;
}
}
}
void main()
{
TMOD = 0x10; // 设置定时器T1为方式1
TH1 = 0xFC; // 给定时器初值,使其每10ms触发一次中断
TL1 = 0x66;
ET1 = 1; // 允许定时器T1中断
EA = 1; // 允许总中断
TR1 = 1; // 启动定时器T1
while (1)
{
// 程序主循环
}
}
```
请注意,以上代码仅供参考,具体实现可能会因为硬件平台和具体的开发环境而有所不同。如果您在实现过程中遇到了问题,可以根据具体的错误信息进行调试和修改。
阅读全文