找回密码
 立即注册

QQ登录

只需一步,快速开始

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

非常形象的单片机交通灯控制proteus仿真设计 带源程序和原理图

[复制链接]
跳转到指定楼层
楼主
给51黑电子论坛的朋友们分享一个非常形象的单片机交通灯控制设计,下面是仿真原理图:





仿真工程文件及所有完整程序等资料下载地址:
http://www.51hei.com/bbs/dpj-56304-1.html


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

  3. ******************************************************/

  4. #define        uchar        unsigned char
  5. #define        uint        unsigned int
  6. #include        <reg52.h>
  7. /*****定义控制位**********************/
  8. sbit    Time_Show_LED2=P2^5;//Time_Show_LED2控制位
  9. sbit    Time_Show_LED1=P2^4;//Time_Show_LED1控制位
  10. sbit        EW_LED2=P2^3;        //EW_LED2控制位
  11. sbit        EW_LED1=P2^2;        //EW_LED1控制位
  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. sbit    EW_Red=P1^3;//EW红灯
  17. sbit    SN_Red=P1^7;//SN红灯
  18. sbit    EW_ManGreen=P3^0;//EW人行道绿灯
  19. sbit    SN_ManGreen=P3^1;//SN人行道绿灯
  20. sbit    Special_LED=P2^6;//交通正常指示灯
  21. sbit    Busy_LED=P2^7;//交通繁忙指示灯
  22. sbit    Nomor_Button=P3^5;//交通正常按键
  23. sbit    Busy_Btton=P3^6;//交通繁忙按键
  24. sbit    Special_Btton=P3^7;//交通特殊按键  
  25. sbit    Add_Button=P3^3;//时间加
  26. sbit    Reduces_Button=P3^4;//时间减
  27. bit     Flag_SN_Yellow; //SN黄灯标志位
  28. bit     Flag_EW_Yellow;//EW黄灯标志位
  29. char        Time_EW;//东西方向倒计时单元
  30. char        Time_SN;//南北方向倒计时单元
  31. uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
  32. uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
  33. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码
  34. uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码
  35. /**********************延时子程序************************/
  36. void        Delay(uchar         a)
  37.         {
  38.                 uchar        i;
  39.                 i=a;
  40.                 while(i--){;}
  41.         }
  42. /*****************显示子函数**************************/
  43. void        Display(void)
  44.         {
  45.                 char h,l;
  46.                 h=Time_EW/10;
  47.                 l=Time_EW%10;
  48.               P0=table[l];
  49.                 EW_LED2=1;
  50.                 Delay(2);
  51.                 EW_LED2=0;
  52.             P0=table[h];
  53.                 EW_LED1=1;
  54.                 Delay(2);
  55.                 EW_LED1=0;

  56.                 h=Time_SN/10;
  57.                 l=Time_SN%10;
  58.                 P0=table[l];
  59.                 SN_LED2=1;
  60.                 Delay(2);
  61.                 SN_LED2=0;
  62.             P0=table[h];
  63.                 SN_LED1=1;
  64.                 Delay(2);
  65.                 SN_LED1=0;
  66.                

  67.                 h= EW1/10;
  68.                 l= EW1%10;
  69.                 P0=table[l];
  70.                 Time_Show_LED1=1;
  71.                 Delay(2);
  72.         Time_Show_LED1=0;
  73.                 P0=table[h];
  74.                 Time_Show_LED2=1;
  75.                 Delay(2);
  76.             Time_Show_LED2=0;
  77. }
  78. /**********************外部0中断服务程序************************/

  79. void        EXINT0(void)interrupt 0 using 1
  80.         {
  81.                 EX0=0; //关中断

  82. if(Add_Button==0) //时间加
  83.        {
  84.             EW1+=5;
  85.             SN1+=5;
  86.               if(EW1>=100)
  87.                            {
  88.                              EW1=99;
  89.                              SN1=79;
  90.                }
  91.             }
  92. if(Reduces_Button==0) //时间减
  93.        {
  94.             EW1-=5;
  95.             SN1-=5;
  96.             if(EW1<=40)
  97.               {
  98.                              EW1=40;
  99.                  SN1=20;
  100.                }
  101.                                 
  102.                     }

  103. if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
  104.         {
  105.             EW1=60;
  106.             SN1=40;
  107.                         EWL1=19;
  108.                         SNL1=19;
  109.                         Busy_LED=0;//关繁忙信号灯
  110.                         Special_LED =0;//关特殊信号灯
  111.             }
  112. if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
  113.         {
  114.                     EW1=45;
  115.             SN1=30;
  116.                         EWL1=14;
  117.                         SNL1=14;
  118.                         Special_LED=0;//关特殊信号灯
  119.                         Busy_LED=1;//开繁忙信号灯
  120.                
  121.         }
  122. if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
  123.         {
  124.                     EW1=75;
  125.             SN1=55;
  126.                         EWL1=19;
  127.                         SNL1=19;
  128.                         Busy_LED=0;//关繁忙信号灯
  129.                     Special_LED =1;//开特殊信号灯
  130.                   
  131.             }                                       
  132.                 EX0=1;//开中断
  133.         }
  134. /**********************T0中断服务程序*******************/
  135.         void timer0(void)interrupt 1 using 1
  136. {
  137.         static uchar count;
  138.         TH0=(65536-50000)/256;
  139.         TL0=(65536-50000)%256;
  140.         count++;
  141.         
  142.         if(count==10)
  143.         {
  144.           if(Flag_SN_Yellow==1) //测试南北黄灯标志位
  145.           {SN_Yellow=~SN_Yellow;}
  146.           if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  147.           {EW_Yellow=~EW_Yellow;}
  148.         }
  149.         if(count==20)
  150.         {
  151.         Time_EW--;
  152.         Time_SN--;
  153.         if(Flag_SN_Yellow==1)//测试南北黄灯标志位
  154.             {SN_Yellow=~SN_Yellow;}
  155.         if(Flag_EW_Yellow==1)//测试东西黄灯标志位
  156.             {EW_Yellow=~EW_Yellow;}
  157.         count=0;
  158.         }
  159.         
  160. }
  161. /*********************主程序开始**********************/
  162. void        main(void)

  163. {
  164.         Busy_LED=0;
  165.         Special_LED=0;
  166.         IT0=1;        //INT0负跳变触发        
  167.     TMOD=0x01;//定时器工作于方式1
  168.         TH0=(65536-50000)/256;//定时器赋初值
  169.         TL0=(65536-50000)%256;
  170.         EA=1; //CPU开中断总允许
  171.         ET0=1;//开定时中断
  172.         EX0=1;//开外部INTO中断
  173.     TR0=1;//启动定时

  174.      while(1)

  175. {                                /*******S0状态**********/
  176.                                 EW_ManGreen=0;        //EW人行道禁止
  177.                     SN_ManGreen=1;//SN人行道通行
  178.                 Flag_EW_Yellow=0;           //EW关黄灯显示信号
  179.                                 Time_EW=EW;        
  180.                                 Time_SN=SN;               
  181.                                 while(Time_SN>=5)
  182.                             {P1=S[0];         //SN通行,EW红灯
  183.                          Display();}
  184.                                 /*******S1状态**********/
  185.                             P1=0x00;
  186.                                 while(Time_SN>=0)
  187.                            {Flag_SN_Yellow=1;         //SN开黄灯信号位
  188.                             EW_Red=1;      //SN黄灯亮,等待左拐信号,EW红灯
  189.                         
  190.                              Display();
  191.                                 }
  192.                                 /*******S2状态**********/
  193.                             Flag_SN_Yellow=0; //SN关黄灯显示信号
  194.                                 Time_SN=SNL;
  195.                                 while(Time_SN>=5)
  196.                                 {P1=S[2];//SN左拐绿灯亮,EW红灯
  197.                                  Display();}

  198.                           /*******S3状态**********/
  199.                                 P1=0x00;
  200.                                 while(Time_SN>=0)
  201.                            {Flag_SN_Yellow=1;        //SN开黄灯信号位
  202.                             EW_Red=1;      //SN黄灯亮,等待停止信号,EW红灯
  203.                                    
  204.                             Display();}


  205.                            /***********赋值**********/
  206.                                 EW=EW1;
  207.                                 SN=SN1;
  208.                                 EWL=EWL1;
  209.                                 SNL=SNL1;


  210.                                 /*******S4状态**********/
  211.                                 EW_ManGreen=~EW_ManGreen;//EW人行道通行
  212.                     SN_ManGreen=~SN_ManGreen;//SN人行道禁止
  213.                                 Flag_SN_Yellow=0;  //SN关黄灯显示信号
  214.                                 Time_EW=SN;
  215.                                 Time_SN=EW;
  216.                             while(Time_EW>=5)
  217.                             {P1=S[4];         //EW通行,SN红灯
  218.                                  Display();}
  219.                                 /*******S5状态**********/
  220.                                 P1=0X00;
  221.                                 while(Time_EW>=0)
  222.                            {Flag_EW_Yellow=1;//EW开黄灯信号位
  223.                             SN_Red=1;//EW黄灯亮,等待左拐信号,SN红灯        
  224.                             Display();}
  225.                                 /*******S6状态**********/
  226.                                 Flag_EW_Yellow=0;            //EW关黄灯显示信号
  227.                                 Time_EW=EWL;
  228.                                 while(Time_EW>=5)
  229.                                 {P1=S[6];//EW左拐绿灯亮,SN红灯
  230.                                  Display();}

  231.                                 /*******S7状态**********/
  232.                                 P1=0X00;
  233.                                 while(Time_EW>=0)
  234.                            {Flag_EW_Yellow=1; //EN开黄灯信号位
  235.                             SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯        
  236.                             Display();}
  237.                         
  238.                                     /***********赋值**********/
  239.                             EW=EW1;
  240.                                 SN=SN1;
  241.                                 EWL=EWL1;
  242.                                 SNL=SNL1;
  243.                         }

  244.         }
复制代码

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

使用道具 举报

沙发
ID:186567 发表于 2017-5-5 09:10 | 只看该作者
资料真是太棒了,感谢楼主。
回复

使用道具 举报

板凳
ID:186567 发表于 2017-5-5 09:18 | 只看该作者
感谢楼主分享啊。
回复

使用道具 举报

地板
ID:125150 发表于 2018-3-6 21:55 | 只看该作者
下载看看
回复

使用道具 举报

5#
ID:608879 发表于 2020-6-14 12:03 | 只看该作者
太强了,早知道当年做设计就来逛一逛论坛
回复

使用道具 举报

6#
ID:782133 发表于 2020-6-17 20:21 | 只看该作者
太棒了吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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