一、设计任务和要求1.1要求和任务①东西与南北方向灯轮流交替工作,按照下面示意图进行。
图一循环流程图②要求设计中所用的计数器为一个到两个,定时时间最长为4分钟。
在南北向和东西向增加强行绿灯按钮,可以强制某个方向通行而另一个方向禁止。
③路口增加车辆传感器,某方向无车辆时可跳过绿灯时段。
④红绿灯时段长度做成可调的,方便设置通行的时间。
⑤增加译码显示电路,使用数码管显示倒计时。
二、方案选择与论证2.1使用数字逻辑电路使用数字电路需要进行计时电路以及显示电路的设计,元件规模小,电路也可靠,采用状态机方式实现也具有可操作性。
2.2选择使用51单片机控制电路使用51单片机的优点是电路简单,作为本次设计完全具备硬件控制要求,在成本上也与数字逻辑电路相当。
另外,单片机控制方便,电路修改性强,可根据具体的情况修改程序,从而达到更切合实际的效果。
综上,此次我们选择STC89C51单片控制电路实现。
三、单片机资源分配与程序设计3.1一秒定时的实现由于单片最长定时时间为65536us,所以无法需要计数形式的定时。
我们采用方式二定时,一次定时200us,则需要重复5000次,具体定时程序如下:TMOD=0x2; //设置为采用方式二定时TH0=0x38; //赋初值TL0=0x38; //赋初值设置一个变量Y,当Y=5000时,定时器溢出,则开始下一次计时。
这样实现了1s的定时。
3.2控制选择设置本次需要增加了方向传感器和强制按钮以及检测按钮,所以设计嵌套和优先级关系,还有时间调节按钮。
它们关系为时间调节按钮最大,强制开关是稍次,其次是检测开关,控制循环结构的跳转,最低的是最基本的灯循环工作结构。
对应程序部分如下:i f(q1==0){时间调节部分;}else if(q2==0){南北方向强制控制部分;}else if(q3==0){东西方向强制控制部分;}else{基本指示循环工作;}3.3数码管显示倒计时设计本次采用四位数码管,基本的循环指示状态下两位数码管显示倒计时,而在调节时间是,每两位分别显示当前南北和东西的绿灯定时时间。
数码管采用三极管共阳形式接法。
图二数码管驱动原理3.4循环指示工作的实现对于循环工作的实现,本次设计定义了两个标志a和b,共计四种状态。
a=0且b=0时为东西绿灯,南北红灯;a=0,b=1时为东西绿灯闪烁,南北红灯;a=1,b=0时为东西红灯,南北为绿灯;a=1,b=1时为东西红灯,南北绿灯闪。
程序实现如下if(a==0&&b==0){if(timegre1<=5){a=0;b=0;}if(a==0&&b==1){if(timegre1<=0){a=1;b=0;}}if(a==1&&b==0){if(timegre2<=5){a=1;b=1;}}if(a==1&&b==1){if(timegre2<=0){a=0;b=0;}}3.5时间调节的设计针对时间的调节部分,我们采用按键形式,分别定义东西绿灯时间加和减,南北时间加和减,共计四个按键。
采用扫描判断,有低电平来时,认为按键按下,对应数码管显示当前设置的时间。
具体部分程序入下if(q1==0){关闭各个方向的指示灯;if(zz==0){yanshi(10); //消除抖动i f(zz==0){按键按下,执行东西方向绿灯时间加动作;}while(!zz) ; //等待按键的弹起}if(jj==0){yanshi(10) ;if(jj==0)按键按下,执行东西方向绿灯时间减动作;}while(!jj) ;}if (jj2==0){yanshi(10) ;if (jj2==0){按键按下,执行南北方向绿灯时间加动作;}while(!jj2) ;}if (zz2==0){yanshi(10) ;if (zz2==0){按键按下,执行东西方向绿灯时间减动作;}while(!zz2) ;}dispaly2(z_timegre1 ,z_timegre2 ) ; //调用数码管显示函数,同时显示两个方向时间}本次设计完整的程序设计详见附录一。
3.6单片机输入输出端口分配以及基本参数定义有以上分析,我们对单片机的输入输出端口进行分配,还针对控制部分定义参数。
输入部分管脚定义输出部分管脚定义参数定义说明时间调节控制按钮q1=P3^5;东西绿灯gre1=P2^5timegre1东西绿灯时间变量东西绿灯强制按钮q2=P3^6;东西红灯red1=P2^6;z_timegre1东西调节时间变量南北绿风强制按钮q3=P3^7;南北绿灯gre1=P2^5;timegre2南北绿灯时间变量东西车流ceshi1=P3^2;南北红灯red2=P2^2;z_timegre2东西调节检测开关时间变量南北车流检测开关ceshi2=P3^3;y定时辅助循环变量东西绿灯时间增加zz=P2^0;S绿灯闪烁定时变量东西绿灯时间减少jj=P2^3;a状态控制标志1南北绿灯时间增加zz2=P2^7B状态控制变量2南北绿灯时间减少jj2=P2^4;表一输入输出分配及参量定义3.7实验结果分析本次程序的编写是在keil 4实现的,程序运行过程经过了实物的具体验证,程序能够完成设计目标,达到了设计的具体要求。
四、protel原理图绘制本次原理图绘制采用的是protel99版本软件。
具体原理图设计见附录二五、PCB版图设计本次PCB版图绘制采用的是protel99版本软件。
具体PCB版图见附录二六、元件清单项目规格数量封装说明单片机STC89C51 1 DIP40四位共阳数码管SM410564 1 自建的封装NP N三极管9012 4 TO-92ALED发光二极管普通规格 4 DIODE0.4T电阻 4.7k16 AXIAL0.3电阻10k 6 AXIAL0.3按键两脚形式 6 RAD0.2电容22p 2 RAD0.2晶振12M 1 RAD0.2导线耐流0.5A若干七、设计总结本次设计完成了设计的全部要求,具体的指标都是达到要求的。
在数码管显示部分和强制调节以及车流检测部分都是实现了,通过按键方便实用。
只采用了一个定时功能,单片机还可以有着很大的扩展性。
通过对protel的使用,增加了从产品原理图设计到PCB版图设计的认识,加深了对CAD知识的了解和掌握,设计当中一些小细节,例如元件封装,创建原理图库和PCB 封装库等都是很需要细心与耐心的。
另外,本次设计可以提高的地方,我们可以从实际的需求考虑:1、在现实的十字路口中黄灯是肯普遍的,所以可以增加黄灯的部分。
2、可以在增加人行道的红绿灯部分,而不仅仅是局限在道路的指示。
3、对于道路的通行车流随时段的变化规律进行一种统计计算,自动改变各个道路的通行时间不需要认为的操纵。
通过本设计,还有报告的撰写,虽然条件很多很复杂,但是对于以后的毕业设计写作和论文的写作都是一种提前的锻炼,也大有裨益的。
八、参考文献1.电路CAD讲义.萧宝瑾.太原理工大学.2.单片机技术基础教程与实践.夏路易. 电子工业出版社3.单片机接口与原理技术.牛煜光. 电子工业出版社附录一#include <A T89X51.H>unsigned char code dispcode[]={0xC0,0xF9,0xA4, 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };bit a=0,b=0 ;sbit q1=P3^5;sbit q2=P3^6;sbit q3=P3^7; shi=0;ge=1 ;P0=dispcode[q1] ; yanshi(2) ; zhuang=1 ; zhuang2=1;shi=1;ge=0 ;sbit red1=P2^6;sbit gre1=P2^5;sbit red2=P2^2;sbit gre2=P2^1;sbit zz=P2^0;sbit jj=P2^3;sbit zz2=P2^7;sbit jj2=P2^4;sbit shi=P1^2;sbit ge =P1^3;sbit zhuang =P1^0;sbit zhuang2 =P1^1;sbit ceshi1 =P3^2;sbit ceshi2 =P3^3;unsigned char timegre1=24, z_timegre1=10;unsigned char z_timegre2=10,timegre2=36;unsigned char shan1=5,shan2=5 ; unsigned int y,s ;void yanshi(unsigned int a) //延时函数{unsigned char j;while(a--){for (j=0;j<50;j++);}}//下面的显示函数是在调节时间时显示时间void dispaly2(unsigned char k,unsigned char j) {unsigned char q1,q2,p1,p2 ;q1=j/10 ;q2=j%10 ;p1=k/10 ;p2=k%10 ;zhuang2=1; zhuang=1 ;void main(){TR0=1; //开启定时器ET0=1; //打开定时0中断EA=1; //打开总的中断开关TMOD=0x2; //选择定时方式2 TH0=0x38;TL0=0x38;while(1) if (jj2==0) //南北方向时间增加{ yanshi(10);if (jj2==0){z_timegre2--;if(z_timegre2<=5) z_timegre2=6 ;if(z_timegre2>98)z_timegre2=99 ;timegre2=z_timegre2 ;}if(q1==0) //此模式为时间的设置{s=0 ;y=0 ;red1=1 ;gre1=1 ;gre2=1 ;red2=1 ;if(zz==0) //东西方向时间增加{yanshi(10) ;if(zz==0){z_timegre1++;if(z_timegre1<=5) z_timegre1=6 ;if(z_timegre1>98) z_timegre1=99 ; timegre1=z_timegre1 ;}while(!zz) ;}if(jj==0) //东西方向时间减少{yanshi(10) ;if(jj==0){z_timegre1--;if(z_timegre1<=5) z_timegre1=6 ;if(z_timegre1>98) z_timegre1=99 ; timegre1=z_timegre1 ;}while(!jj) ;}red2=0 ;zhuang=0 ;ge= 1 ;shi=1 ;P0=dispcode[1] ;y=0;s=0;}else / /此模式为基本的指示循环结构{if(a==0&&b==0)timegre2=z_timegre2 ; }display(timegre1);}if(a==1&&b==0){if(ceshi2==0&&ceshi1==1) {a=0;b=0;if(ceshi1==0&&ceshi2==1){a=1;b=0;timegre2=z_timegre2 ;}else{red1=1 ;gre1=0 ;gre2=1 ;red2=0 ;if(timegre1<=5){a=0;b=1;}display(timegre1);}}if(a==0&&b==1){red1=1 ;//gre1=~gre1 ;gre2=1 ;red2=0 ;if(timegre1<=0){a=1;b=0;}}void timer0(void) interrupt 1 // 定时函数{y++ ; //1s定时变量s++ ; //绿灯闪烁定时变量if(y==5000) //1s定时时间到,开始减一{timegre1--;timegre2--;shan1--;shan2--;y=0;}if(s==2500){if(a==1&&b==1) //此时为南北方向绿灯闪烁{gre2=~gre2 ;}if(a==0&&b==1) //此时为东西方向绿灯闪烁{gre1=~gre1 ;}s=0 ;}}附录二图一protel原理图图二PCB版图附录三图三实物运行图一图四实物运行图二图五调节两个方向通行时间界面图六背面焊接示意图。