自己用单片机做的十字路口交通灯设计_第1页
自己用单片机做的十字路口交通灯设计_第2页
自己用单片机做的十字路口交通灯设计_第3页
自己用单片机做的十字路口交通灯设计_第4页
自己用单片机做的十字路口交通灯设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

交通灯亮的时间,是各地交通警察根据交通流量设置的;

交通灯切换的顺序是:绿--黄--红--绿……(循环);统一约定: A道为主干道(南北干道);B道为支干道(东西干道);A道左转绿(南拐西、北拐东);B道左转绿(西拐北、东拐南);数码管数码管北西南绿直行数码管北黄灯缓红灯停绿左转东图1十字路口交通灯配置示意图LED循环说明:将南北方向允许直行命名为状态1,南北方向允许左转命名为状态2,南北方向行车到东西方向行车的转换阶段命名为状态3,将东西方向允许直行命名为状态4,东西方向允许左转命名为状态5,东西方向行车到南北方向行车的转换阶段命名为状态6。黄灯每隔500ms亮一次,之后灭500ms(亮灭一次叫作闪烁一次1s),一共闪烁5次,持续5s。各个状态之间的变换情况如下:状态1状态1状态2状态3状态4状态5状态6状态1具体显示周期如下:40s20s5s45s状态1状态2状态3状态4状态5状态6南北路口直行绿灯亮左转绿灯亮黄灯亮缓行红灯亮禁行东西路口红灯亮禁行直行绿灯亮左转绿灯亮黄灯亮缓行65s20s20s5s图4写程序时应注意:当东西路口红灯亮禁行的同时,南北路口的状态由状态1->状态2->状态3;当南北路口红灯亮禁行的同时,东西路口的状态由状态4->状态5->状态6;所以应多设两个状态:东西红灯亮状态、南北红灯亮状态,所以总共8种状态;这两个状态比较特殊;因为:东西红灯亮状态与 南北路口的状态1、2、3是同步进行的; 南北红灯亮状态与东西路口的状态4、5、6是同步进行的; 接线说明:数码管上显示数字的连接方式:位选:P1(JP8)与J16用排线连接; 段选:P0(JP10)与J12用排线连接;LED灯的连接方式:P2(JP11)与JP1用排线连接;按键的连接方式:P3(JP9)与JP5用排线连接;中断:T0--定时器/计数器0中断的序号为1,该中断由T0计数器计满回零引起;INT1--外部中断1的序号为2,该中断由P3.3端口线引入,由低电平或下降沿引起;程序流程图:LED红绿灯显示:当P2端口输出高电平,即P2各端口=1时,根据发光二极管的单向导电性可知,这是发光二极管熄灭;当P2各端口输出低电平,即P2各端口=0时,发光二极管亮。通过设置P2口不同时段输出电平的不同来控制发光二极管模拟交通灯的各种状态。8种状态的定义如下:sbitSN_GREEN=P2^0; //南北直走绿灯sbitSN_LEFT_GREEN=P2^1; //南北左转绿灯sbitSN_YELLOW=P2^2; //南北黄灯sbitSN_RED=P2^3; //南北红灯sbitEW_GREEN=P2^4; //东西直走绿灯sbitEW_LEFT_GREEN=P2^5; //东西左转绿灯sbitEW_YELLOW=P2^6; //东西黄灯sbitEW_RED=P2^7; //东西红灯倒计时显示:数码管的显示采用动态共阴数码管的动态显示,通过P1口的P1.0至P1.1控制南北方向的数码管位选信号,P1口的P1.4至P1.5控制东西方向的数码管位选信号,然后通过P0口作为数码管的段选信号,通过位选信号的分时选择来控制数码管的十位,个位分别显示,又由于这期间的扫描间隔时间很短,延时去抖,若延时太长数码管会有闪烁感,所以我们看起来数码管的十位,个位是同时亮的。然后利用定时器倒计时,通过数码管显示出来。紧急模式: sbitK4=P3^3; //紧急模式的按键控制位K4通过在程序里设置外部中断INT1为最高优先级。当检测到有按钮按下时,产生中断,停止刚才的程序,转向中断执行。程序代码: /* 十字路口交通灯控制-----C语言程序 数码管上显示数字的连接方式: 位选:P1(JP8)与J16用排线连接 段选:P0(JP10)与J12用排线连接 LED灯的连接方式:P2(JP11)与JP1用排线连接 按键的连接方式:P3(JP9)与JP5用排线连接*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchardisp_bit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选控制:8个动态共阴数码管的位置uchardisp_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选控制:数码管的LED的字模0-9/*定义控制位*/sbitSN_GREEN=P2^0; //南北直走绿灯sbitSN_LEFT_GREEN=P2^1; //南北左转绿灯sbitSN_YELLOW=P2^2; //南北黄灯sbitSN_RED=P2^3; //南北红灯sbitEW_GREEN=P2^4; //东西直走绿灯sbitEW_LEFT_GREEN=P2^5; //东西左转绿灯sbitEW_YELLOW=P2^6; //东西黄灯sbitEW_RED=P2^7; //东西红灯sbitK4=P3^3; //紧急模式控制位ucharSN_FLAG=0; //南北4个状态标志位,分别为0,1,2,3,默认初值为0ucharEW_FLAG=0; //东西4个状态标志位,分别为0,1,2,3,默认初值为0ucharnum=0; //计算中断1秒所需的次数ucharYELLOW_num=0; //黄灯每隔500ms亮一次,或每隔500ms灭一次(亮灭一次则需1000ms叫作闪烁一次1s),一共闪烁5次,持续5sucharvalue_one=40,value_two=20,value_three=5,value_four=65,value_five=45; //倒计时的值,正常模式ucharvalue_time=0; //倒计时的值,紧急模式voiddelay(uinti); //延时去抖voidSN_display(ucharSN_Time); //显示南北数码管的倒计时voidEW_display(ucharEW_Time); //显示东西数码管的倒计时voidmain(void){ IT1=0; //INT1负跳变触发 TMOD=0x01; //设置定时器0为工作方式1 TH0=(65536-50000)/256;//装初值12M晶振定时50ms数为50000 TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器T0中断 EX1=1; //开外部INT1中断 TR0=1; //启动定时器T0 PX1=1; //中断优先级高 while(1) //等待中断发生 { switch(SN_FLAG) { case0: SN_GREEN=0; //开启南北直走绿灯 SN_display(value_one); //显示南北直走绿灯的倒计时 break; case1: SN_LEFT_GREEN=0; //开启南北左转绿灯 SN_display(value_two); //显示南北左转绿灯的倒计时 break; case2: SN_display(value_three); //显示南北黄灯的倒计时 break; case3: SN_RED=0; //开启南北红灯 SN_display(value_five); //显示南北红灯的倒计时 break; } switch(EW_FLAG) { case0: EW_RED=0; //开启东西红灯 EW_display(value_four); //显示东西红灯的倒计时 break; case1: EW_GREEN=0; //开启东西直走绿灯 EW_display(value_two); //显示东西直走绿灯的倒计时 break; case2: EW_LEFT_GREEN=0; //开启东西左转绿灯 EW_display(value_two); //显示东西左转绿灯的倒计时 break; case3: EW_display(value_three); //显示东西黄灯的倒计时 break; } } }voidT0_time(void)interrupt1 //中断函数{ TH0=(65536-50000)/256; //重装初值是为了确保定时器的每次中断都是50ms TL0=(65536-50000)%256; YELLOW_num++; if(YELLOW_num==10) //若到了10次,50ms*10=500ms时间到,将YELLOW_num清0,重新计时 { YELLOW_num=0; if(SN_FLAG==2) //开启南北黄灯 { SN_YELLOW=~SN_YELLOW; //南北黄灯每隔500ms亮一次,或每隔500ms灭一次 } if(EW_FLAG==3) //开启东西黄灯 { EW_YELLOW=~EW_YELLOW; //东西黄灯每隔500ms亮一次,或每隔500ms灭一次 } } num++; if(num==20) //若到了20次,50ms*20=1s时间到,将num清0,重新计时 { num=0; switch(SN_FLAG) { case0: value_one--; if(value_one==0) //南北直走绿灯的倒计时的初值40减到了0,则将其重新赋值为40 { SN_GREEN=1; //关闭南北直走绿灯 value_one=40; SN_FLAG=1; //转至下一个状态 } break; case1: value_two--; if(value_two==0) //南北左转绿灯的倒计时的初值20减到了0,则将其重新赋值为20 { SN_LEFT_GREEN=1; //关闭南北左转绿灯 value_two=20; SN_FLAG=2; //转至下一个状态 } break; case2: value_three--; if(value_three==0) { SN_YELLOW=1; value_three=5; SN_FLAG=3; } break; case3: value_five--; if(value_five==0) { SN_RED=1; value_five=45; SN_FLAG=0; } break; } switch(EW_FLAG) { case0: value_four--; if(value_four==0) //东西红灯的倒计时的初值65减到了0,则将其重新赋值为65 { EW_RED=1; //关闭东西红灯 value_four=65; EW_FLAG=1; //转至下一个状态 } break; case1: value_two--; if(value_two==0) //东西直走绿灯的倒计时的初值20减到了0,则将其重新赋值为20 { EW_GREEN=1; //关闭东西直走绿灯 value_two=20; EW_FLAG=2; //转至下一个状态 } break; case2: value_two--; if(value_two==0) { EW_LEFT_GREEN=1; value_two=20; EW_FLAG=3; } break; case3: value_three--; if(value_three==0) { EW_YELLOW=1; value_three=5; EW_FLAG=0; } break; } } }voiddelay(uinti) //延时去抖{ uintj=100; for(i;i>0;i--) for(j;j>0;j--);}voidSN_display(ucharSN_Time) //显示南北数码管的倒计时{ ucharshi,ge; shi=SN_Time/10; //十位 ge=SN_Time%10; //个位 //南北数码管的十位 P1=disp_bit[0]; //位选 P0=disp_tab[shi]; //段选 delay(1); //扫描间隔时间,延时去抖,太长数码管会有闪烁感 //南北数码管的个位 P1=disp_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论