基于51单片机的交通灯红绿灯设计论文报告Word格式.docx
《基于51单片机的交通灯红绿灯设计论文报告Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的交通灯红绿灯设计论文报告Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
2.各元器件选择及其功能介绍:
1)元器件列表
2)
元件名称
型号
数量/个
用途
单片机
AT89C51
1
控制核心
晶振
12MHZ
晶振电路
电容
30pF
2
电解电容
10uF
复位电路
电阻
5.1K
发光二极管
LED
12
红、黄、绿灯
集成块
74LS08
按键电路
220Ω
13
LED限流
470Ω
8
数码管电路
电阻
1K
7
数码管驱动、按键电路
数码管
GC-3461BS
显示电路
微动开关
3
三级管PNP
8550
4
数码管驱动电路
表1-1
2)2位8段数码管工作原理:
2位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。
如图4-3所示:
段码和位码,段码即段选信号SEG,它负责数码管显示的内容,图中a~g、dp组成的数据(a为最低位,dp为最高位)就是段码。
位码即位选信号DIG,它决定哪个数码管工作,哪个数码管不工作。
当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。
3.设计原理图:
红绿灯整体示意图
图1-2
交通信号灯的状态表
状态
北
西
南
东
绿黄红
001
100
1
011
110
2
3
表1-2
S1
S2
S3
S4
时间
30s
5s
东西道
红灯亮
绿灯亮
黄灯亮
南北道
共阳与共阴数码管自行代码
字型
共阳极代码
共阴极代码
C0H
3FH
9
90H
6FH
F9H
06H
A
88H
77H
A4H
5BH
B
83H
7CH
B0H
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
8EH
71H
7
F8H
07H
灭
FFH
00H
8
80H
7FH
表1-3
1、时钟电路模块
时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信
号控制下严格地工作。
其电路如图1-3所示:
图1-3
2、复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位电路。
其电路如图1-4所示:
图1-4
3、主控制系统模块
主控制器采用AT89C51,是ATMEL公司生产的一款性能稳定的8位单片机。
AT89C51具有1个8KB的FLASH程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个向量二级中断结构。
单片机的P0口分别用于控制南北及东西的通行灯,P2口和P3^4-P3^7口用于4组4位LED计时器的控制,紧急车辆通行时使用外中断0(P3^2)和外中断1(P3^3),进行手动按键,即可转换。
4、交通灯输出控制模块
道口交通灯指示采用高亮度红、黄、绿发光二极管进行提示。
当R=220欧时,按公式A=(5-1.8)/R计算,电路中的电流大小应为A=14.545mA.由于每个路口的通行双向指示处理相同,因此每个端口应具有3A的吸收电流能力。
5、时间显示电路模块
道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阳数码管,如用单片机吸收电流驱动,列扫描驱动使用三极管,按每段6mA电流计算,全显示字形“8”时,每个数码需6mA*8=48mA,由于时间显示每个道口相同,共需要电流192mA,因此设计中也采用了中功率三极管8550.其显示电路如图1-6所示:
图1-5
6、紧急通车电路模块
为了实现此功能,利用单片机中断达到目的。
利用一个手动按钮开关接至单片机外部中断0,同时在软件设计时将其设定为最高优先级,当其按下时,四方全为红灯,同时将中断位置的PSW、ACC进栈保护,当其计时完了之后,回到原来的位置进行执行。
再利用一个手动按钮接至单片机外部中断1当其按下时,如果是东西道是红灯,而南北道是绿灯,则将其置为东西是绿灯,南北是红灯;
如果是东西道是绿灯,而南北道是红灯,则将其置为东西是红灯,南北是绿灯。
两种情况都是执行完后,回到断点处继续执行。
第三章软件设计
1.程序:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
#definetime50000
#defineon0
#defineoff1
sbitRED_ZHU=P0^0;
//南北红灯
sbitYELLOW_ZHU=P0^1;
//南北黄灯
sbitGREEN_ZHU=P0^2;
//南北绿灯
sbitRED_ZHI=P0^3;
//东西红灯
sbitYELLOW_ZHI=P0^4;
//东西黄灯
sbitGREEN_ZHI=P0^5;
//东西绿灯
sbitP23=P3^4;
sbitP22=P3^5;
//东西方向数码管位选
sbitP21=P3^6;
sbitP20=P3^7;
//南北方向数码管位选
sbitint0_key=P3^2;
sbitint1_key=P3^3;
voiddisplay1(uchar,uchar);
voiddisplay2(uchar,uchar);
voiddelayms(uintk);
uchartemp1,temp2,temp3,temp4,temp5,temp6;
/*===============倒计时=========================*/
ucharN=50,Y=45,Z=50,M=75,G=80,U=80;
ucharC50ms,t0;
ucharseg=1;
ucharflag=0,led_data_temp;
voidInitialT1(void)
{
TMOD=0x11;
//定时器0,1工作在方式1
TH1=(65536-time)/256;
//相当于(65536-time)/256;
TL1=(65536-time)%256;
//初值为time(50ms)
TR1=1;
//开定时器1中断
ET1=1;
//允许定时器1中断
ET0=1;
TH0=(65536-time)/256;
TL0=(65536-time)%256;
EX0=1;
//允许外部中断0
IE0=1;
//启动外部中断0
PX0=1;
EX1=1;
IE1=1;
EA=1;
//开总中断
}
voidint0(void)interrupt0//外中断0
{
flag=0;
led_data_temp=P0;
t0=20;
if(!
int0_key)
{
delayms(10);
if(!
int0_key)
{
while(!
int0_key);
TH0=(65536-time)/256;
TL0=(65536-time)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
C50ms=0;
}
}
voidint1(void)interrupt2//外部中断1
t0=15;
flag=1;
if(((RED_ZHU==0)&
&
(GREEN_ZHI==0))||((YELLOW_ZHI==0)&
(RED_ZHU==0)))
P0=0xff;
GREEN_ZHU=0;
RED_ZHI=0;
else//if((RED_ZHI==0)&
(GREEN_ZHU==0))
GREEN_ZHI=0;
RED_ZHU=0;
int1_key)
int1_key)
int1_key);
voidISRT0(void)interrupt1//定时器0中断服务子程序
{
temp1=N,temp2=Y,temp3=Z,temp4=M,temp5=G,temp6=U;
//重装初值time
YELLOW_ZHU=1;
//如果在黄5S时进行熄灭黄灯
YELLOW_ZHI=1;
flag)
P0=0xf6;
C50ms++;
if(C50ms>
19)
{
t0--;
C50ms=0;
if(t0==0)
P0=led_data_temp;
N=temp1,Y=temp2,Z=temp3,M=temp4,G=temp5,U=temp6;
TR0=0;
//禁止定时器1中断
TR1=1;
//开定时器1中
EX1=1;
//EX0=1;
C50ms=0;
return;
}
voidISRT1(void)interrupt3//定时器1中断服务子程序
N--;
M--;
Y--;
Z--;
G--;
U--;
/*=================延时=======================*/
voidDelay10uS(ucharsecond)
uinti;
while((second--)!
=0)
for(i=0;
i<
5;
i++)
{}
voiddelayms(uintk)
uinti,j;
for(i=0;
k;
for(j=0;
j<
120;
j++);
/*==================数码管控制========================*/
ucharcodediscode[]=
{0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管0-9代码
voiddisplay1(ucharnum1,ucharnum2)//控制南数码管显示
P2=discode[num1];
P21=on;
Delay10uS(10);
P21=off;
//低位
P2=discode[num2];
P20=on;
P20=off;
//高位
voiddisplay2(ucharnum3,ucharnum4)//控制东西数码管显示
P2=discode[num3];
P23=on;
P23=off;
//低位
P2=discode[num4];
P22=on;
P22=off;
/*===================主函数=================================*/
main()
/*=============初始状态:
东西南北都红灯==================*/
RED_ZHU=on;
RED_ZHI=on;
delayms(1000);
RED_ZHU=off;
RED_ZHI=off;
InitialT1();
while
(1)
//初始化计时器
/*=============状态1:
东西绿灯(45s)南北红灯(40s)==================*/
/*=============状态2:
东西黄灯(5s)南北红灯(5s)=================*/
RED_ZHI=on;
GREEN_ZHU=on;
while(N!
{
if(TR0==1)
{
display2(t0/10,t0%10);
//当t0=20时东西、南北红灯(20s)
display1(t0/10,t0%10);
//当t0=15时东西、南北红、绿灯交换点亮
}
else
{
if(N==5)
{
while(Z!
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display1(N/10,N%10);
//东西黄灯(5s)
display2(Z/10,Z%10);
//南北红灯(5s)
GREEN_ZHU=off;
YELLOW_ZHU=on;
}
}
}
else
display1(N/10,N%10);
//东西绿灯(45s)
display2(Y/10,Y%10);
//南北红灯(40s)
}
GREEN_ZHU=off;
RED_ZHI=off;
YELLOW_ZHU=off;
P0=0xff;
//数码管全关掉
Delay10uS
(1);
/*=============状态3:
东西红灯(20s)南北绿灯(25s)==================*/
/*=============状态4:
东西红灯(5s)南北黄灯(5s)==================*/
GREEN_ZHI=on;
RED_ZHU=on;
while(G!
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
{
if(G==5)
while(U!
display2(G/10,G%10);
//东西红灯(5s)
display1(U/10,U%10);
//南北黄灯(5s)
GREEN_ZHI=off;
YELLOW_ZHI=on;
}
display2(G/10,G%10);
//东西红灯(25s)
display1(M/10,M%10);
//南北绿灯(20s)
}
}
GREEN_ZHI=off;
RED_ZHU=off;
YELLOW_ZHI=off;
/*=====================重新赋值===============================*/
N=50,Y=45,Z=50,M=75,G=80,U=80;
第四章仿真结果及其总结
1.仿真结果图:
南北通行:
图1-6
通行警告:
图1-7
东西通行:
图1-8
2.总结:
通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。
使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。
综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。
还有交通灯是我们生活中非常常见的一种东西,对于我们学以致用的这种能力得到了很好锻炼,能够为我们以后的工作于学习打下基础。
通过合作,我们的合作意识得到加强。
合作能力得到提高。
上大学后,很多同学都没有过深入的交流,在设计的过程中,我们用了分工与合作的方式,每个人互责一定的部分,同时在一定的阶段共同讨论,以解决分工中个人不能解决的问题,在交流中大家积极发言,和提出意见,同时我们还向别的同学请教。
在此过程中,每个人都想自己的方案得到实现,积极向同学说明自己的想法。
能过比较选出最好的方案。
在这过程也提高了我们的表过能力。