单片机课程设计交通灯控制.docx
《单片机课程设计交通灯控制.docx》由会员分享,可在线阅读,更多相关《单片机课程设计交通灯控制.docx(22页珍藏版)》请在冰豆网上搜索。
![单片机课程设计交通灯控制.docx](https://file1.bdocx.com/fileroot1/2023-2/25/d6caec60-7bee-469c-9297-d6d780ba7568/d6caec60-7bee-469c-9297-d6d780ba75681.gif)
单片机课程设计交通灯控制
1.总体设计方案
每15秒(可以更改)进行一次红绿等的转换,在绿灯变红灯的末3秒时,黄灯亮,亮3秒后黄灯灭,红灯亮,如此循环。
当出现紧急情况时,打开紧急情况开关,所有红灯亮。
该设计主要由如下部分组成:
AT89S51单片机、复位电路、紧急情况电路、数码管显示电路、交通灯电路。
总体设计方案图如图1。
图1总体方案设计图
2.单元模块设计
系统整体硬件电路主要包括电源电路、复位电路、紧急情况电路、数码管显示电路、交通灯电路。
2.1电源电路
图2电源电路
如图2电源可以输入直流,也可以输入交流电,输出均为稳定的直流电。
由USB接头输入电压,流过电桥进行整流,整流后由电容滤波,再由7805芯片稳压,输出稳定的+5V电压。
2.1.17805概述
电子产品中,常见的三端稳压集成电路有正电压输出的78**系列和负电压输出的79**系列。
顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。
它的样子象是普通的三极管,TO-220的标准封装,也有9013样子的TO-92封装。
用78/79系列三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。
该系列集成稳压IC型号中的78或79后面的数字代表该三端集成稳压电路的输出电压,如7806表示输出电压为正6V,7909表示输出电压为负9V。
78**系列的稳压集成块的极限输入电压是36V,最低输入电压为输出电压的3-4V以上。
7805电参数表:
参数
符号
测试条件
最小值
典型值
最大值
单位
输出电压
Vo
Tj=25℃
4.8
5.0
5.2
V
5.0mA<1o<1.0A,Po<15W
Vi=7.5vto20v
4.75
5.00
5.25
V
线性调整率
△Vo
Tj=25℃,Vi=7.5Vto25V
4.0
100
mV
Tj=25℃,Vi=8Vto12V
1.6
50
mV
负载调整率
△Vo
Tj=25℃,lo=5.0mAto1.5A
9
100
mV
Tj=25℃,lo=250mAto750mA
4
50
mV
静态电流
IQ
Tj=25℃
5.0
8
mA
静态电流变化率
△IQ
lo=5mAto1.0A
0.03
0.5
mA
Vi=8Vto25V
0.3
0.8
mA
输出电压温漂
△Vo/△T
lo=5mA
0.8
mV/
℃
输出噪音电压
VN
f=10Hzto100KHz,Ta=25℃
42
μV
纹波抑制比
RR
f=120Hz,Vi=8Vto18V
62
73
dB
输入输出电压差
Vo
lo=1.0A,Tj=25℃
2
V
输出阻抗
Ro
f=1KHz
15
mΩ
短路电流
1SC
Vi=35V,Ta=25℃
230
mA
峰值电流
1PK
Tj=25℃
2.2
A
2.2复位电路
图3按钮复位电路
按钮复位电路(如图3)是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用重启单片机电源,就可以实现复位,一般按键时间为10ms。
2.3紧急情况电路
图4紧急情况控制电路
当出现紧急情况时,按下开关S2,使INT0口处于低电平,然后直接传递给给单片机的P3.2口,INT0是P3.2口的第二功能端口,是单片机的外部中断,触发外部中断有两种情况:
(1)下降沿触发
(2)低电平触发
这里的紧急情况电路所用的触发方式是低电平触发方式,当INT0口处于低电平时,触发单片机的外部中断,使之执行中断程序,所有的红灯亮,时间显示为0,达到紧急情况所需要求。
2.4交通灯电路
图5交通灯电路
图6P0口上拉电阻
给发光二级管接一个限流电阻,使之在工作时能达到最好的工作状态。
发光二极管在电流范围为
=5mA~20mA内都能正常发光。
则限流电阻
一般发光二极管的
取1.8V,假设单片机低电平输出能力足够强,即
=0V,则
=160~640。
最终接在AT89S51单片机的P0口,并给P0口一个上拉电阻,使之能正常的输出高电平信号。
2.4.1上拉电阻的作用
一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
数字电路有三种状态:
高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定。
一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,该端口正常时为高电平;C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻。
上拉电阻是用来解决总线驱动能力不足时提供电流的。
一般说法是拉电流,下拉电阻是用来吸收电流。
2.5数码管显示电路
图7三极管
图8四位共阴数码管
数码管为四位共阴数码管(如图8),三极管(如图7)的集电极接+5V,基极接AT89S51单片机的P2口,发射极接数码管的位选。
当控制器给三极管一个高电平时,三极管导通,此时,数码管接于+5V电源,开始工作,P2口给数码管输显示段码,数码管显示时间。
2.5.1数码管概述
数码管是一种半导体发光器件,其基本单元是发光二极管。
(1)分类
数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管。
按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
(2)驱动方式
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
静态显示驱动
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
动态显示驱动
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
(3)主要参数
8字高度
8字上沿与下沿的距离。
比外型高度小。
通常用英寸来表示。
范围一般为0.25-20英寸。
长*宽*高
长——数码管正放时,水平方向的长度;宽——数码管正放时,垂直方向上的长度;高——数码管的厚度。
时钟点
四位数码管中,第二位8与第三位8字中间的二个点。
一般用于显示时钟中的秒。
数码管使用的电流与电压
电流
静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。
电压
查引脚排布图,看一下每段的芯片数量是多少?
当红色与黄绿色时,使用1.9V乘以每段的芯片串联的个数;当绿色/蓝色时,使用3.1V乘以每段的芯片串联的个数。
3.软件编程与调试
单片机软件是单片机系统的灵魂,控制系统的控制能力的强弱与软件有密不可分的关系。
此次软件编程将用到KeilC51单片机软件开发系统,KeilC51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
程序的主要功能是每15秒(可以更改)进行一次红绿等的转换,在绿灯变红灯的末3秒时,黄灯亮,亮3秒后黄灯灭,红灯亮,如此循环。
当出现紧急情况时,打开紧急情况开关,所有红灯亮。
图9总设计图
整个系统分为交通灯、数码管显示和紧急开关三大部分。
各个子系统的程序设计流程图如图10:
图10程序设计流程图
C语言相对汇编语言有易于维护,层次明显,符合人的书写习惯等优点,所以本系统的程序编写使用了针对于AT89S51单片机的C51语言,具体程序内容见附件2。
4.系统功能
第一功能:
正常的指挥交通,每15s进行一次红绿灯的变换,当绿灯还有3s变为红灯时,绿灯灭,黄灯亮,当时间显示为0时,黄灯熄灭,红灯点亮,进行下一次的循环变换。
第二功能:
当出现交通事故的时候,控制总台按下紧急状态开关,十字路口的所有红灯亮,时间显示器时间显示为零,暂时封锁该十字路口,等待交通警察的到来,等交通警察来到后,将交通事故范围控制后,再由控制总台关闭紧急状态开关,车辆行驶,并由交通警察协助指挥。
5.心得体会
经过本次课程设计,我的动手能力和全面思考问题的能力有了进一步的提高,通过对各个单元电路的分析,使我学到了的单片机知识得到了进一步巩固。
在这次单片机设计期间,在课堂上学到的枯燥的书本理论知识转换成了一个又一个有趣的实验现象,使我对单片机这门课程有了更进一步的认识。
总的来说,经过此次的课程设计,我受益匪浅。
在这几天中,体会到了团结协作的重要性和乐趣,有什么问题很想法拿出来一起探讨与分享,将会有更好的答案,活跃了一个人的思维,丰富了我们的头脑,学会去接受别人,肯定别人,同样也得到了别人的尊重与肯定,除了讨论之外,还需积极独立思考,唯独通过自己的独立思考,才能解决相关问题,才能提高对专业知识的熟悉程度,以后才能学会用,同样这也是我该努力的方向。
感谢老师的辅导以及同学的帮助。
“纸上得来终觉浅,绝知此事要躬行”,由此看来实践的重要,短短三星期的课程设计,学到了很多的东西,最重要的是我们自己动手把我们学习的知识用于实践,做出成功的作品,这才算真正学习到了东西。
总之,这次实验我们收获颇多。
实践是获得知识的一种最好的手段!
附录1:
电路设计原理图
附录2:
AT89S51单片机程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodetab2[]={0XDE,0XF3};
uintaa=0,bb=3,dd=0,gw,sw,bw,qw;//定义变量
sbitP00=P0^0;//定义位
sbitP01=P0^1;//定义位
sbitP02=P0^2;//定义位
sbitP03=P0^3;//定义位
sbitP04=P0^4;//定义位
sbitP05=P0^5;//定义位
sbitP06=P0^6;//定义位
sbitP07=P0^7;//定义位
sbitP10=P1^0;//定义位
sbitP11=P1^1;//定义位
sbitP12=P1^2;//定义位
sbitP13=P1^3;//定义位
sbitP20=P2^0;//定义位
sbitP21=P2^1;//定义位
sbitP22=P2^2;//定义位
sbitP23=P2^3;//定义位
sbitP24=P2^4;//定义位
sbitP25=P2^5;//定义位
sbitP26=P2^6;//定义位
sbitP27=P2^7;//定义位
sbitP32=P3^2;//定义位
voiddelay(uintz);//函数声明
voiddisplay();
voidmain()//主函数
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
IT0=0;
EX0=1;
while
(1)
{
display();
}
}
voiddelay(uintz)//延时子程序
{
uinti,k;
for(i=z;i>0;i--)
for(k=100;k>0;k--);
}
voiddisplay()//子程序
{
sw=bb/10;
gw=bb%10;
P10=1;//仿真时P10=0
P11=1;//仿真时P11=0
P13=0;//仿真时P13=1
P2=tab1[gw];
delay(5);
P13=1;//仿真时P13=0
P12=0;//仿真时P12=1
P2=tab1[sw];
delay(5);
P12=1;//仿真时P12=0
}
jingji()interrupt0//外部中断程序,当出现紧急事件时认为控制开关使红灯全亮{
P0=0XF6;
while
(1)
{
TR0=0;
EX0=0;
P12=0;//仿真时P12=1
P2=tab1[0];
delay(5);
P12=1;//仿真时P12=0
P13=0;//仿真时P13=1
P2=tab1[0];
delay(5);
P13=1;//仿真时P13=0
if(P32==1)
{
TR0=1;
EX0=1;
if(dd%2==0)
P0=tab2[1];
if(dd%2==1)
P0=tab2[0];
gotowm;//goto跳转,跳出死循环
}
}
wm:
;
}
voidshijiankz()interrupt1//定时中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
aa++;
if(aa==40)
{
aa=0;
bb--;
if(bb==0)
{
P13=0;//仿真时P13=1
P12=0;//仿真时P12=1
P2=tab1[0];
delay(2500);
P13=1;//仿真时P13=0
P12=1;//仿真时P12=0
bb=15;
P0=tab2[dd];
dd++;
if(dd==2)
dd=0;
}
if(bb<4)
{
P02=1;
P05=1;
if(P03==0)
P01=0;
if(P00==0)
P04=0;
}
}
}
附录3:
控制器(AT89S51)简介
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
主要性能特点:
(1)4kBytesFlash片内程序存储器;
(2)128bytes的随机存取数据存储器(RAM);
(3)32个外部双向输入/输出(I/O)口;
(4)5个中断优先级、2层中断嵌套中断;
(5)6个中断源;
(6)2个16位可编程定时器/计数器;
(7)2个全双工串行通信口;
(8)看门狗(WDT)电路;
(9)片内振荡器和时钟电路;
(10)与MCS-51兼容;
(11)全静态工作:
0Hz-33MHz;
(12)三级程序存储器保密锁定;
(13)可编程串行通道;
(14)低功耗的闲置和掉电模式。
管脚说明:
VCC:
电源电压输入端。
GND:
电源地。
P0口:
P0口为一个8位漏级开路双向PDIP封装的AT89S51管脚图
I/O口,每脚可吸收8TTL门电流。
当
P1口的管脚第一次写1时,被定义为
高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口除了作为普通I/O口,还有第二功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(T0定时器的外部计数输入)
P3.5T1(T1定时器的外部计数输入)
P3.6/WR(外部数据存储器的写选通)
P3.7/RD(外部数据存储器的读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
只有读端口时才真正地把外部的数据读入到内部总线。
89C51的P0、P1、P2、P3口作为输入时都是准双向口。
除了P1口外P0、P2、P3口都还有其他的功能。
RST:
复位输入端,高电平有效。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
地址锁存允许/编程脉冲信号端。
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号,低电平有效。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两
次有效的
/PSEN信号将不出现。
EA/VPP:
外部程序存储器访问允许。
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
片内振荡器反相放大器和时钟发生器的输入端。
XTAL2:
片内振荡器反相放大器的输出端。
参考文献
[1]李群芳,张士军,黄建.单片微型计算机与接口技术(第三版).北京:
电子工业出版社.2008.
[2]康华光.电子技术基础模拟部分(第五版).北京:
高等教育出版社.2009.
[3]张富.c及c++程序设计(第三版).北京:
人民邮电出版社.2008.
[4]江思敏.AltiumDesigner(Protel)原理图与PCB设计教程.北京:
机械工业出版社.2009.