找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能交通灯仿真和源程序 可设置时间 有人行道显示等功能

  [复制链接]
跳转到指定楼层
楼主
这个仿真图都画了好久,这个交通灯里面可以设置时间,还带人行通道的显示的,还可以让任意两边强行通过。

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



资料包:



单片机源程序如下(一共2个文件一个主程序 一个头文件):
  1. /******************************************************************************
  2. * 文件名称:TRAFFIC.c                                                          
  3. * 功能:十字路口交通灯控制程序:
  4.         正常时,EW方向计时60s,SN方向计时40s
  5.                若按时间加按键(Add_Button)按钮,EW、SN方向各加5s,不可大于99s,79s
  6.             若按时间减按键(Reduces_Button)按键,EW、SN方向各减5s,不可小于40s,20s
  7.                 若按EW方向强制通行(QZ_EW_Btton)按钮,EW方向强制通行,SN方向禁止通行          
  8.                 若按SN方向强制通行(QZ_SN_Btton)按钮,SN方向强制通行,EW方向禁止通行
  9. * 当前版本:1.0
  10. * 作者:YuanDong
  11. * 完成日期:2009年6月18日
  12. ******************************************************************************/
  13.        
  14. #define TRAFFIC_GLOBAL 1  
  15. #include "TRAFFIC.H"  
  16. /********************************************************************************************
  17. * 函数名称:延时子程序
  18. * 功    能:延时,给LED显示的延时时间
  19. * 入口参数:时间参数
  20. * 出口参数:无
  21. *********************************************************************************************/
  22. void        Delay(uchar         a)
  23.         {
  24.                 uchar        i;
  25.                 i=a;
  26.                 while(i--){;}
  27.         }


  28. /********************************************************************************************
  29. * 函数名称:显示子函数
  30. * 功    能:EW方向,SN方向主干道数码管显示驱动
  31. * 入口参数:无
  32. * 出口参数:无
  33. *********************************************************************************************/
  34. void        Display(void)
  35.         {
  36.                 char h,l;
  37.                 h=Time_EW/10;                //EW方向计时的十位数
  38.                 l=Time_EW%10;                //EW方向计时的个位数
  39.               P0=table[l];                //显示EW计时时间的低位
  40.                 EW_LED2=1;
  41.                 Delay(2);
  42.                 EW_LED2=0;
  43.             P0=table[h];                //显示EW计时时间的高位
  44.                 EW_LED1=1;
  45.                 Delay(2);
  46.                 EW_LED1=0;

  47.                 h=Time_SN/10;                //SN方向计时的十位数
  48.                 l=Time_SN%10;                //SN方向计时的个位数
  49.                 P0=table[l];                //显示SN计时时间的低位
  50.                 SN_LED2=1;
  51.                 Delay(2);
  52.                 SN_LED2=0;
  53.             P0=table[h];                //显示SN计时时间的高位
  54.                 SN_LED1=1;
  55.                 Delay(2);
  56.                 SN_LED1=0;
  57.                

  58.                 h= EW1/10;                        //直行时间的十位
  59.                 l= EW1%10;                        //直行时间的个位
  60.                 P0=table[l];                //时间的个位显示
  61.                 Time_Show_LED1=1;
  62.                 Delay(2);
  63.         Time_Show_LED1=0;
  64.                 P0=table[h];                //时间的十位显示
  65.                 Time_Show_LED2=1;
  66.                 Delay(2);
  67.             Time_Show_LED2=0;
  68. }


  69. /********************************************************************************************
  70. * 函数名称:外部0中断服务程序
  71. * 功    能:中断,检测按钮的类别,执行相应的操作;
  72.             若Add_Button==0,通行时间加5s ;
  73.             若Reduces_Button==0,通行时间减5s ;
  74.             若Busy_Btton==0,开繁忙信号灯,关特殊信号灯,通行时间45s,30s;
  75.             若Add_Button==0,关繁忙信号灯,开特殊信号灯,通行时间75s,55s;
  76. * 入口参数:无
  77. * 出口参数:无
  78. *********************************************************************************************/
  79. void        EXINT0(void) interrupt 0 using 0
  80.         {
  81.                 EA = 0;                    //关中断
  82. if(Add_Button==0)                  //时间加
  83.        {
  84.             EW1+=5;                                   //通行时间加5s
  85.             SN1+=5;
  86.               if(EW1>=100)                   //通行时间不得大于100s,80s
  87.                            {
  88.                              EW1=99;
  89.                              SN1=79;
  90.                }
  91.             }
  92. if(Reduces_Button==0)             //时间减
  93.        {
  94.             EW1-=5;                              //通行时间减5s
  95.             SN1-=5;
  96.             if(EW1<=40)                      //通行时间不得小于40s,20s
  97.               {
  98.                              EW1=40;
  99.                  SN1=20;
  100.                }
  101.                     }                
  102.                 EA = 1;                  //开中断
  103.         }

  104. /******************************************************************************
  105. * 函数名称:外部中断1
  106. * 功    能:中断,当遇到紧急情况,需要人工控制时,强制直行的函数处理
  107.            若QZ_EW_Btton按下时,EW方向绿灯亮,SN方向红灯亮 ,并点亮QZ_EW_LED指示灯
  108.                    若QZ_SN_Btton按下时,EW方向红灯亮,SN方向绿灯亮 ,并点亮QZ_SN_LED指示灯
  109. * 入口参数:无
  110. * 出口参数:无
  111. ********************************************************************************/
  112. void EXINT1(void) interrupt 2 using 2
  113. {
  114. EA = 0;  

  115. if(QZ_EW_Btton==0)              //EW方向强制通行按键是否按下
  116.         {            
  117.                         QZ_EW = ~QZ_EW;         //
  118.                         QZ_SN = 0;                                                                          
  119.                         if(QZ_EW)  
  120.                         {QZ_EW_LED = 1;
  121.                          QZ_SN_LED = 0;}
  122.                         else             QZ_EW_LED = 0;
  123.         }
  124. if(QZ_SN_Btton==0)             //测试按键是否按下,按下为特殊状态
  125.         {
  126.                     QZ_SN = ~QZ_SN;
  127.                         QZ_EW = 0;         
  128.                         if(QZ_SN)  
  129.                         {QZ_SN_LED = 1;
  130.                          QZ_EW_LED = 0;}
  131.                         else            
  132.                          QZ_SN_LED = 0;
  133.             }                                      
  134. EA = 1;                         
  135. }


  136. /******************************************************************************
  137. * 函数名称:定时器0中断
  138. * 功    能:作为定时器为交通计时提供时钟信号
  139. * 入口参数:无
  140. * 出口参数:无
  141. ********************************************************************************/
  142.         void timer0(void)interrupt 1 using 1
  143. {
  144.         static uchar count;
  145.         TH0=(65536-50000)/256;
  146.         TL0=(65536-50000)%256;
  147.         count++;
  148.        
  149.         if(count==10)
  150.         {
  151.           if(Flag_SN_Yellow==1)       //测试SN黄灯标志位
  152.           {SN_Yellow=~SN_Yellow;}
  153.           if(Flag_EW_Yellow==1)       //测试EW黄灯标志位
  154.           {EW_Yellow=~EW_Yellow;}
  155.         }
  156.         if(count==20)
  157.         {
  158.         Time_EW--;
  159.         Time_SN--;
  160.         if(Flag_SN_Yellow==1)        //测试SN黄灯标志位
  161.             {SN_Yellow=~SN_Yellow;}
  162.         if(Flag_EW_Yellow==1)        //测试EW黄灯标志位
  163.             {EW_Yellow=~EW_Yellow;}
  164.         count=0;
  165.         }        
  166. }  


  167. /******************************************************************************
  168. * 函数名称:main()
  169. * 功    能:主函数
  170. * 入口参数:无
  171. * 出口参数:无
  172. ********************************************************************************/
  173. void        main(void)

  174. {
  175.         QZ_EW_LED = 0;
  176.         QZ_SN_LED = 0;
  177.         QZ_EW = 0;
  178.         QZ_SN = 0;
  179.         IT0=1;                            //INT0负跳变触发
  180.         IT1=1;                          //INT0负跳变触发       
  181.     TMOD=0x01;                  //定时器工作于方式1
  182.         TH0=(65536-50000)/256;      //定时器赋初值
  183.         TL0=(65536-50000)%256;
  184.         EA=1;                       //CPU开中断总允许
  185.         ET0=1;                      //开定时中断
  186.         EX0=1;                      //开外部INTO中断
  187.         EX1=1;                      //开外部INT1中断
  188.     TR0=1;                      //启动定时

  189.      while(1)

  190. {                                /*******SN通行,EW红灯*** ***************/
  191.                 Flag_EW_Yellow=0;             //EW关黄灯显示信号
  192.                                 Time_EW=EW;       
  193.                                 Time_SN=SN;               
  194.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  195.                             {P1=LIGHT[0];                      //SN通行,EW红灯
  196.                          Display();}
  197.                                 /*******SN黄灯亮,等待左拐信号,EW红灯***/
  198.                             P1=0x00;
  199.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  200.                            {Flag_SN_Yellow=1;                  //SN开黄灯信号位
  201.                             EW_Red=1;                     //SN黄灯亮,等待左拐信号,EW红灯                                  
  202.                              Display();
  203.                                 }
  204.                                 /*******SN左拐绿灯亮,EW红灯*************/
  205.                             Flag_SN_Yellow=0;             //SN关黄灯显示信号
  206.                                 Time_SN=SNL;                                                                 
  207.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  208.                                 {P1=LIGHT[2];                 //SN左拐绿灯亮,EW红灯
  209.                                  Display();}

  210.                           /*******SN黄灯亮,等待停止信号,EW红灯******/
  211.                                 P1=0x00;
  212.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  213.                            {Flag_SN_Yellow=1;                  //SN开黄灯信号位
  214.                             EW_Red=1;                     //SN黄灯亮,等待停止信号,EW红灯                                  
  215.                             Display();}                  

  216.                            /***********赋值**********/
  217.                                 EW=EW1;
  218.                                 SN=SN1;
  219.                                 EWL=EWL1;
  220.                                 SNL=SNL1;

  221.                                 /*******EW通行,SN红灯******************/
  222.                                 Flag_SN_Yellow=0;              //SN关黄灯显示信号
  223.                                 Time_EW=SN;
  224.                                 Time_SN=EW;
  225.                             while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  226.                             {P1=LIGHT[4];                        //EW通行,SN红灯
  227.                                  Display();}

  228.                                 /*****EW黄灯亮,等待左拐信号,SN红灯****/
  229.                                 P1=0X00;
  230.                                 while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
  231.                            {Flag_EW_Yellow=1;               //EW开黄灯信号位
  232.                             SN_Red=1;                       //EW黄灯亮,等待左拐信号,SN红灯       
  233.                             Display();}

  234.                                 /*******EW左拐绿灯亮,SN红灯**********/
  235.                                 Flag_EW_Yellow=0;                    //EW关黄灯显示信号
  236.                                 Time_EW=EWL;
  237.                                 while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  238.                                 {P1=LIGHT[6];                   //EW左拐绿灯亮,SN红灯
  239.                                  Display();}

  240.                                 /****EW黄灯亮,等待停止信号,SN红灯***/
  241.                                 P1=0X00;                                                          
  242.                                 while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
  243.                            {Flag_EW_Yellow=1;               //EW开黄灯信号位
  244.                             SN_Red=1;                       //EW黄灯亮,等待停止信号,SN红灯       
  245.                             Display();}

  246.                                 /*********EW方向强制通行**************/
  247.                                 while(QZ_EW)
  248.                                
  249. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
  1. #include        <reg52.h>
  2. #ifndef TRAFFIC_H
  3. #define TRAFFIC_H  1
  4.    #ifndef TRAFFIC_GLOBAL  
  5.             #define TRAFFIC_EXT extern
  6.    #else       
  7.             #define TRAFFIC_EXT                  
  8.    #endif       
  9. #define        uchar        unsigned char
  10. #define        uint        unsigned int
  11. /*****定义控制位**********************/
  12. sbit    Time_Show_LED2=P2^5;    //Time_Show_LED2控制位
  13. sbit    Time_Show_LED1=P2^4;    //Time_Show_LED1控制位
  14. sbit        EW_LED2=P2^3;                //EW_LED2控制位
  15. sbit        EW_LED1=P2^2;                //EW_LED1控制位
  16. sbit        SN_LED2=P2^1;                //SN_LED2控制位
  17. sbit        SN_LED1=P2^0;                //SN_LED1控制位
  18. sbit    SN_Yellow=P1^6;         //SN黄灯
  19. sbit    EW_Yellow=P1^2;         //EW黄灯
  20. sbit    EW_Red=P1^3;            //EW红灯
  21. sbit    SN_Red=P1^7;            //SN红灯
  22. sbit    QZ_SN_LED=P3^0;         //SN方向强制直行指示灯
  23. sbit    QZ_EW_LED=P3^1;         //EW方向强制直行指示灯       
  24. sbit    Add_Button=P3^4;        //时间加
  25. sbit    Reduces_Button=P3^5;    //时间减
  26. sbit    QZ_EW_Btton=P3^6;       //EW方向强制直行按键
  27. sbit    QZ_SN_Btton=P3^7;       //SN方向强制直行按键
  28. bit     Flag_SN_Yellow;         //SN黄灯标志位
  29. bit     Flag_EW_Yellow;         //EW黄灯标志位
  30. bit     QZ_EW;
  31. bit     QZ_SN;
  32. char        Time_EW;                //东西方向倒计时单元
  33. char        Time_SN;                //南北方向倒计时单元
  34. uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
  35. uchar EW1=60,SN1=40,EWL1=19,SNL1=19;
  36.                                 //用于存放修改值的变量
  37. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  38.                                 //1~~~~9段选码
  39. uchar code LIGHT[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};
  40.                                 //交通信号灯控制

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

所有资料51hei提供下载:
智能交通.rar (39.27 KB, 下载次数: 205)


评分

参与人数 3黑币 +16 收起 理由
mslong + 4 共享资料的黑币奖励!
LQL-LQL + 5 共享资料的黑币奖励!
半路 + 7 画的很形象啊!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-5-19 17:02 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:185367 发表于 2017-5-20 13:49 | 只看该作者
楼主画的很形象啊!
回复

使用道具 举报

地板
ID:271389 发表于 2018-1-4 14:59 | 只看该作者
很全面,很符合现在的交通灯的使用!顶一下
回复

使用道具 举报

5#
ID:207794 发表于 2018-4-16 15:33 | 只看该作者
学习下
回复

使用道具 举报

6#
ID:311092 发表于 2018-4-18 18:13 | 只看该作者
好棒!
回复

使用道具 举报

7#
ID:324142 发表于 2018-5-7 13:31 | 只看该作者
很仿真的图
回复

使用道具 举报

8#
ID:336281 发表于 2018-5-23 14:20 | 只看该作者
谢谢楼主
回复

使用道具 举报

9#
ID:722396 发表于 2020-5-4 01:42 | 只看该作者
学习一下
回复

使用道具 举报

10#
ID:746166 发表于 2020-5-7 15:52 | 只看该作者
没有做消抖处理真的不会出BUG嘛?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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