找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4160|回复: 0
收起左侧

带紧急开关的51单片机十字路口交通灯的Proteus仿真+代码设计

[复制链接]
ID:447814 发表于 2018-12-17 11:33 | 显示全部楼层 |阅读模式
利用51单片机对十字路口交通灯进行设计,东西方向和南北方向都为三十秒,分别设计三个按键进行时间控制。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
捕获.PNG

单片机源程序如下:
  1. #include<reg52.h>
  2. #include"delay.h"


  3. /*************************函数声明**************************/
  4. void show();          //显示函数
  5. void init();
  6. /************************端口定义**************************/
  7. sbit k1=P3^7;         //        K1  时间加
  8. sbit k2=P3^6;         //        K2  时间减
  9. sbit k3=P3^5;         //        K3  暂停,确认

  10. sbit led_red_a=P2^0;         //        
  11. sbit led_red_b=P2^2;         //
  12. sbit led_green_a=P2^1;         //        
  13. sbit led_green_b=P2^3;         //

  14. sbit WX_a_1=P2^4;             //        
  15. sbit WX_a_2=P2^5;             //
  16. sbit WX_b_1=P2^6;             //        
  17. sbit WX_b_2=P2^7;             //
  18. /************************变量定义**************************/
  19. char temp1 = 30;          // 初始红绿灯时间
  20. uchar temp2;          //产生1秒 计数变量
  21. uchar temp4=30;          //存储时间更改变量

  22. uchar flag1=0;                  //a,b,两个方向红路灯切换标志
  23. uchar flag2=0;                  //暂停标志
  24. /**********************数组定义***************************/
  25. uchar tab_dx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴,不带小数点

  26. /************************显示**************************/
  27. void show()
  28. {        
  29.          
  30.           if(flag1==0)                         //a  红灯亮 绿灯灭       b        红灯灭 绿灯亮
  31.            {  
  32.               led_red_a=0;               
  33.           led_red_b=1;         
  34.           led_green_a=1;         
  35.           led_green_b=0;         
  36.            }
  37.           else                                   //a  红灯灭 绿灯亮        b        红灯亮 绿灯灭
  38.            {
  39.               led_red_a=1;               
  40.           led_red_b=0;         
  41.           led_green_a=0;         
  42.           led_green_b=1;
  43.            }
  44.                         

  45.           if(flag1==0)
  46.           {
  47.                  WX_a_1=1;            
  48.              WX_a_2=1;            
  49.              WX_b_1=1;                     
  50.              WX_b_2=0;
  51.                                                         
  52.          P0=tab_dx[temp1%10];
  53.              delayxms(3);
  54.              P0=0x00;

  55.                  WX_a_1=1;            
  56.              WX_a_2=1;            
  57.              WX_b_1=0;                     
  58.              WX_b_2=1;
  59.          
  60.          P0=tab_dx[temp1/10];
  61.              delayxms(3);
  62.              P0=0x00;
  63.           }        
  64.           else
  65.           {
  66.                WX_a_1=1;            
  67.              WX_a_2=0;            
  68.              WX_b_1=1;                     
  69.              WX_b_2=1;
  70.                                                         
  71.          P0=tab_dx[temp1%10];
  72.              delayxms(3);
  73.              P0=0x00;

  74.                  WX_a_1=0;            
  75.              WX_a_2=1;            
  76.              WX_b_1=1;                     
  77.              WX_b_2=1;
  78.          
  79.          P0=tab_dx[temp1/10];
  80.              delayxms(3);
  81.              P0=0x00;
  82.          }                        
  83. }
  84. /************************显示1**************************/
  85. void show_1()
  86. {        
  87.                  static uchar kk;
  88.          kk++;

  89.              led_red_a=0;               
  90.          led_red_b=0;         
  91.          led_green_a=1;         
  92.          led_green_b=1;         

  93.                  WX_a_1=1;            
  94.              WX_a_2=1;            
  95.              WX_b_1=1;                     
  96.              WX_b_2=0;
  97.                                                         
  98.          P0=tab_dx[temp4%10];
  99.              delayxms(kk/126);
  100.              P0=0x00;

  101.                  WX_a_1=1;            
  102.              WX_a_2=1;            
  103.              WX_b_1=0;                     
  104.              WX_b_2=1;
  105.          
  106.          P0=tab_dx[temp4/10];
  107.              delayxms(kk/126);
  108.              P0=0x00;
  109.          
  110.                WX_a_1=1;            
  111.              WX_a_2=0;            
  112.              WX_b_1=1;                     
  113.              WX_b_2=1;
  114.                                                         
  115.          P0=tab_dx[temp4%10];
  116.              delayxms(kk/126);
  117.              P0=0x00;

  118.                  WX_a_1=0;            
  119.              WX_a_2=1;            
  120.              WX_b_1=1;                     
  121.              WX_b_2=1;
  122.          
  123.          P0=tab_dx[temp4/10];
  124.              delayxms(kk/126);
  125.              P0=0x00;               
  126. }

  127. /************************按键检测**************************/
  128. void key()
  129. {               
  130.                   if(k1==0)           //时间加
  131.            {
  132.                  delayxms(10);
  133.                  while(k1==0) ;
  134.                  temp4++;
  135.                  temp1=temp4;
  136.                  if(temp4==91)
  137.                   {
  138.                    temp4=0;
  139.                   }
  140.            }

  141.                    if(k2==0)         //          时间减
  142.            {
  143.                  delayxms(10);
  144.                  while(k2==0);
  145.                  temp4--;
  146.                  temp1=temp4;
  147.                  if(temp4==-1)
  148.                   {
  149.                    temp4=90;
  150.                   }
  151.            }

  152.            if(k3==0)                     // 暂停,确认
  153.            {
  154.                  delayxms(10);
  155.                  while(k3==0);
  156.                  flag2=~flag2;
  157.            }
  158. }

  159. /************************中断初始化**************************/
  160. void init()
  161. {
  162.       TMOD=0x11;              //设置定时器0,1为工作方式1
  163.           TH0=(65536-50000)/256;  //初值
  164.           TL0=(65536-50000)%256;
  165. //          TH1=(65536-50000)/256;  //初值
  166. //          TL1=(65536-50000)%256;
  167.           EA=1;                   //打开中断总开关
  168.           ET0=1;                  //开定时器0中断
  169. //          ET1=1;                                  //开定时器1中断
  170.           TR0=1;                  //启动定时器0   
  171.           EX0 = 1;                /* 允许外部中断0中断 */
  172.       PX0 = 1;                /* 外部中断0为高优先级 */
  173. }
  174. /************************************************************
  175.                    主函数
  176. *************************************************************/
  177. void main()
  178. {
  179.    init();  

  180.    while(1)
  181.         {
  182.            key();

  183.            if(flag2==0)
  184.            {   
  185.                TR0=1;
  186.                       show();  //显示函数
  187.            }

  188.            else
  189.            {
  190.                TR0=0;
  191.                       show_1();  //显示函数
  192.            }
  193.           }
  194. }

  195. /* ----------------- t0中断函数 ----------------- */
  196. void time1() interrupt 1                                               
  197. {

  198.   TH0=(65536-50000)/256;  //
  199.   TL0=(65536-50000)%256;

  200.   temp2++;
  201.   if(temp2 == 20)
  202.   {         
  203.      temp2=0;
  204.          temp1=temp1-1;
  205.          if(temp1==-1)  
  206.          {
  207.                  temp1=temp4;
  208.                  flag1=~flag1;
  209.          }
  210.    }  
  211.   
  212. }

  213. /* ----------------- 外部中断函数 ----------------- */
  214. int0_srv( ) interrupt 0 using 2
  215.   {
  216.     uchar a,b,c,d;

  217.     int i;
  218.         for (i = 0;i<10000;i++);

  219.         if ( INT0 ==0)
  220.         {
  221.          a=led_red_a;                 //保留指示灯状态
  222.          b=led_red_b;         
  223.          c=led_green_a;         
  224.          d=led_green_b;
  225.            while(INT0==0)
  226.            {         
  227.              led_red_a=0;               
  228.          led_red_b=0;         
  229.          led_green_a=1;         
  230.          led_green_b=1;              /* 使两边亮起红灯 */

  231.            if(flag1==0)
  232.           {
  233.                  WX_a_1=1;            
  234.              WX_a_2=1;            
  235.              WX_b_1=1;                     
  236.              WX_b_2=0;
  237.                                                         
  238.          P0=tab_dx[temp1%10];
  239.              delayxms(3);
  240.              P0=0x00;

  241.                  WX_a_1=1;            
  242.              WX_a_2=1;            
  243.              WX_b_1=0;                     
  244.              WX_b_2=1;
  245.          
  246. ……………………

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

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

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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