找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4231|回复: 1
收起左侧

用51单片机做的交通灯程序+Proteus仿真图

[复制链接]
ID:328656 发表于 2019-3-4 17:30 | 显示全部楼层 |阅读模式
学校的课程设计做的一个小程序,用51单片机做的交通灯。
0.png

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

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


  9. sbit DIN  = P3^0;                                         //MAX7219 DIN引脚
  10. sbit LOAD = P3^1;                                        //MAX7219 LOAD 引脚
  11. sbit CLK  = P3^2;                                         //MAX7219 CLK 引脚

  12. sbit G1 = P0^0;                                        //A线信号灯
  13. sbit Y1 = P0^1;
  14. sbit R1 = P0^2;
  15.                                                                   
  16. sbit G2 = P1^0;                                        //B线信号灯
  17. sbit Y2 = P1^1;
  18. sbit R2 = P1^2;

  19. uchar NS_S,NS_G,EW_S,EW_G;                                                           //AB线数码管个位,十位
  20. uchar NS,EW;
  21. uchar temp=0,i;

  22. uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};                //共阴级数码管数组

  23. void delay(uint i);
  24. void T0_init();
  25. void MAX7219(uchar addr,uchar num);
  26. void MAX7219_init();                       
  27. void display();
  28.                                                          
  29. void delay(uint i)                                                                                 //延时
  30. {
  31.         uint j;
  32.         for(j=0;j<i;j++);
  33. }

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

  65. void MAX7219_init()                                                                         //MAX7219初始化
  66. {                                                                                       
  67.     MAX7219(0x0c,0x01);                                  //正常工作状态
  68.     MAX7219(0x0b,0x03);                                  //设置扫描范围SMG0-3
  69.     MAX7219(0x0a,0x05);                                  //设置亮度11/32
  70.     MAX7219(0x09,0x00);                                  //采用译码方式 ,不译码
  71. }
  72. void display()                                                         //显示函数
  73. {
  74.         NS_S=NS/10;                              //A线十位                     
  75.         NS_G=NS%10;                                                        //A线个位

  76.         EW_S=EW/10;                         //B线十位         
  77.         EW_G=EW%10;                                                        //B线个位

  78.         MAX7219(DIG0,table[NS_S]);          //A线十位,个位        
  79.             MAX7219(DIG1,table[NS_G]);                                       
  80.                    MAX7219(DIG2,table[EW_S]);          //B线十位,个位
  81.             MAX7219(DIG3,table[EW_G]);
  82. }

  83. void main()
  84. {
  85.         T0_init();
  86.         MAX7219_init();
  87.         EA=1;
  88.         NS=15;                                                                  
  89.         EW=18;                                                                  
  90.                    R2=0,G1=0;                                            //初始通行15秒,A线绿灯亮,B线红灯亮
  91.                 while (1)
  92.         {
  93.                 uint k;
  94.                 display();        
  95.                               switch(i)                                                                         //选择信号灯的亮灭方式
  96.                        {
  97.                               case 1: G1=1;Y1=0;                       //关闭A线绿灯,黄灯闪烁
  98.                                       for(k=0;k<3;k++)
  99.                                         {
  100.                                                                         R2=0;
  101.                                               Y1=~Y1;                                                      
  102.                                               delay(10000);
  103.                                            }     
  104.                                                                           R2=1;break;
  105.                               case 2: G2=0,R1=0;break;                    //B线绿灯亮,A线红灯亮
  106.                               case 3: G2=1,Y2=0;                                //关闭B线绿灯,黄灯闪烁
  107.                                       for(k=0;k<3;k++)                       
  108.                                 {
  109.                                                                 R1=0;
  110.                                                Y2=~Y2;
  111.                                     delay(10000);
  112.                                 }
  113.                                                                 R1=1;break;
  114.                               case 4: R2=0,G1=0;break;                        //B线红灯亮,A线绿灯亮
  115.              }                        
  116.          }
  117. }

  118. void T0_(void)interrupt 1                                  //中断
  119. {
  120.           temp++;
  121.           TH0=0XD8;
  122.           TL0=0XF0;
  123.           if(temp==100)                                                          //1s进入
  124.             {
  125.                       temp=0;
  126.                       NS--;
  127.                       EW--;
  128.                      if((NS==0)&&(EW==3))                        //A线倒计时时间结束且B线剩余3s
  129.                        {
  130.                                    NS=3;
  131.                                 EW=3;
  132.                           i=1;
  133.                        }
  134.                      if((NS==0)&&(EW==0)&&(i==1))        //AB线倒计时时间结束且刚结束第一种情况
  135.                  {       
  136.                           NS=18;
  137.                           EW=15;
  138.                           i=2;
  139.                  }
  140.                       if((NS==3)&&(EW==0))                         //B线倒计时时间结束且A线剩余3s
  141.                  {
  142.                                  NS=3;
  143.                                  EW=3;
  144.                           i=3;
  145.                  }
  146.                       if((NS==0)&&(EW==0)&&(i==3))         //AB线倒计时时间结束且刚结束第三种情况
  147.                  {
  148.                           NS=15;
  149.                           EW=18;
  150.                           i=4;
  151.                  }
  152.         }
  153.       display();
  154. }
复制代码

所有资料51hei提供下载:
交通灯.rar (103.78 KB, 下载次数: 58)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:530358 发表于 2019-5-8 17:31 | 显示全部楼层
你好,请问这个芯片除了c51还有个什么芯片?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表