您的当前位置:首页电路CAD交通信号灯的设计

电路CAD交通信号灯的设计

2021-01-19 来源:乌哈旅游


一、设计任务和要求

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控制选择设置

本次需要增加了方向传感器和强制按钮以及检测按钮,所以设计嵌套和优先级关系,还有时间调节按钮。它们关系为时间调节按钮最大,强制开关是稍次,其次是检测开关,控制循环结构的跳转,最低的是最基本的灯循环工作结构。对应程序部分如下:

if(q1==0)

{

1

时间调节部分;

}

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;

2

} }

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) ; //消除抖动 if(zz==0) {

按键按下,执行东西方向绿灯时间加动作; }

while(!zz) ; //等待按键的弹起 }

if(jj==0) {

yanshi(10) ; if(jj==0)

3

{

按键按下,执行东西方向绿灯时间减动作; }

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^5 timegre1 东西绿节 灯 控制按时间变钮 量 东西绿q2=P3^6; 东西红灯 red1=P2^6; z_timegre1 东西调灯 节 强制按时间变钮 量 南北绿q3=P3^7; 南北绿灯 gre1=P2^5; timegre2 南北绿风 灯 强制按时间变钮 量 东西车ceshi1 南北红灯 red2=P2^2; z_timegre2 东西调流 =P3^2; 节

4

检测开关 南北车流 检测开关 东西绿灯 时间增加 东西绿灯 时间减少 南北绿灯 时间增加 南北绿灯 时间减少 量 量 时间变ceshi2=P3^3; y 定时辅助循环变量 zz=P2^0; S 烁 绿灯闪定时变jj=P2^3; a 制 状态控标志1 zz2=P2^7 B 制 状态控变量2 jj2=P2^4; 表一 输入输出分配及参量定义 3.7实验结果分析

本次程序的编写是在keil 4实现的,程序运行过程经过了实物的具体验证,程序能够完成设计目标,达到了设计的具体要求。

四、protel原理图绘制

本次原理图绘制采用的是protel99版本软件。 具体原理图设计见附录二

五、PCB版图设计

本次PCB版图绘制采用的是protel99版本软件。 具体PCB版图见附录二

六、元件清单

项目 单片机 四位共阳数码管 NPN三极管 LED发光二极管 电阻 电阻

规格 STC89C51 SM410564 9012 普通规格 4.7k 10k 数量 1 1 4 4 16 6 封装说明 DIP40 自建的封装 TO-92A DIODE0.4T AXIAL0.3 AXIAL0.3 5

按键 电容 晶振 导线 两脚形式 22p 12M 耐流0.5A 6 2 1 若干 RAD0.2 RAD0.2 RAD0.2 七、设计总结

本次设计完成了设计的全部要求,具体的指标都是达到要求的。在数码管显示部分和强制调节以及车流检测部分都是实现了,通过按键方便实用。只采用了一个定时功能,单片机还可以有着很大的扩展性。通过对protel的使用,增加了从产品原理图设计到PCB版图设计的认识,加深了对CAD知识的了解和掌握,设计当中一些小细节,例如元件封装,创建原理图库和PCB封装库等都是很需要细心与耐心的。

另外,本次设计可以提高的地方,我们可以从实际的需求考虑:1、在现实的十字路口中黄灯是肯普遍的,所以可以增加黄灯的部分。2、可以在增加人行道的红绿灯部分,而不仅仅是局限在道路的指示。3、对于道路的通行车流随时段的变化规律进行一种统计计算,自动改变各个道路的通行时间不需要认为的操纵。

通过本设计,还有报告的撰写,虽然条件很多很复杂,但是对于以后的毕业设计写作和论文的写作都是一种提前的锻炼,也大有裨益的。

八、参考文献

1.电路CAD讲义.萧宝瑾.太原理工大学.

2.单片机技术基础教程与实践.夏路易. 电子工业出版社 3.单片机接口与原理技术.牛煜光. 电子工业出版社

6

附录一

#include

shi=0; unsigned char code dispcode[]={0xC0,0xF9,0xA4, ge=1 ; 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; P0=dispcode[q1] ; bit a=0,b=0 ; yanshi(2) ; sbit q1=P3^5; zhuang=1 ; sbit q2=P3^6; zhuang2=1; sbit q3=P3^7;

shi=1; ge=0 ; P0=dispcode[q2] ; yanshi(2) ; zhuang=0 ; zhuang2=1; 7

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() {

if (jj2==0) //南北方向时间增加 TR0=1; //开启定时器 { yanshi(10); ET0=1; //打开定时0中断 if (jj2==0) EA=1; //打开总的中断开关 { TMOD=0x2; //选择定时方式2 z_timegre2--; TH0=0x38; if(z_timegre2<=5) z_timegre2=6 ; TL0=0x38; if(z_timegre2>98) while(1)

z_timegre2=99 ; timegre2=z_timegre2 ; } while(!jj2) ; } if (zz2==0) //南北方向时间减少 { yanshi(10) ; 8

{

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; timegre1=z_timegre1 ; } else { 9

{

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;

10

}

if(s==2500) {

if(a==1&&b==1) //此时为南北方向绿灯闪烁 {

gre2=~gre2 ; }

if(a==0&&b==1) //此时为东西方向绿灯闪烁 {

gre1=~gre1 }

s=0 ; } }

; 附录二

11

图一 protel原理图

12

图二 PCB版图

附录三

图三 实物运行图一

图四 实物运行图二

13

图五 调节两个方向通行时间界面

图六 背面焊接示意图

14

因篇幅问题不能全部显示,请点此查看更多更全内容