模拟交通控制灯设计.docx
- 文档编号:11050061
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:16
- 大小:188.46KB
模拟交通控制灯设计.docx
《模拟交通控制灯设计.docx》由会员分享,可在线阅读,更多相关《模拟交通控制灯设计.docx(16页珍藏版)》请在冰豆网上搜索。
模拟交通控制灯设计
模拟交通控制灯设计
19
18
9
29
30
31
1
2
3
4
5
6
7
8
交通灯远程控制灯的设计
一、总体设计
1、任务
交通灯的任务要求为:
模拟十字路口的交通灯的亮、灭及闪烁控制及时间显示。
.
基本工作原理:
根据交通灯的亮灭情况,可以分为四种状态,利用定时计数器每5毫秒产生一次中断,完成对LED显示模块的刷新,红绿灯的切换。
通过串口对交通灯进行远程控制,实现pc机和单片机之间的通信程序编写,学习单片机和pc机之间的串口连接方法和编程技巧。
2、要求
设计并实现单片机交通灯控制系统,实现以下三种情况下的交通灯控制。
(1)正常情况下双方向轮流点亮。
(2)
特殊情况时A道运行。
有紧急车辆通行时,AB道均为红灯。
紧急情况优先级高于
特殊情况。
PPP
CONN-D9F
本任务实现用pc机作为控制机、单片机控制信号灯为从机的远程控制系统主从机双方除了要有一定的通信格式,波特率外,还要约定一些握手应答信号即通信协议。
通信协议如下:
主机
OL(单片桃〉
接业応答唁恳
接衣命号
回发应客怕思
01H
diH
UIH
Q3H
■令含紧总情况,嘆求所有方向均为红灯,咒捌解毬曲专
U2H
O2H
02H
命令舎丈:
解除常争.恢里正常立適捋乐订状吉
协议说明;
(1)通过PC键盘输入01H命令'发送给单片机:
单片机收到PC发来的命令后,进入紧急情况状态卩将两个方向的交迪指示灯都变为红灯*再炭送QIH柞为应答信号,PC收到应答信号并在屛幕I显示岀来°
(2)通过PC键盘输入02UJSJ令,境送給单片机:
单片机收到PC发来的命令后’恢复正常交通灯指小状态,并凹送02H作为应答信号*PC屏幕上显示02H.
<3)设置主、从机的波特率为2400伽;掀格式为10位*包括1位起始位、呂位数据位*】位停止位,无校验位.
二、硬件设计
1、根据总体设计要求,确定系统功能接口,设计出系统的电路原理图。
2、若不考虑左行转弯,则南北方向只用红、绿、黄3只灯控制,东西方向也只用红、绿、黄3只灯控制,即共用6只灯。
不必对单片机的I/O口进行扩展。
3、4个共阳极数码管自右至左以两位数的形式显示秒数。
为了保证数码管的亮
度,必须保证输入电流的大小,因此,选用PNP型三极管作为位驱动放大器。
如下图:
敖码电模块
分析可知,三极管相当于反向器,数码管位选低电平有效。
4、按键模拟紧急情况和特殊情况的发生,当si、s2为高电平时(不按按键时)表示正常情况,当si为低电平时表示紧急情况,si信号接至INTO*引脚,s2为低电平时表示特殊情况,s2信号接至INT1*引脚(若为矩阵式键盘,可采用扫描方式识别按键)。
三、软件设计
1、根据图表可以画出各个函数流程图
P1.5
P1.4P
1.3Pi
1.2Pi
1P1.(
)P1
端
口数据
状态说
明
A红
灯
A黄
灯
A绿
灯
B红
灯
B黄
灯
B绿
灯
F3
1
1
0
0
1
0
状态1:
A通行,B禁止
1
1
0,1
交替
变换
0
1
1
EB
状态2:
A绿灯闪,B禁止
1
0
1
0
1
1
状态3:
A警告,
B禁止
0
1
1
1
1
0
DE
状态4:
A禁,B
通
0
1
1
1
0,1
交替
变换
状态5:
A禁,B
闪
0
1
1
1
0
1
DD
状态6:
A禁,B
警告
2、函数流程图
A绿灯B
V
延时
保护
La绿灯B
延-时
A绿灯闪
A红灯’B
延时
B绿灯闪
B黄灯,
恢复
1八J
L-4
关I
中I断丿
保[护
IA红灯B
四、硬件电路图
.ma
L3-*'
IsdJJMy
g4
ro
5
匚
oK
\旷
莎
C
XT
五、源程序
#includevreg51・h>
#defineucharunsignedchar
#defineuintunsignedint
uchar
Ied[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar
DispX[]={0xfb,0xf3,0xfb,0xeb,0xde,0xdf,0xde,0xdd};
voidAFangXing(void);//函数声明
voidShanShuo(uchar*PTR);
voidJingGao(uchar*PTR);
voidBFangXing(void);
voiddelay_5ms(void)〃5ms定时
{
uchari;
for(i=0;i<5;i++)〃T0方式1,定时
1毫秒,循环5次即实现5毫秒定时
{
TH0=0xfc;
TL0=0x18;
TR0=1;//T/C0开始工作
while(!
TF0);
TF0=0;
}
}
voidint_0()interrupt0
{
uinti,x,y,l,m;
EA=0;〃关中断
i=P1;
l=TH1;
m=TL1;
EA=1;
P1=0xdb;for(x=10;x>0;x--){
for(y=100;y>0;y--){
P2=0xf5;
P0=led[x%10];delay_5ms();
P2=0xfa;
P0=led[x/10];〃紧急情况倒计时
delay_5ms();
}
}
EA=0;
P1=i;
TH1=l;
TL1=m;
EA=1;
}
voidint_1()interrupt2//特殊情况中断{
uinti,l,m,x,y;
EA=0;〃关中断
i=P1;
l=TH1;
m=TL1;
EA=1;
P1=0xF3;
for(x=10;x>0;x--){
for(y=100;y>0;y--){
P2=0xf5;
P0=led[x%10];
delay_5ms();
P2=0xfa;
P0=led[x/10];〃特殊情况倒计时
delay_5ms();
}
}
EA=0;
P1=i;
TH1=l;
TL1=m;
EA=1;
}
voidmain()//主函数
{
uchar*PTR=&DispX;
TMOD=0x21;〃工作方式寄存器TMOD用
于选择定时器/计数器的工作模式和工作方式,由TMOD可知,定时器T1工作在方式2,定时器T0工作在方式1
TH1=0xf4;//由波特率为2400kb/s,晶体
频率为11.0592MHz,可知定时器T1的初值,又因为定时器T1采用方式2,8位初值自动重装入
的8位定时器/计数器,故TH1,TL1初值相同
TL1=0xf4;
TR0=1;
TR1=1;
//SCON为串行口控制寄
1,允许串行接收
〃设置波特率SMOD
//IE为中断允许寄存器,允许串
SCON=0x50;
存器,采用方式
PCON=0x00;
IE=0x95;
行口中断,允许外部中断1中断,允许外部中断0中断
IP=0x11;//串行口中断、外部中断
0设定为高优先级中断
IT0=1;//外部中断0的中断请求
信号为边沿触发(下降沿有效)
IT1=1;//外部中断1的中断请求信号为
边沿触发(下降沿有效)
while
(1){
AFangXing();//A道绿灯B道红灯
ShanShuo(PTR);//A绿灯闪烁2次,B道红灯
ShanShuo(++PTR);
ShanShuo(++PTR);
JingGao(++PTR);〃A道黄灯B道红灯
BFangXing();〃B道绿灯A道红灯
ShanShuo(++PTR);//B绿灯闪烁2次,A道红灯
ShanShuo(++PTR);
ShanShuo(++PTR);
JingGao(++PTR);//B道黄灯A道红灯
PTR=&DispX;
}
}
voidAFangXing(void)
{
uchari,j;
P1=0xf3;//A道绿灯B道红灯
for(i=55;i>0;i--)
{
for(j=50;j>0;j--)
{
P2=0xfd;
P0=led[i%10];〃显示A方向秒个位
delay_5ms();
P2=0xfe;
pollednMOW和引Au可啟十mde5)yl5ms();
P2H0X5?
polled口+5)%10M/和引B^->m
de5)yl5ms();
P2uoxfb;
polled口+5)=0」w和引B^十m
de5)yl5ms();
voidshanshuo(ucha:
PTR)
宀
ucha『Lj;
for71;ivo;!
')
宀
PEPTR」
fol-〒25=v;)
宀
P2uoxfd;
polledn%^^和引Au可^->m
de5)yl5ms();
P2=0xfe;
P0=led[i/10];〃显示A方向秒十位delay_5ms();
P2=0xf7;
P0=led[i%10];〃显示B方向个位delay_5ms();
P2=0xfb;
P0=led[i/10];〃显示B方向十位delay_5ms();
}
}
}
voidJingGao(uchar*PTR)
{
uchari,j;
P1=*PTR;
for(i=2;i>0;i--)
{
for(j=50;j>0;j--)
{
P2=0xfd;
P0=led[i%10];〃显示A方向秒个位
delay_5ms();
P2=0xfe;
P0=led[i/10];〃显示A方向秒十位delay_5ms();
P2=0xf7;
P0=led[i%10];〃显示B方向个位delay_5ms();
P2=0xfb;
P0=led[i/10];〃显示B方向十位delay_5ms();
}
}
}
voidBFangXing(void)
{
uchari,j;
P1=0xde;//A道红灯B道绿灯for(i=55;i>0;i--)
{
for(j=50;j>0;j--)
{
P2=0xfd;
P0=led[(i+5)%10];〃显示A方向秒个位delay_5ms();
P2=0xfe;
P0=led[(i+5)/10];〃显示A方向秒十位delay_5ms();
P2=0xf7;
P0=led[i%10];〃显示B方向个位delay_5ms();
P2=0xfb;
P0=led[i/10];〃显示B方向秒十位delay_5ms();
}
}
}
voidserial()interrupt4
{
uchari;
EA=0;
if(RI==1)
{
RI=0;
if(SBUF==0x01)
{
SBUF=0x01;while(!
TI);
TI=0;
i=P1;
P1=0xdb;while(SBUF!
=0x02){
while(!
RI);
RI=0;
}
SBUF=0x02;while(!
TI);
TI=0;
P1=i;
EA=1;
}else
{
EA=1;
}
}
}
六、设计总结
本次实训运用Keil作为编译环境,用Proteus作为仿真软件。
然后将程序下载到自己焊接的硬件电路中。
由于Proteus软件功能的局限性,当仿真电路的数码管位选加上三极管作为驱动放大器时,数码管不能成功显示要显示的数,只显示8888或者9999这两个数,但为了与硬件电路一致,用Proteus仿真时改用非门代替三极管。
当老师给我们布置这个课程设计时,我感到无从下手,不知道该怎样写程序。
后来通过读老师的程序,慢慢明白了,知道了如何去做。
对于这样的课程设计,应该先用Proteus画出仿真电路,然后根据电路图编写程序。
通过编写程序,对单片机C语言有了更进一步的掌握。
经过本次设计对Keil和Proteus更加熟悉了。
在焊接电路的过程中,一定要注意:
不能虚焊,更不能连焊,对某个元件焊接时间不能太长,焊锡不要用太多,容易造成连焊。
电路上电前一定要仔细检查单片机等芯片是否装反,确认无误后再下载程序。
总的来说,通过本次课程设计,学到了很多知识,为以后再用单片机做电路时积累了经验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 交通 控制 设计