#include <reg51.h>// 定义8个IO口的控制引脚sbit LED0 = P1^0;sbit LED1 = P1^1;sbit LED2 = P1^2;sbit LED3 = P1^3;sbit LED4 = P1^4;sbit LED5 = P1^5;sbit LED6 = P1^6;sbit LED7 = P1^7;unsigned char led_status = 0; // 8个LED的状态void timer0_isr() interrupt 1 // 定时器0中断服务函数{ TH0 = 0xFC; // 重新设置定时器初值,每50ms中断一次 TL0 = 0x18; unsigned char i; for(i=0; i<8; i++) { if(led_status & (1 << i)) // 控制第i个LED { switch(i) { case 0: LED0 = !LED0; break; case 1: LED1 = !LED1; break; case 2: LED2 = !LED2; break; case 3: LED3 = !LED3; break; case 4: LED4 = !LED4; break; case 5: LED5 = !LED5; break; case 6: LED6 = !LED6; break; case 7: LED7 = !LED7; break; } } }}void main(){ TMOD = 0x01; // 定时器0工作在模式1(16位自动重载) TH0 = 0xFC; // 设置定时器初值,每50ms中断一次 TL0 = 0x18; TR0 = 1; // 启动定时器0 ET0 = 1; // 允许定时器0中断 EA = 1; // 打开总中断开关 unsigned char i, j; for(i=0; i<8; i++) { for(j=0; j<10; j++) // 控制每个LED闪烁10次 { led_status = (1 << i); // 控制当前LED delay(2000); // 等待2秒 } } while(1); // 主循环中不需要做任何事情}
时间: 2024-02-14 22:12:46 浏览: 122
IO输出-点亮多个LED灯方法2(51单片机C语言实例Proteus仿真和代码).zip
这是一段 51 单片机的代码,实现了一个 8 个 LED 灯闪烁的效果。在主函数中,先是用两层循环控制每个 LED 灯闪烁 10 次,然后进入一个无限循环,等待中断发生。当定时器 0 中断发生时,会调用中断服务函数,按照 led_status 中的值控制 8 个 LED 灯的亮灭。其中,TH0 和 TL0 分别是定时器 0 的高 8 位和低 8 位,用来设置定时器的初值,从而控制定时器中断的时间间隔。
阅读全文