标题: 单片机+MAX7219驱动数码管实现交通信号灯的程序和Proteus仿真 [打印本页]

作者: wang0312    时间: 2018-12-6 16:40
标题: 单片机+MAX7219驱动数码管实现交通信号灯的程序和Proteus仿真
51单片机和MAX7219数码管驱动芯片做的交通信号灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


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

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define DIG0 0x01                 // 定义数码管1
  6. #define DIG1 0x02                 // 定义数码管2
  7. #define DIG2 0x03                 // 定义数码管3
  8. #define DIG3 0x04                 // 定义数码管4

  9. void delay(uint i);
  10. void T0_init();
  11. void MAX7219(uchar addr,uchar num);
  12. void MAX7219_init();                        //MAX7219初始化

  13. void display();

  14. sbit DIN=P3^0;                                         //连接MAX7219 DIN引脚
  15. sbit LOAD=P3^1;                                        //连接MAX7219 LOAD 引脚
  16. sbit CLK=P3^2;                                         //连接MAX7219 CLK 引脚


  17. sbit G1=P0^0;                                        //南北红绿灯
  18. sbit Y1=P0^1;
  19. sbit R1=P0^2;
  20.                                                                   
  21. sbit G2=P1^0;                                        //东西红绿灯
  22. sbit Y2=P1^1;
  23. sbit R2=P1^2;

  24. uchar NS_S,NS_G,EW_S,EW_G;
  25. uchar NS,EW;
  26. uchar temp=0,i;

  27. uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,
  28.                                           0x5b,0x5f,0x70,0x7f,0x7b};                //共阴级数码管数组
  29.                                                          
  30. void delay(uint i)
  31. {
  32.         uint j;
  33.         for(j=0;j<i;j++);
  34. }

  35. void T0_init()
  36. {                                                                 //装初值10MS
  37.         TMOD=0X01;
  38.         TH0=0XD8;
  39.         TL0=0XF0;
  40.         ET0=1;
  41.         TR0=1;
  42. }
  43. void MAX_write(uchar ch)                 //以8位一个字节进行写值
  44. {
  45.         uchar j,ads;
  46.     for(j=0;j<8;j++)                            //8位
  47.         {
  48.       ads=ch&0x80;                        //取最高位
  49.       CLK = 0;                        //时钟线置低
  50.       if(ads)  DIN = 1;
  51.       else     DIN = 0;
  52.       ch=ch<<1;                         //左移一位
  53.       CLK=1;                                     //上升沿,DIN的数据写入到7219
  54.     }
  55. }
  56. void MAX7219(uchar addr, uchar num)                //写地址,写数据
  57. {
  58.     LOAD = 0;         
  59.         _nop_();
  60.     MAX_write(addr);
  61.          _nop_();
  62.     MAX_write(num);  
  63.          _nop_();
  64.     LOAD = 1;                                  //锁存
  65. }                                                                           

  66. void MAX7219_init()
  67. {
  68.     MAX7219(0x0c,0x01);                                        //正常状态
  69.     MAX7219(0x0b,0x03);                                        //设置扫描范围DIG0-3
  70.     MAX7219(0x0a,0x05);                                        //设置亮度11/32
  71.     MAX7219(0x09,0x00);                                        //采用译码方式 ,不译码
  72. }
  73. void display()
  74. {
  75.         NS_S=NS/10;                                                         //南北十位,个位
  76.         NS_G=NS%10;

  77.         EW_S=EW/10;                                                         //东西十位,个位
  78.         EW_G=EW%10;

  79.         MAX7219(DIG0,table[NS_S]);                                //南北十位,个位        
  80.     MAX7219(DIG1,table[NS_G]);                                       
  81.     MAX7219(DIG2,table[EW_S]);                                //东西十位,个位
  82.     MAX7219(DIG3,table[EW_G]);
  83. }


  84. void T0_(void)interrupt 1
  85. {
  86.   temp++;
  87.   TH0=0XD8;
  88.   TL0=0XF0;
  89.   if(temp==100)
  90.     {
  91.       temp=0;
  92.       NS--;
  93.       EW--;
  94.           if((NS==0)&&(EW==3))
  95.          {
  96.           NS=3;
  97.           EW=3;
  98.           i=1;
  99.          }
  100.       if((NS==0)&&(EW==0)&&(i==1))
  101.          {
  102.           NS=83;
  103.           EW=80;
  104.           i=2;
  105.          }
  106.      if((NS==3)&&(EW==0))
  107.          {
  108.           NS=3;
  109.           EW=3;
  110.           i=3;
  111.          }
  112.      if((NS==0)&&(EW==0)&&(i==3))
  113.          {
  114.           NS=60;
  115.           EW=63;
  116.           i=4;
  117.          }
  118.         }
  119.         display();
  120. }
  121. void main()
  122. {
  123.         T0_init();
  124.         MAX7219_init();
  125.         EA=1;
  126.         NS=60;                                                                   //初始南北通行60秒
  127.         EW=63;                                                                  
  128.    R2=0,G1=0;                                                             //南北绿灯亮,东西红灯亮
  129. while (1)
  130.         {
  131.                 uint k;
  132.                 display();        
  133.       switch(i)
  134.                {
  135.               case 1:         R2=1,G1=1;                        //关闭南北绿灯,东西红灯
  136.                                                   Y1=0,Y2=0;                        //黄灯闪烁
  137.                       for(k=0;k<3;k++)
  138.                         {
  139.                               Y1=~Y1;
  140.                                                           Y2=~Y2;
  141.                               delay(10000);
  142.                            }        
  143.                                   break;
  144.               case 2: G2=0,R1=0;                         //东西绿灯亮,南北红灯亮
  145.                       break;
  146.               case 3: G2=1,R1=1;
  147.                                             Y1=0,Y2=0;                        //黄灯闪烁
  148.                       for(k=0;k<3;k++)                //循环三次进行延时闪烁
  149.                         {
  150.                               Y1=~Y1;
  151.                                                           Y2=~Y2;
  152.                               delay(10000);
  153.                             }
  154.                                   break;
  155.               case 4: R2=0,G1=0;                         //东西红灯亮,南北绿灯亮
  156.                           break;
  157.              }                        
  158.          }
  159. }
复制代码

所有资料51hei提供下载:
12通信交通灯.zip (66.58 KB, 下载次数: 61)



作者: jjwangxu2008    时间: 2020-3-5 18:36
这个挺好。。。
作者: TJR    时间: 2020-3-7 19:57
您好,我都按着您的搞好了,仿真的时候显示频率太快了
请问下你怎么改呢
作者: TJR    时间: 2020-3-7 19:59
您好,我都按您的搞好了,可以仿真的时候显示频率太快了
这个要怎么改一下呢
或者说我的操作哪一步出错了嘛




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