找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5477|回复: 4
收起左侧

智能交通灯仿真与单片机源代码

[复制链接]
ID:258215 发表于 2017-12-13 12:58 | 显示全部楼层 |阅读模式
实现功能:
1.该控制系统能控制东西南北四个路口的红黄绿灯正常工作。东西和南北方向分时准行和禁行。
2.两垂直方向的准行时间均为50s或100s,可以进行控制转换。
3.准行方向亮绿灯与禁行方向亮最后3秒时,四个路口同时加亮一黄灯进行闪烁,以警告车辆及行人,准行方向与禁行方向即将改变。
4.四个道口用数码管显示准行或禁行的剩余时间
5.在交通情况特殊情况下可以通过K1、K2、K3按键对交通灯进行控制。实现:
1)当有紧急情况发生时按下K1四个路口同时加亮黄灯进行闪灯(闪灯时间为3s)且倒计时显示关闭。黄灯闪烁完毕后四路口全变红灯禁行,处理紧急情况。
2)有某方向上车辆过多,可以使用K2、K3键控制东西或南北方向通行,另一方向禁行。按下控制键后先在四个路口加3s的黄灯闪烁。
0.png
单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit k1=P1^6;
  6. sbit k2=P1^7;
  7. sbit k3=P2^7;
  8. sbit yellowled_nb=P1^4;        //南北黄灯
  9. sbit yellowled_dx=P1^1;        //东西黄灯
  10. uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  11. uchar data dig;        //位选
  12. uchar data led;        //偏移量
  13. uchar data buf[4];
  14. uchar data sec_dx=50;//东西数码指示值
  15. uchar data sec_nb=50;//南北数码指示值
  16. uchar data set_timedx=50;
  17. uchar data set_timenb=50;//倒计时设置的键值保存
  18. uchar data b;//定时器中断次数
  19. bit time;//灯状态循环标志
  20. bit int0_time;//中断强行标志
  21. bit set;//调时切换键标志
  22. uint i;
  23. void delay(int ms)
  24. {
  25.         uint j,k;
  26.         for(j=0;j<ms;j++)
  27.                 for(k=0;k<124;k++);
  28. }
  29. void key()
  30. {
  31.         if (k1!=1)        //故障时禁止通行
  32.         {
  33.                 while(k1!=1);
  34.                 TR0=0;
  35.                 for(i=0;i<3;i++)
  36.                 {
  37.          yellowled_dx=1;
  38.                  yellowled_nb=1;
  39.                  delay(500);
  40.                  yellowled_dx=0;
  41.                  yellowled_nb=0;
  42.                  delay(500);
  43.         }
  44.                 P1=0xf6;
  45.                 sec_nb=88;
  46.                 sec_dx=88;
  47.                 int0_time=1;
  48.         }
  49.         if(k2!=1&&set==1)        //切换准行时间100s
  50.         {
  51.                 while(k2!=1);       
  52.                 TR0=0;
  53.                 set_timedx=99;
  54.                 set_timenb=99;
  55.                 sec_dx=99;
  56.                 sec_nb=99;
  57.                 set=0;
  58.         }
  59.         if(k2!=1&&set==0)        //切换准行时间50s
  60.         {
  61.                 while(k2!=1);
  62.                 TR0=0;
  63.                 set_timedx=50;
  64.                 set_timenb=50;
  65.                 sec_dx=50;
  66.                 sec_nb=50;
  67.                 set=1;
  68.         }
  69.         if(k3!=1)        //复位
  70.         {
  71.                 sec_dx=set_timedx;
  72.                 sec_nb=set_timenb;
  73.                 TR0=1;
  74.         }
  75. }
  76. void display()
  77. {
  78.         buf[1]=sec_dx/10; //第1位 东西秒十位
  79.         buf[2]=sec_dx%10; //第2位 东西秒个位
  80.         buf[3]=sec_nb/10; //第3位 南北秒十位
  81.         buf[0]=sec_nb%10; //第4位 南北秒个位
  82.         P0=table[buf[led]];
  83.         delay(2);        //先延时,提前显示一位
  84.         P2=dig;
  85.         dig=_crol_(dig,1);
  86.         led++;
  87.         if(led==4)
  88.         {
  89.                 led=0;
  90.                 dig=0xfe;
  91.         }
  92. }
  93. void main()
  94. {
  95.         TMOD=0x01;       
  96.         TH0=0x3C;
  97.         TL0=0xB0;
  98.         EA=1;
  99.         ET0=1;
  100.         TR0=1;
  101.         EX0=1;
  102.         EX1=1;
  103.         P1=0Xf3;// 东西通行
  104.         while(1)
  105.         {
  106.                 key(); //调用按键扫描程序
  107.                 display(); //调用显示程序
  108.         }       
  109. }
  110. void t0() interrupt 1 using 1  //定时中断子程序
  111. {
  112.         b++;
  113.         if(b==10)          // 定时器中断次数。
  114.         {
  115.                 b=0;
  116.                 sec_dx--;
  117.                 sec_nb--;               
  118.                 if(sec_nb==3&&time==0)
  119.                 {
  120.                         yellowled_nb=1;//南北黄灯亮
  121.             yellowled_dx=1;        //东西黄灯亮
  122.                         delay(500);
  123.                         yellowled_nb=0;
  124.             yellowled_dx=0;
  125.                 }
  126.                 if(sec_nb==2&&time==0)
  127.                 {
  128.                         yellowled_nb=1;//南北黄灯亮
  129.             yellowled_dx=1;        //东西黄灯亮
  130.                         delay(500);
  131.                         yellowled_nb=0;
  132.             yellowled_dx=0;
  133.                 }
  134.                 if(sec_nb==1&&time==0)
  135.                 {
  136.                      yellowled_nb=1;//南北黄灯亮
  137.             yellowled_dx=1;        //东西黄灯亮
  138.                         delay(500);
  139.                         yellowled_nb=0;
  140.             yellowled_dx=0;
  141.                 }                 
  142.                 //东西黄灯闪判断            
  143.                 if(sec_dx==3&&time==1)
  144.                 {
  145.                         yellowled_nb=1;//南北黄灯亮
  146.             yellowled_dx=1;        //东西黄灯亮
  147.                         delay(500);
  148.                         yellowled_nb=0;
  149.             yellowled_dx=0;
  150.                 }                
  151.                 if(sec_dx==2&&time==1)
  152.                 {
  153.                         yellowled_nb=1;//南北黄灯亮
  154.             yellowled_dx=1;        //东西黄灯亮
  155.                         delay(500);
  156.                         yellowled_nb=0;
  157.             yellowled_dx=0;
  158.                 }
  159.                 if(sec_dx==1&&time==1)
  160.                 {
  161.                         yellowled_nb=1;//南北黄灯亮
  162.             yellowled_dx=1;        //东西黄灯亮
  163.                         delay(500);
  164.                         yellowled_nb=0;
  165.             yellowled_dx=0;
  166.                 }       
  167.                 if(sec_dx==0||sec_nb==0) //东西或南北先到达1S时即开始重新计时
  168.                 {
  169.                         sec_dx=set_timedx;
  170.                         sec_nb=set_timenb; //第一次循环结束重置
  171.                         if(time==1)
  172.                         {
  173.                                 P1=0xF3;  //东西通行
  174.                         }
  175.                         else
  176.                         {
  177.                                 P1=0xde; //南北通行
  178.                         }
  179.                         time=!time;   //取反
  180.                 }
  181.         }
  182. }
  183. void nb1() interrupt 2 using 1          //南北通行 东西禁行
  184. {
  185.         TR0=0;
  186.         for(i=0;i<3;i++)
  187.         {
  188.      yellowled_dx=1;
  189.          yellowled_nb=1;
  190.          delay(500);
  191.          yellowled_dx=0;
  192.          yellowled_nb=0;
  193. ……………………

  194. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
智能交通灯.rar (70.96 KB, 下载次数: 185)

评分

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

查看全部评分

回复

使用道具 举报

ID:775597 发表于 2020-6-10 22:01 | 显示全部楼层
还是可以的,没有错误
回复

使用道具 举报

ID:782992 发表于 2020-6-18 11:33 | 显示全部楼层
和我们设计差不多,有用
回复

使用道具 举报

ID:781006 发表于 2020-6-26 20:30 | 显示全部楼层
程序和仿真图都没有错,很好
回复

使用道具 举报

ID:796809 发表于 2020-7-4 12:01 | 显示全部楼层
仿真跟内容不一样
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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