电路CAD交通信号灯的设计.docx
《电路CAD交通信号灯的设计.docx》由会员分享,可在线阅读,更多相关《电路CAD交通信号灯的设计.docx(14页珍藏版)》请在冰点文库上搜索。
![电路CAD交通信号灯的设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/4f5cb8a8-df9b-4c6a-9dac-5851cb7e7ea3/4f5cb8a8-df9b-4c6a-9dac-5851cb7e7ea31.gif)
电路CAD交通信号灯的设计
一、设计任务和要求
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)
{
时间调节部分;
}
elseif(q2==0)
{
南北方向强制控制部分;
}
elseif(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) ;//消除抖动
if(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^5
timegre1
东西绿灯
时间变量
东西绿灯
强制按钮
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^7
B
状态控制
变量2
南北绿灯
时间减少
jj2=P2^4;
表一 输入输出分配及参量定义
3.7实验结果分析
本次程序的编写是在keil4实现的,程序运行过程经过了实物的具体验证,程序能够完成设计目标,达到了设计的具体要求。
四、protel原理图绘制
本次原理图绘制采用的是protel99版本软件。
具体原理图设计见附录二
五、PCB版图设计
本次PCB版图绘制采用的是protel99版本软件。
具体PCB版图见附录二
6、元件清单
项目
规格
数量
封装说明
单片机
STC89C51
1
DIP40
四位共阳数码管
SM410564
1
自建的封装
NPN三极管
9012
4
TO-92A
LED发光二极管
普通规格
4
DIODE0.4T
电阻
4.7k
16
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.单片机接口与原理技术.牛煜光.电子工业出版社
shi=0;
ge=1;
P0=dispcode[q1];
yanshi
(2);
zhuang=1;
zhuang2=1;
shi=1;
ge=0;
P0=dispcode[q2];
yanshi
(2);
zhuang=0;
zhuang2=1;
shi=1;
ge=1;
P0=dispcode[p1];
yanshi
(2);
zhuang=1;
zhuang2=0;
shi=1;
ge=1;
P0=dispcode[p2];
yanshi
(2);
}
//这是在循环指示结构中显示倒计时的
voiddisplay(unsignedcharx)
{
unsignedcharm,n;
m=x/10;
n=x%10;
zhuang=1;
zhuang2=1;
shi=0;
ge=1;
P0=dispcode[m];
yanshi
(2);
zhuang=1;
zhuang2=1;
shi=1;
ge=0;
P0=dispcode[n];
yanshi
(2);}
附录一
#include
unsignedchar codedispcode[]={0xC0,0xF9,0xA4,
0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
bita=0,b=0;
sbitq1=P3^5;
sbitq2=P3^6;
sbitq3=P3^7;
sbitred1=P2^6;
sbitgre1=P2^5;
sbitred2=P2^2;
sbitgre2=P2^1;
sbitzz=P2^0;
sbitjj=P2^3;
sbitzz2=P2^7;
sbitjj2=P2^4;
sbitshi=P1^2;
sbitge=P1^3;
sbitzhuang=P1^0;
sbitzhuang2=P1^1;
sbitceshi1=P3^2;
sbitceshi2=P3^3;
unsignedchar timegre1=24, z_timegre1=10;
unsignedchar z_timegre2=10,timegre2=36;
unsignedcharshan1=5,shan2=5 ;
unsignedinty,s ;
voidyanshi(unsignedinta) //延时函数
{
unsignedcharj;
while(a--)
{
for(j=0;j<50;j++);
}
}
//下面的显示函数是在调节时间时显示时间
voiddispaly2(unsignedchark,unsignedcharj)
{
unsignedcharq1,q2,p1,p2;
q1=j/10;
q2=j%10 ;
p1=k/10;
p2=k%10 ;
zhuang2=1; zhuang=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;
}
while(!
jj2);
}
if(zz2==0)//南北方向时间减少
{yanshi(10);
if(zz2==0)
{
z_timegre2++;
if(z_timegre2<=5)z_timegre2=6;
if(z_timegre2>98)z_timegre2=99;
timegre2=z_timegre2;
}
while(!
zz2);
}
dispaly2(z_timegre1,z_timegre2);
}
elseif(q2==0)//此模式为东西方向强制
{
red1=0;
gre1=1;
gre2=0;
red2=1;
zhuang=0;
ge=1;
shi=1;
P0=dispcode[0];
y=0;
s=0;
}
elseif(q3==0)//此模式为南北方向强制
{
red1=1;
gre1=0;
gre2=1;
voidmain()