单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 2
收起左侧

51单片机交通灯proteus仿真和代码(适用于课程设计)

[复制链接]
lzDestiny 发表于 2018-11-22 17:10 | 显示全部楼层 |阅读模式
(分享设计)通过定时器计数,数码管显示倒计时,led灯显示通行状态。按键1功能是在紧急车辆通过时,按下开关,使四个方向均为红灯,放行20S。按键2可改变红绿灯的状态。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

protues仿真图

protues仿真图


单片机源程序如下:
  1. /*****************************************************
  2.        十字路口交通灯控制 C 程序

  3. ******************************************************/
  4. #include        <reg52.h>
  5. #define        uchar        unsigned char
  6. #define        uint        unsigned int
  7. /*****定义控制位**********************/
  8. //东西方向交通灯
  9. sbit        EW_LED2=P2^3;        //EW_LED2控制位
  10. sbit        EW_LED1=P2^2;        //EW_LED1控制位
  11. //南北方向交通灯
  12. sbit        SN_LED2=P2^1;        //SN_LED2控制位
  13. sbit        SN_LED1=P2^0;        //SN_LED1控制位

  14. sbit    SN_Yellow=P1^6;//SN黄灯
  15. sbit    EW_Yellow=P1^2;//EW黄灯

  16. bit     Flag_SN_Yellow; //SN黄灯标志位
  17. bit     Flag_EW_Yellow;//EW黄灯标志位
  18. uchar   flag_EW=0;//EW方向交通管制标志位
  19. uchar   flag_SN=0;//SN方向交通管制标志位
  20. int        Time_EW;//东西方向倒计时单元
  21. int        Time_SN;//南北方向倒计时单元
  22. static uchar count;           //计数用的变量
  23. uchar a,b,c,d,e,f,g;   //保护断点变量
  24. char red_time=30,yellow_time=5,green_time=25; //程序初始化赋值,正常模式
  25. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极段码0~~~~9段选码
  26. uchar code S[5]={0XD7,0XE7,0X7D,0X7E,0x77};//交通信号灯控制代码
  27. /**********************延时子程序************************/
  28. void        Delay(uchar         a)
  29.         {
  30.                 uchar        i;
  31.                 i=a;
  32.                 while(i--){;}
  33.         }
  34. /*****************显示子函数**************************/
  35. void        Display(void)
  36.         {        //显示东西方向交通灯
  37.                 char h,l;
  38.                 h=Time_EW/10;
  39.                 l=Time_EW%10;
  40.               P0=table[l];
  41.                 EW_LED2=1; //东西方向选中个位
  42.                 Delay(2);
  43.                 EW_LED2=0; //清屏
  44.             P0=table[h];
  45.                 EW_LED1=1; //东西方向选中十位
  46.                 Delay(2);
  47.                 EW_LED1=0; //清屏
  48.            //显示南北方向交通灯
  49.                 h=Time_SN/10;
  50.                 l=Time_SN%10;
  51.                 P0=table[l];
  52.                 SN_LED2=1; //南北方向选中个位
  53.                 Delay(2);
  54.                 SN_LED2=0; //清屏
  55.             P0=table[h];
  56.                 SN_LED1=1; //南北方向选中十位
  57.                 Delay(2);
  58.                 SN_LED1=0; //清屏
  59. }
  60. /**********************T0中断服务程序*******************/
  61.         void timer0(void)interrupt 1 using 1
  62. {        
  63.         TH0=(65536-50000)/256;         //定时器定时50ms
  64.         TL0=(65536-50000)%256;
  65.         count++;
  66.         if(count==10)
  67.         { //黄灯闪烁程序
  68.           if(Flag_SN_Yellow==1) //测试南北黄灯标志位
  69.           {SN_Yellow=~SN_Yellow;}
  70.           if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  71.           {EW_Yellow=~EW_Yellow;}
  72.         }
  73.         if(count==20)
  74.         {
  75.         //倒计时
  76.         Time_EW--;
  77.         Time_SN--;
  78.         //黄灯闪烁程序
  79.         if(Flag_SN_Yellow==1)//测试南北黄灯标志位
  80.             {SN_Yellow=~SN_Yellow;}
  81.         if(Flag_EW_Yellow==1)//测试东西黄灯标志位
  82.             {EW_Yellow=~EW_Yellow;}
  83.         count=0;
  84.         }
  85. }
  86. /*********************主程序开始**********************/
  87. void        main(void)
  88. {         
  89.     TMOD=0x01;//定时器工作于方式1
  90.         TH0=(65536-50000)/256;//定时器赋初值
  91.         TL0=(65536-50000)%256;
  92.         EA=1; //CPU开中断总允许
  93.         ET0=1;//开定时中断
  94.     TR0=1;//启动定时
  95.         EX0=1;//外部中断0允许位
  96.         IT0=1;//选择外部中断0是跳沿触发
  97.         EX1=1;//外部中断1允许位
  98.         IT1=1;//选择外部中断1是跳沿触发
  99.         while(1)         
  100.         {                flag_EW=0;//EW方向交通管制标志位                        
  101.                         Flag_EW_Yellow=0;           //EW关黄灯显示信号
  102.                         Time_EW=red_time;                                          
  103.                         Time_SN=green_time;               
  104.                                 while(Time_SN>0)
  105.                             {
  106.                                  P1=S[0];         //SN通行,EW红灯
  107.                              Display();
  108.                                 }
  109.                         /*******黄灯闪烁**********/
  110.                            P1=0xF7;
  111.                         Time_SN=yellow_time;                          //
  112.                                 while(Time_SN>0)
  113.                            {
  114.                             Flag_SN_Yellow=1;         //SN开黄灯信号位                 
  115.                             Display();
  116.                            }
  117.                         
  118.                           flag_SN=0;//SN方向交通管制标志位
  119.                         Flag_SN_Yellow=0;  //SN关黄灯显示信号
  120.                         Time_EW=green_time;
  121.                         Time_SN=red_time;
  122.                             while(Time_EW>0)
  123.                             {P1=S[2];         //EW通行,SN红灯
  124.                                  Display();}
  125.                         /*******黄灯闪烁**********/
  126.                         P1=0X7F;
  127.                         Time_EW=yellow_time;
  128.                                 while(Time_EW>0)
  129.                            {Flag_EW_Yellow=1;//EW开黄灯信号位        
  130.                             Display();}               
  131.         }
  132. }
  133. /*
  134. *********************外部中断0服务程序******************
  135. 紧急情况按下键后四个方向的灯都变为红色并倒计时20秒
  136. */
  137. void int0_int (void) interrupt 0 using 0
  138. {        
  139.         EA=0;
  140.         a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保护断点
  141.         EA=1;
  142.         IP=0x02;
  143.         Time_EW=Time_SN=20;                                          
  144.         while(Time_EW>0)
  145.         {P1=0X77;Display();}                        
  146.         Flag_EW_Yellow=0;                                                                  
  147.         Flag_SN_Yellow=0;
  148.         while(Time_EW==0)
  149.         {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢复现场
  150. }
  151. /**********************外部中断1服务程序******************
  152. 在SN放行期间,若EW有车而SN无车,按下开关K供EW放行15S;
  153. 在EW放行期间,若SN有车而EW无车,按下开关K供SN放行15S。
  154. */
  155. void int1_int (void) interrupt 2  
  156. {
  157.   EA=0;
  158.   a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保护断点
  159.   EA=1;
  160.   IP=0X02;
  161.   if(P1==S[0])
  162.   {
  163.   if(flag_EW==0)
  164.   {
  165.   Time_EW=Time_SN=15;
  166.   while(Time_EW>0)
  167.   {P1=S[2];Display();}                        
  168.   Flag_EW_Yellow=0;                                                                  
  169.   Flag_SN_Yellow=0;
  170.   }
  171.   flag_SN=1;
  172.   }
  173.   if(P1==S[2])
  174.   {
  175.   if(flag_SN==0)
  176.   {
  177.   Time_EW=Time_SN=15;
  178.   while(Time_EW>0)
  179.   {P1=S[0];Display();}                        
  180.   Flag_EW_Yellow=0;                                                                  
  181.   Flag_SN_Yellow=0;
  182.   }
  183.   flag_EW=1;
  184.   }
  185.   while(Time_EW==0)
  186. {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢复现场
  187. }
复制代码

所有资料51hei提供下载:
交通灯.zip (43.53 KB, 下载次数: 71)

评分

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

查看全部评分

回复

使用道具 举报

 楼主| lzDestiny 发表于 2018-11-22 17:10 | 显示全部楼层
有问题的可以交流一下。
回复

使用道具 举报

看到弗拉克 发表于 2019-1-17 22:14 | 显示全部楼层
仿真在哪
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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