交通灯控制系统设计报告Word文档下载推荐.docx
《交通灯控制系统设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《交通灯控制系统设计报告Word文档下载推荐.docx(27页珍藏版)》请在冰点文库上搜索。
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
引脚功能:
AT89C52为8位通用微处理器,准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
2.交通灯控制系统设计
原理方框图
交通灯时间显示部分
AT89C52
电源
工作原理
由软件设置交通灯的初始时间,南北方向通行20秒,东西方向通行15秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的燃亮与熄灭。
采用中断方式实现按键的功能。
整体系统分析
1.总体流程图(实现各种状态间的转换):
2.相关参数计算
时间显示每一秒减一,定时50ms,每20次减一
T0的计数初值:
M=65536-50000=15536=3CB0H
3.程序流程图
Y
N
YY
N
Y
4.仿真硬件连接电路图:
5.仿真结果
初始状态:
东南西北都为红灯,时间6秒
状态0:
南北方向绿灯亮,东西方向红灯亮
状态1:
南北方向黄灯闪烁,东西方向红灯亮
状态2:
南北方向红灯亮,东西方向绿灯亮
状态3:
南北方向黄灯亮,东西方向黄灯闪烁
紧急情况:
K3按下,东南西北四个方向都为红灯
6.仿真结果分析
仿真实验实现南北方向车道和东西方向车道两条交叉道路的车辆交替运行,南北方向(主干道)每次通行时间设为20秒、东西方向通行时间设为15秒,时间可以在程序中修改。
同时能够实现红灯、黄灯、绿灯状态转换,红绿灯转换时间为6秒,转黄期间黄灯亮。
可以准确显示每个状态所剩余的时间,按下禁行普通车辆键K3,东西南北方向都亮红灯;
按下南北放行键K0,南北绿灯亮,东西红灯亮;
按下东西放行键K1,东西绿灯亮,南北红灯亮;
任何状态下,按复位电路中的复位键,此系统都将回到初始状态;
按当紧急状况出现时,按下紧急开关,可实现主干道和支干道全部禁止通行,允许紧急车辆安全通行;
按下时间设置键K4一次,实现通行时间加,按K0南北通行时间加,按K1东西通行时间加,按返回键K2,以新设置的时间进行运行;
按下时间设置键K4二次,实现通行时间减,按K0南北通行时间减,按K1东西通行时间减,按返回键K2,以新设置的时间进行运行;
按下时间设置键K4三次,回复初始通行时间;
实现了课程设计的要求。
四.设计心得
在这次课程设计中,我们首先对所选课题进行相关资料的查询,其次进行电路设计以及proteus仿真,在编程实现程序控制,在proteus中调试成功以后,购买器材完成电路连接。
其中,最重要的是程序的编写,在了解单片机芯片的构造及性能的基础上,利用C语言进行编程,其中最主要的是利用了循环、条件和函数调用。
感觉到C语言函数功能的强大和简便,并且认识到C语言在学习和工作中的重要性。
在proteus仿真时,熟悉了仿真环境,利用其仿真工具连接交通灯电路,下载程序到单片机芯片上实现仿真结果,并把它用电子器件在面包板上实现,在这过程中出现了一些问题:
(1)对C语言的编程环境和仿真环境不是太了解,把交通灯运用C语言实现花费了大量的精力和时间。
(2)在仿真时,出现错误后,对于找出程序错误并修改仿真电路加大了一定的难度。
(3)在面包板上连接好电路后,并没有预期的结果。
在遇到以上问题后,我们查找相关资料和询问指导老师,克服了困难,最后完成了这次的程设计。
在这过程中,体会到了实践的重要性,感觉理论知识是要结合实践才能真正的掌握,团结在整个过程中起到了关键的作用,加强了我们的实践和团结意识,锻炼了我们的动手能力,掌握了一些元器件的性能和用法,虽然,我们在这次课程设计中选的课题简单,但是,我们的收获却很大,希望在以后的学习和工作中,能得到更多的实践经验,尤其是锻炼我们的自我意识,无论做什么事,都要自己去尝试并努力完成,是享受其过程而不是结果。
#include<
AT89X51.H>
#defineucharunsignedchar/*定义字符串类型为无符号型*/
ucharcodea[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharcodeb[4]={0x02,0x01,0x08,0x04};
/****P2口,低有效*/
ucharcodec[4]={0xDE,0xDD,0xF3,0xEB};
/****P1口,低有效*/
charSN=20,WE=26;
charSN_G=20,WE_G=15,Y=6;
uchari,k=0,count=0;
intn=0;
voiddelay(uchart);
/*定义函数*/
voidlight();
/*定义函数*/
voidled();
/*定义函数*/
voidchushi();
sbitK0=P3^7;
/*开关K0接P3^7管脚*/
sbitK1=P3^6;
/*开关K1接P3^6管脚*/
sbitK2=P3^5;
/*开关K2接P3^5管脚*/
sbitK3=P3^3;
/*开关K3接P3^3管脚*/
sbitK4=P3^2;
/*开关K4接P3^2管脚*/
/*程序初始化*/
voidinit(void)
{
/*12MHz*/
TMOD=0x01;
/**计数器用模式1,为16位计数器*****/
TH0=0x3c;
TL0=0xb0;
/*0xB0*//*计50000个数,用时50ms*/
IT0=1;
/*外部中断0为边沿触发方式*/
ET0=1;
/*允许T0中断*/
TR0=1;
/*启动计数器*/
EA=1;
/*CPU开放总中断*/
EX0=1;
/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
EX1=1;
/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*中断0处理程序*/
voidint0(void)interrupt0
EA=0;
/*CPU禁止响应一切中断*/
P1=0xDB;
P0=a[0];
/*东西南北方向均红灯亮,P0口输出0*/
TR0=!
TR0;
for(;
;
)/*无条件循环*/
{
P2=b[0],P0=a[SN_G%10];
/*南北方向数码管显示可通行时间的个位*/
delay(5);
/*延时*/
P2=b[1],P0=a[SN_G/10];
/*南北方向数码管显示可通行时间的十位*/
P2=b[2],P0=a[WE_G%10];
/*东西方向数码管显示可通行时间的个位*/
P2=b[3],P0=a[WE_G/10];
/*东西方向数码管显示可通行时间的十位*/
if(K4==0)/*P3^2=0*/
delay(10);
/*延时,把抖动的时间抛掉*/
if(K4==0)
{
while(!
K4)/*当松开K4开关时,跳出空循环,执行后面的程序*/
}
n++;
/*K4按下次数*/
}
if(n==1)/*K4按下1次时,时间加*/
/*设置南北方向通行时间*/
if(K0==0)/*P3^7=0*/
{
/*延时,把抖动的时间抛掉*/
if(K0==0)
{
while(!
K0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
SN_G++;
/*南北方向绿灯时间+1*/
if(SN_G==100)
SN_G=0;
/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
/*设置东西方向通行时间*/
if(K1==0)/*P3^6=0*/
if(K1==0)
K1)/*当松开K1开关时,跳出空循环,执行后面的程序*/
WE_G++;
/*东西方向绿灯时间+1*/
if(WE_G==100)
WE_G=0;
/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/
if(n==2)/*K4按下2次时,时间减*/
SN_G--;
/*南北方向绿灯时间-1*/
if(SN_G<
0)
/*当南北方向绿灯时间减到小于零后清零*/
WE_G--;
/*东西方向绿灯时间-1*/
if(WE_G<
/*当东西方向绿灯时间减到小于零后清零*/
if(n==3)/*K4按下3次时,时间恢复初值*/
n=0;
SN_G=20,WE_G=15;
/*返回*/
if(K2==0)/*P3^5=0*/
{
delay(10);
if(K2==0)
while(!
K2)/*当松开K2关时,跳出空循环,执行后面的程序*/
{
}
count=0;
/*清零*/
k=0;
/*南北方向通车,东西方向不通车*/
SN=SN_G,WE=SN_G+Y;
/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
light();
/*调用交通灯函数*/
led();
/*调用数码管函数*/
EA=1;
/*CPU开放总中断*/
TR0=!
break;
/*跳出*/
}
}
/*中断1处理程序*/
voidint1(void)interrupt2
{
P1=0xDB,P0=a[0];
/*计数器停止工作*/
/*数码管扫描程序,*/
P2=b[0];
/*显示南北方向个位*/
/*延时*/
P2=b[1];
/*显示南北方向十位*/
P2=b[2];
/*显示东西方向个位*/
P2=b[3];
/*显示东西方向十位*/
/*返回*/
if(K2==0)/*P3^5=0*/
if(K2==0)
K2)/*当松开K2开关时,跳出空循环,执行后面的程序*/
}
EA=1;
/*CPU开放总中断*/
TR0=!
/*启动计数器*/
break;
}
/*键盘程序*/
voidkey()
/*南北有车而东西无车*/
if(K0==0)/*K0=0*/
if(K0==0)
K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
led();
count=0;
k=0;
SN=SN_G,WE=SN_G+Y;
led();
/*南北无车而东西有车*/
if(K1==0)/*K1=0*/
K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
k=2;
/*南北方向不通车,东西方向通车*/
SN=WE_G+Y,WE=WE_G;
/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
/*定时函数*/
voidtime0(void)interrupt1
/*计50000个数,用时50ms*/
count++;
/*自增运算*/
if(count>
=20)/*当count大于或等于20时,历时1s,执行程序*/
SN--;
/*自减运算*/
WE--;
count=0;
if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
k++;
/*自增运算*/
if(k>
3)/*当k>
3时,执行程序*/
{k=0;
SN=SN_G,WE=SN_G+Y;
else
switch(k)/*switch语句*/
case0:
SN=SN_G,WE=SN_G+Y;
break;
case1:
SN=Y,WE=Y;
/*东西南北方向显示时间均为黄灯闪亮时间*/
case2:
SN=WE_G+Y,WE=WE_G;
case3:
}
/*延时t毫秒*/
voiddelay(uchart)
uchari;
for(t;
t>
0;
t--)
for(i=2000;
i>
i--)
{}
/*交通灯函数*/
voidlight()
{
P1=c[k];
/*交通灯对应着k的值变化*/
if(P1==c[1]&
&
count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
P1=0xDF;
/*南北方向黄灯熄灭,东西方向亮红灯*/
else
if(P1==c[3]&
count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
P1=0xFB;
/*南北方向亮红灯,东西方向黄灯熄灭*/
/*数码管函数*/
voidled()
P2=b[0],P0=a[SN%10];
P2=b[1],P0=a[SN/10];
P2=b[2],P0=a[WE%10];
P2=b[3],P0=a[WE/10];
voidchushi()
TH1=0x3c;
TL1=0xb0;
TMOD=0x10;
ET1=1;
/*允许T1断*/
TR1=1;
SN=6,WE=6;
P2=b[0],P0=a[SN%10];
delay(5);
P2=b[1],P0=a[SN/10];
delay(5);
P2=b[2],P0=a[WE%10];
P2=b[3],P0=a[WE/10];
/*延时*/
if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
TR1=!
TR1,ET1=0;
SN=20,WE=26;
break;
voidtime1(void)interrupt3
/*主函数*/
voidmain(void)
chushi();
init();
/*调用程序初始化函数*/
key();
/*调用键盘程序*/
led();
/*调用数码管函数*/
课程设计
——交通灯控制系统设计
电子信息工程0803
范瑛0807050305
侯楠0807050307
慕旭娟0807050308