找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4532|回复: 8
打印 上一主题 下一主题
收起左侧

基于51单片机做的交通灯最终版

  [复制链接]
跳转到指定楼层
楼主
单片机交通灯  含代码和仿真


单片机源程序如下:
  1. #include        <reg51.h>        
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. /*****定义控制位**********************/
  5. sbit    Time_Show_LED2=P2^5;    //Time_Show_LED2控制位
  6. sbit    Time_Show_LED1=P2^4;    //Time_Show_LED1控制位
  7. sbit        EW_LED2=P2^3;                //EW_LED2控制位
  8. sbit        EW_LED1=P2^2;                //EW_LED1控制位
  9. sbit        SN_LED2=P2^1;                //SN_LED2控制位
  10. sbit        SN_LED1=P2^0;                //SN_LED1控制位
  11. sbit    SN_Yellow=P1^6;         //SN黄灯
  12. sbit    EW_Yellow=P1^2;         //EW黄灯
  13. sbit    EW_Red=P1^3;            //EW红灯
  14. sbit    SN_Red=P1^7;            //SN红灯
  15. sbit    SNleft_led=P2^7;                //南北左拐指示灯
  16. sbit    SNright_led=P2^6;                //南北右拐指示灯
  17. sbit    EWleft_led=P3^1;                //东西左拐指示灯
  18. sbit    EWright_led=P3^0;                //东西右拐指示灯


  19.        
  20. sbit    Add_Button=P3^4;        //时间加
  21. sbit    Reduces_Button=P3^5;    //时间减
  22. sbit    QZ_EW_Btton=P3^6;       //EW方向强制直行按键
  23. sbit    QZ_SN_Btton=P3^7;       //SN方向强制直行按键
  24. bit     Flag_SN_Yellow;         //SN黄灯标志位
  25. bit     Flag_EW_Yellow;         //EW黄灯标志位
  26. bit     QZ_EW;                                        //EW强制通行标志
  27. bit     QZ_SN;                                        //SN强制通行标志
  28. char        Time_EW;                //东西方向倒计时单元
  29. char        Time_SN;                //南北方向倒计时单元
  30. uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
  31. uchar EW1=60,SN1=40,EWL1=19,SNL1=19;
  32.                                 //用于存放修改值的变量
  33. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  34.                                 //0~~~~9段选码
  35. uchar code LIGHT[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};
  36.                                 //交通信号灯控制代码
  37. /*****延时函数**********************/
  38. void        Delay(uchar         a)
  39.         {
  40.        
  41.                 while(a--);
  42.         }


  43. /*****显示函数,显示倒计时的值**********************/
  44. void        Display(void)
  45.         {
  46.                 char h,l;
  47.                 h=Time_EW/10;                //EW方向计时的十位数
  48.                 l=Time_EW%10;                //EW方向计时的个位数
  49.               P0=table[l];                //显示EW计时时间的低位
  50.                 EW_LED2=1;
  51.                 Delay(2);
  52.                 EW_LED2=0;
  53.             P0=table[h];                //显示EW计时时间的高位
  54.                 EW_LED1=1;
  55.                 Delay(2);
  56.                 EW_LED1=0;

  57.                 h=Time_SN/10;                //SN方向计时的十位数
  58.                 l=Time_SN%10;                //SN方向计时的个位数
  59.                 P0=table[l];                //显示SN计时时间的低位
  60.                 SN_LED2=1;
  61.                 Delay(2);
  62.                 SN_LED2=0;
  63.             P0=table[h];                //显示SN计时时间的高位
  64.                 SN_LED1=1;
  65.                 Delay(2);
  66.                 SN_LED1=0;
  67.                

  68.                 h= EW1/10;                        //直行时间的十位
  69.                 l= EW1%10;                        //直行时间的个位
  70.                 P0=table[l];                //时间的个位显示
  71.                 Time_Show_LED1=1;
  72.                 Delay(2);
  73.         Time_Show_LED1=0;
  74.                 P0=table[h];                //时间的十位显示
  75.                 Time_Show_LED2=1;
  76.                 Delay(2);
  77.             Time_Show_LED2=0;
  78. }


  79. /*****外部中断0,用来增加或减少通行时间值**********************/
  80. void        EXINT0(void) interrupt 0
  81.         {
  82.                 EA = 0;                    //关中断
  83. if(Add_Button==0)                  //时间加
  84.        {
  85.             EW1+=5;                                   //通行时间加5s
  86.             SN1+=5;
  87.               if(EW1>=100)                   //通行时间不得大于100s,80s
  88.                            {
  89.                              EW1=99;
  90.                              SN1=79;
  91.                }
  92.             }
  93. if(Reduces_Button==0)             //时间减
  94.        {
  95.             EW1-=5;                              //通行时间减5s
  96.             SN1-=5;
  97.             if(EW1<=40)                      //通行时间不得小于40s,20s
  98.               {
  99.                              EW1=40;
  100.                  SN1=20;
  101.                }
  102.                     }                
  103.                 EA = 1;                  //开中断
  104.         }

  105. /*****外部中断2,用来强制通行**********************/
  106. void EXINT1(void) interrupt 2
  107. {
  108. EA = 0;  

  109. if(QZ_EW_Btton==0)              //EW方向强制通行按键是否按下
  110.       {
  111.              Delay(2);
  112.                   if(QZ_EW_Btton==0)
  113.                    {            
  114.                         QZ_EW = ~QZ_EW;         //
  115.                         QZ_SN = 0;                                                                          
  116.                         }
  117.       }
  118. if(QZ_SN_Btton==0)             //测试按键是否按下,按下为特殊状态
  119.         {
  120.                   Delay(2);
  121.                   if(QZ_SN_Btton==0)
  122.                    {
  123.                     QZ_SN = ~QZ_SN;
  124.                         QZ_EW = 0;         
  125.                    }
  126.             }                                      
  127. EA = 1;                         
  128. }


  129. /*****定时器中断,用来为倒计时单元提供时钟信号**********************/
  130.         void timer0(void)interrupt 1
  131. {
  132.         static uchar count;
  133.         TH0=(65536-20000)/256;
  134.         TL0=(65536-20000)%256;
  135.         count++;
  136.        
  137.         if(count==10)
  138.         {
  139.           if(Flag_SN_Yellow==1)       //测试SN黄灯标志位
  140.           {SN_Yellow=~SN_Yellow;}
  141.           if(Flag_EW_Yellow==1)       //测试EW黄灯标志位
  142.           {EW_Yellow=~EW_Yellow;}
  143.         }
  144.         if(count==20)
  145.         {
  146.         Time_EW--;
  147.         Time_SN--;
  148.         if(Flag_SN_Yellow==1)        //测试SN黄灯标志位
  149.             {SN_Yellow=~SN_Yellow;}
  150.         if(Flag_EW_Yellow==1)        //测试EW黄灯标志位
  151.             {EW_Yellow=~EW_Yellow;}
  152.         count=0;
  153.         }        
  154. }  

  155. /*****主函数**********************/
  156. void        main(void)

  157. {

  158.         QZ_EW = 0;
  159.         QZ_SN = 0;
  160.         IT0=1;                            //INT0负跳变触发
  161.         IT1=1;                          //INT0负跳变触发       
  162.     TMOD=0x01;                  //定时器工作于方式1
  163.         TH0=(65536-50000)/256;      //定时器赋初值
  164.         TL0=(65536-50000)%256;
  165.         EA=1;                       //CPU开中断总允许
  166.         ET0=1;                      //开定时中断
  167.         EX0=1;                      //开外部INTO中断
  168.         EX1=1;                      //开外部INT1中断
  169.     TR0=1;                      //启动定时

  170.      while(1)
  171. {                               
  172.                 /*******SN通行,EW红灯*** ***************/
  173.                 Flag_EW_Yellow=0;             //EW关黄灯显示信号
  174.                                 Time_EW=EW;       
  175.                                 Time_SN=SN;               
  176.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  177.                             {P1=LIGHT[0];                      //SN通行,EW红灯
  178.                                  SNleft_led=0; SNright_led=0;
  179.                                  EWleft_led=0; EWright_led=0;
  180.                          Display();}
  181.                                 /*******SN黄灯亮,等待左拐信号,EW红灯***/
  182.                             P1=0x00;
  183.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  184.                            {Flag_SN_Yellow=1;                  //SN开黄灯信号位
  185.                             EW_Red=1;                     //SN黄灯亮,等待左拐信号,EW红灯
  186.                                  SNleft_led=0; SNright_led=0;
  187.                                  EWleft_led=0; EWright_led=0;                                          
  188.                             Display();
  189.                                 }
  190.                                 /*******SN左拐绿灯亮,EW红灯*************/
  191.                             Flag_SN_Yellow=0;             //SN关黄灯显示信号
  192.                                 Time_SN=SNL;                                                                 
  193.                                 while(Time_SN>=15&QZ_EW == 0&QZ_SN == 0)
  194.                                 {P1=LIGHT[2];
  195.                                  SNleft_led=1; SNright_led=0;
  196.                                  EWleft_led=0; EWright_led=0;    //SN左拐绿灯亮,右拐红灯亮,EW红灯
  197.                                  Display();}
  198.                                 /*******SN黄灯亮,等待右拐信号,EW红灯***/
  199.                                 P1=0x00;
  200.                                 while(Time_SN>=10&QZ_EW == 0&QZ_SN == 0)
  201.                            {Flag_SN_Yellow=1;                  //SN开黄灯信号位
  202.                             EW_Red=1;                     //SN黄灯亮,等待右拐信号,EW红灯       
  203.                                  SNleft_led=1; SNright_led=0;
  204.                                  EWleft_led=0; EWright_led=0;               //SN左拐绿灯亮,右拐红灯亮,EW红灯                          
  205.                             Display();}       

  206.                                  /*******SN右拐绿灯亮,EW红灯*************/
  207.                                                          
  208.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  209.                                 {P1=LIGHT[2];
  210.                                  SNleft_led=0; SNright_led=1;
  211.                                  EWleft_led=0; EWright_led=0;               //SN右拐绿灯亮,左拐红灯亮,EW红灯
  212.                                  Display();}

  213.                           /*******SN黄灯亮,等待停止信号,EW红灯******/
  214.                                 P1=0x00;
  215.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  216.                            {Flag_SN_Yellow=1;                  //SN开黄灯信号位
  217.                             EW_Red=1;                     //SN黄灯亮,等待停止信号,EW红灯       
  218.                                  SNleft_led=0; SNright_led=1;
  219.                                  EWleft_led=0; EWright_led=0;               //SN右拐绿灯亮,左拐红灯亮,EW红灯                          
  220.                             Display();}                  

  221.                            /***********赋值**********/
  222.                                 EW=EW1;
  223.                                 SN=SN1;
  224.                                 EWL=EWL1;
  225.                                 SNL=SNL1;

  226.                                 /*******EW通行,SN红灯******************/
  227.                                 Flag_SN_Yellow=0;              //SN关黄灯显示信号
  228.                                 Time_EW=SN;
  229.                                 Time_SN=EW;
  230.                             while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  231.                             {P1=LIGHT[4];                        //EW通行,SN红灯
  232.                                   SNleft_led=0; SNright_led=0;
  233.                                   EWleft_led=0; EWright_led=0;
  234.                                  Display();}

  235.                                 /*****EW黄灯亮,等待左拐信号,SN红灯****/
  236.                                 P1=0X00;
  237.                                 while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
  238.                            {Flag_EW_Yellow=1;               //EW开黄灯信号位
  239.                             SN_Red=1;                       //EW黄灯亮,等待左拐信号,SN红灯
  240.                                  SNleft_led=0; SNright_led=0;
  241.                                  EWleft_led=0; EWright_led=0;       
  242.                             Display();}

  243.                                 /*******EW左拐绿灯亮,SN红灯**********/
  244.                                 Flag_EW_Yellow=0;                    //EW关黄灯显示信号
  245.                                 Time_EW=EWL;
  246.                                 while(Time_EW>=15&QZ_EW == 0&QZ_SN == 0)
  247.                                 {P1=LIGHT[6];
  248.                                  SNleft_led=0; SNright_led=0;
  249.                                  EWleft_led=1; EWright_led=0;                  //EW左拐绿灯亮,右拐红灯亮,SN红灯
  250.                                  Display();}
  251.                                
  252.                                 /*****EW黄灯亮,等待右拐信号,SN红灯****/
  253.                                 P1=0X00;                                                          
  254.                                 while(Time_EW>=10&QZ_EW == 0&QZ_SN == 0)
  255.                            {Flag_EW_Yellow=1;               //EW开黄灯信号位
  256.                             SN_Red=1;                       //EW黄灯亮,等待右拐信号,SN红灯
  257.                                  SNleft_led=0; SNright_led=0;
  258.                                  EWleft_led=1; EWright_led=0;                 //EW左拐绿灯亮,右拐红灯亮,SN红灯       
  259.                             Display();}

  260.                                 /*******EW右拐绿灯亮,SN红灯**********/
  261.                        
  262.                                 while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  263.                                 {P1=LIGHT[6];
  264.                                  SNleft_led=0; SNright_led=0;
  265.                                  EWleft_led=0; EWright_led=1;                 //EW右拐绿灯亮,左拐红灯亮,SN红灯
  266.                                  Display();}

  267.                                 /****EW黄灯亮,等待停止信号,SN红灯***/
  268. ……………………

  269. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
交通灯再修改.rar (89.4 KB, 下载次数: 68)





评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:342565 发表于 2018-7-9 19:13 | 只看该作者
可以看能不能用到
回复

使用道具 举报

板凳
ID:342565 发表于 2018-7-9 20:53 | 只看该作者
里面含代码和仿真图原理
回复

使用道具 举报

地板
ID:368765 发表于 2018-7-10 15:38 | 只看该作者
很好用哦
回复

使用道具 举报

5#
ID:218113 发表于 2018-7-14 10:32 | 只看该作者
感谢分享
回复

使用道具 举报

6#
ID:89286 发表于 2018-7-25 08:10 | 只看该作者
thanks for sharing
回复

使用道具 举报

7#
ID:649259 发表于 2020-1-2 17:35 来自手机 | 只看该作者
可以看下你的程序流程图吗
回复

使用道具 举报

8#
ID:628175 发表于 2020-1-5 19:56 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ID:692480 发表于 2020-2-12 15:33 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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