利用51单片机设计多于40个LED的流水灯,其中LED静态显示。 本设计是以51系单片机STC89C52作为控制中心的40个LED流水灯显示,硬件方面利用锁存器74HC273、40个LED流水灯等组件,实现带有点阵图片的LED流水灯显示,通过定时器控制LED灯的刷新频率。利用数电知识进行LED显示扩展I/O。软件程序使用Keil进行编程,STC—ISP进行写入。程序中使用定时器0进行中断,并在中断内完成点阵动态刷新,实现40LED的静态显示的目的。此单片机LED流水灯有着价格适中、电路设计简单的特点。
74HC273带锁存功能,这样D输入的信号可以锁住保持在输出端,保持LED的驱动是固定的电平状态。脉冲输出信号也可以驱动LED,只是亮度与脉冲的脉宽有关。一般74HC273 的输入端接在数据总线上,74HC273可以起到隔离的作用。动LED一般需要5-7mA的电流,负载比较大,如果接到其他门电路的输出上,会影响这个输出驱动其他门电路输入的能力。
在主程序中,先使能全局中断,然后使能74HC27来然后使能74HC273来控制LED点阵。配置定时器0工作在模式1并设置定时初值,清零TF位,使能定时器0并启动定时器0。在while(1)循环中更新锁存器数据,进入中断后定时250ms。主程序流程图如图5所示:
中断子程序中,定时器T 0中断250次,即定时250ms,flagls 赋值为1。定时器中断流程图如图6所示:
单片机源程序如下:
- #include<reg52.h>
- unsigned char code ledchar[]={ //字模表
- 0x00,0x00,0x00,0x00, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0x00,0x00,0x00,0x00, 0x00,0x00
- };
- unsigned char flagls =0; //250ms定时标志
- unsigned char j=1; //判断i是否变化
- unsigned char cnt =0; //记录T0中断次数
- unsigned char i=0; //数组刷新索引
- void main()
- {
-
- EA = 1; //使能总中断
- TMOD = 0X01; //T0 为模式1
- TH0 = 0XFC;//为T0赋初值0xfc67,定时1 ms
- TL0 = 0X67;
- ET0 = 1;//使能T0中断
- TR0 = 1; //启动T0
- while(1)
- {
- if(flagls == 1) //判断250ms定时标志
- {
- flagls = 0; //250ms定时标志清零
- i++; //图片索引自加1
- }
- if(i>17) i=0; //图片索引达到17后归零
-
- if(i !=j) //判断i是否变化
- {
- j=i; //更新备份为当前值,以备进行下次比较
- P0 = 0X00;P1 = 0X00;P1 = 0X01; //消隐处理
- P0 = ledchar[i];P1 = 0X00;P1 = 0X01; //计数值显示到LED上
- P0 = 0X00;P1 = 0X00;P1 = 0X02;
- P0 = ledchar[i+1];P1 = 0X00;P1 = 0X02;
- P0 = 0X00;P1 = 0X00;P1 = 0X04;
- P0 = ledchar[i+2];P1 = 0X00;P1 = 0X04;
- P0 = 0X00;P1 = 0X00;P1 = 0X08;
- P0 = ledchar[i+3];P1 = 0X00;P1 = 0X08;
- P0 = 0X00;P1 = 0X00;P1 = 0X10;
- P0 = ledchar[i+4];P1 = 0X00;P1 = 0X10;
- }
- }
-
- }
-
- //定时器0的中断服务函数
- void interrupttimer0() interrupt 1
- {
- TH0 = 0XFC; // 重新加载初值
- TL0 = 0X67;
- cnt++; // 中断次数计数值加1
- if(cnt>=250) // 中断250次即250ms
- {
- cnt = 0; // 清零计数值以重新开始下一250ms计时
- flagls = 1; // 设置250ms定时标志为1
- }
-
- }
复制代码
所有资料51hei提供下载:
拓展IO口40个LED显示.zip
(1.5 MB, 下载次数: 56)
|