找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LED模拟交通灯原理图+仿真+代码(带加减时间按钮)

[复制链接]
跳转到指定楼层
楼主
LED模拟交通灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*********************************************************************************
  2. *                                                                                                                                                                 *
  3. *                           课程设计:交通信号灯控制                                                                             *
  4. *                          要    点:1、十字路口交通灯控制                                                                      *
  5. *                                   2、分别用红、绿、黄发光二级管显示                                             *
  6. *                                    3、红、绿、黄发光二级管显示时间自定                                                 *
  7. *                                4、用PROTEUS仿真                                                                                         *
  8. *                              5、焊接电路板并调试运行                                                                         *
  9. *                          创    新:时间可调,可调范围1~60S                                                                         *                                                                                                                                                                                       
  10. *                          出    品:信息与控制工程学院自动化3班马洪玺                               *                  
  11. *                          时    间:2014年12月                                                                                    *
  12. *                                                                                                                                                                 *
  13. **********************************************************************************/
  14. /************************************程序开始*************************************/                                                                                                                                          
  15. #include <reg51.h>                                                                                                               
  16. #define uchar unsigned char
  17. #define  uint unsigned int

  18. sbit RED_A=P0^0;                         //定义东西方向红灯
  19. sbit YELLOW_A=P0^1;                         //定义东西方向黄灯
  20. sbit GREEN_A=P0^2;                         //定义东西方向绿灯
  21. sbit RED_B=P0^3;                         //定义南北方向红灯
  22. sbit YELLOW_B=P0^4;                         //定义南北方向黄灯
  23. sbit GREEN_B=P0^5;                         //定义南北方向绿灯
  24. sbit add=P3^3;                                 //定义东西绿灯时间加按键
  25. sbit sub=P3^4;                                 //定义东西绿灯时间减按键
  26. sbit K1=P3^2;                                 //定义设定时间按键
  27. sbit add2=P3^5;                             //定义调南北绿灯时间加按键
  28. sbit sub2=P3^6;                             //定义调南北绿灯时间减按键
  29. int time_1=2000,time_2=2000; //定义东西和南北绿灯亮时可调变量并赋予初值2S
  30. uchar Flash_Count=0;                 //黄灯闪烁次数初始为0
  31. Operation_Type=1;                         //从模式1开始
  32. void DelayMS(uint x);                 //延时子函数声明
  33. void Traffic_lignt();                 //交通灯循环亮子程序声明
  34. /************************************主函数************************************/
  35. void main()
  36. {
  37.         P3=0xff;                                 //预读先写1
  38.         EA=1;                                         //打开总中断
  39.         EX0=1;                                         //打开外部中断0
  40.         IT0=0;                                         //触发方式为低电平触发
  41.   
  42.                 while(1)
  43.                 {
  44.                    Traffic_lignt();        
  45.                 }
  46. }
  47. /*********************************延时子程序*************************************/
  48. void DelayMS(uint x)                  //延时ms
  49. {
  50.     uchar t;
  51.     while(x--)
  52.     {
  53.         for(t=120;t>0;t--);
  54.     }
  55. }
  56. /**************************交通灯循环亮程序************************************/
  57. void Traffic_lignt()                 
  58. {
  59.          switch(Operation_Type)
  60.         {
  61.                  case 1:
  62.                         RED_A=1;YELLOW_A=1;GREEN_A=0;                 //东西方向红灯和黄灯灭,绿灯亮
  63.                         RED_B=0;YELLOW_B=1;GREEN_B=1;                 //南北方向绿灯和黄灯灭,红灯亮
  64.                         DelayMS(time_1);                                         //东西方向绿灯延时时间
  65.                         while(K1==0);                                                 //产生中断时可靠停止
  66.                         Operation_Type = 2;                                         //转到模式2
  67.                         break;
  68.                 case 2:
  69.                         GREEN_A=1;                                                         //东西方向绿灯灭
  70.                         DelayMS(200);                                                 //黄灯延时时间
  71.                         while(K1==0);                                                 //产生中断时可靠停止
  72.                         YELLOW_A=~YELLOW_A;                                         //黄灯闪烁
  73.                         if(++Flash_Count !=10)                                  //闪烁10次(亮5次灭5次)
  74.                                 return;
  75.                         Flash_Count=0;                                                 //黄灯闪烁次数清零
  76.                         Operation_Type = 3;                                         //转到模式3
  77.                         break;
  78.                 case 3:
  79.                         RED_A=0;YELLOW_A=1;GREEN_A=1;                 //东西方向仅红灯亮
  80.                         RED_B=1;YELLOW_B=1;GREEN_B=0;                 //南北方向仅绿灯亮
  81.                         DelayMS(time_2);                                     //南北方向绿灯延时时间
  82.                         while(K1==0);                                                 //产生中断时可靠停止
  83.                         Operation_Type = 4;                                         //转到模式4
  84.                         break;        
  85.                 case 4:
  86.                         GREEN_B=1;                                                         //南北方向绿灯灭
  87.                         DelayMS(200);                                                 //黄灯延时时间
  88.                         while(K1==0);                                                 //产生中断时可靠停止
  89.                         YELLOW_B=~YELLOW_B;                                         //黄灯闪烁
  90.                         if(++Flash_Count !=10)                                  //闪烁10次(亮5次灭5次)
  91.                                 return;
  92.                         Flash_Count=0;                                                 //黄灯闪烁次数清零
  93.                         Operation_Type = 1;                                         //转到模式1
  94.                         break;        
  95.         }
  96. }
  97. /*******************************外部中断0子程序**********************************************/
  98. void exter_0() interrupt 0
  99. {
  100.         while(!(add&&sub&&add2&&sub2))                        //扫描是否有按键按下
  101.                 {
  102.                 while(add==0)                                    //如果第一个按键按下东西方向绿灯延续时间加1秒
  103.                                         {
  104.                                             DelayMS(10);
  105.                                                 while(add==0);
  106.                                                 time_1=time_1+1000;
  107.                                                 if(time_1>60000)   //当时间超过60秒将时间置为60秒
  108.                                                 {time_1=60000;}
  109.                                         }
  110.                         while(sub==0)                                   //如果第二个按键按下东西方向绿灯延续时间减1秒
  111.                                         {        
  112.                                                 DelayMS(10);
  113.                                                 while(sub==0);
  114.                                                 time_1=time_1-1000;
  115.                                                 if(time_1<=0)           //当时间减到小于或等于0时将时间置为1秒
  116.                                                 {time_1=1000;}
  117.                                         }
  118.                     while(add2==0)                                   //如果第三个按键按下南北方向绿灯延续时间加1秒
  119.                                         {        
  120.                                                 DelayMS(10);
  121.                                                 while(add2==0);
  122.                                                 time_2=time_2+1000;
  123.                                                 if(time_2>60000)   //当时间超过60秒将时间置为60秒
  124.                                                 {time_2=60000;}
  125.                                         }
  126.                         while(sub2==0)                                   //如果第四个按键按下南北方向绿灯延续时间减1秒
  127.                                         {                                          
  128.                                                 DelayMS(10);
  129.                                                 while(sub2==0);
  130.                                                 time_2=time_2-1000;
  131.                                                 if(time_2<=0)           //当时间减到小于或等于0时将时间置为1秒
  132.                                                 {time_2=1000;}
  133.                                         }
  134.            }
  135. }
  136. /**********************************程序结束*********************************************************/
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-142615-1.html


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

使用道具 举报

沙发
ID:585365 发表于 2021-8-18 17:33 | 只看该作者
太及时了。我刚好要用来参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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