标题: 74HC273拓展单片机IO口40个LED灯显示Proteus仿真程序 [打印本页]

作者: 634967256    时间: 2019-12-16 12:59
标题: 74HC273拓展单片机IO口40个LED灯显示Proteus仿真程序
利用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所示:


单片机源程序如下:
  1. #include<reg52.h>

  2. unsigned char code ledchar[]={                //字模表
  3. 0x00,0x00,0x00,0x00, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0XFF,0XFF,0XFF,0XFF, 0x00,0x00,0x00,0x00, 0x00,0x00       


  4. };
  5. unsigned char flagls =0;   //250ms定时标志         
  6. unsigned char j=1;                  //判断i是否变化
  7. unsigned char cnt =0;          //记录T0中断次数
  8. unsigned char i=0;                  //数组刷新索引

  9. void main()
  10. {
  11.    
  12.    EA = 1; //使能总中断
  13.    TMOD = 0X01;        //T0  为模式1
  14.    TH0 = 0XFC;//为T0赋初值0xfc67,定时1 ms
  15.    TL0 = 0X67;
  16.    ET0 = 1;//使能T0中断
  17.    TR0 = 1;        //启动T0

  18.    while(1)
  19.    {
  20.       if(flagls == 1)         //判断250ms定时标志
  21.       {         
  22.               flagls = 0;         //250ms定时标志清零
  23.                   i++;                         //图片索引自加1
  24.           }
  25.           if(i>17) i=0;         //图片索引达到17后归零
  26.          
  27.            if(i !=j)        //判断i是否变化
  28.            {
  29.             j=i;            //更新备份为当前值,以备进行下次比较
  30.             P0 = 0X00;P1 = 0X00;P1 = 0X01;                //消隐处理
  31.                 P0 = ledchar[i];P1 = 0X00;P1 = 0X01;        //计数值显示到LED上
  32.                   P0 = 0X00;P1 = 0X00;P1 = 0X02;
  33.                 P0 = ledchar[i+1];P1 = 0X00;P1 = 0X02;
  34.                  P0 = 0X00;P1 = 0X00;P1 = 0X04;
  35.                 P0 = ledchar[i+2];P1 = 0X00;P1 = 0X04;
  36.                   P0 = 0X00;P1 = 0X00;P1 = 0X08;
  37.                 P0 = ledchar[i+3];P1 = 0X00;P1 = 0X08;
  38.                   P0 = 0X00;P1 = 0X00;P1 = 0X10;
  39.                 P0 = ledchar[i+4];P1 = 0X00;P1 = 0X10;
  40.                   }
  41.    }
  42.    
  43. }

  44. //定时器0的中断服务函数
  45. void interrupttimer0() interrupt 1
  46. {
  47.    TH0 = 0XFC;                   // 重新加载初值
  48.    TL0 = 0X67;
  49.    cnt++;                          // 中断次数计数值加1
  50.    if(cnt>=250)                 //        中断250次即250ms
  51.    {
  52.       cnt = 0;                 //        清零计数值以重新开始下一250ms计时
  53.           flagls = 1;         //        设置250ms定时标志为1
  54.    }
  55.      
  56. }
复制代码

所有资料51hei提供下载:
拓展IO口40个LED显示.zip (1.5 MB, 下载次数: 56)


作者: 11111111111s    时间: 2020-4-8 14:42
如何可以控制更多的led的灯呢
作者: Mty1111    时间: 2020-10-26 17:14
麻烦问一下那个74HC273的CLK引脚接C51的哪个引脚?那个还有麻烦问一下你这个上面的代码是全部代码吗?
作者: 51hei团团    时间: 2020-10-26 17:21
Mty1111 发表于 2020-10-26 17:14
麻烦问一下那个74HC273的CLK引脚接C51的哪个引脚?那个还有麻烦问一下你这个上面的代码是全部代码吗?

从我从上面下载的原理图来看是接的p1口




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1