单片机交通灯课程设计教材Word下载.docx
《单片机交通灯课程设计教材Word下载.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课程设计教材Word下载.docx(20页珍藏版)》请在冰点文库上搜索。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多,在学习了单片机的有关知识之后,运用相关知识来设计完成交通信号灯。
我对单片机很感兴趣,所以在听了老师给我们讲解单片机相关知识以后,我自己课后查找资料,不断学习单片机方面的知识。
这次课设给了我学以致用的机会,我利用自己学的单片机知识,做了一个基于单片机的模拟交通灯控制的设计。
目录
1设计目的1
2设计内容1
3总体设计2
4硬件设计介绍2
4.1数码管倒计时显示的理论分析3
4.2三极管的工作原理3
4.3二联共阳数码管原理4
4.474LS573驱动芯片原理6
5电路图及仿真设计7
6源程序8
7设计体会及建议13
单片机交通灯设计
1、设计目的
(1)通过设计了解一个十字路口交通灯基本工作原理
(2)掌握89C52计数器/定时器的工作方式和74LS573驱动芯片的工作原理;
(3)掌握keil软件的使用
(4)学会teamwork团队合作
二、设计内容
设计一个模拟十字路口交通灯控制器,程序运行后,初始状态时东南西北方向红灯全亮5秒,接着程序开始循环以下的程序:
3、总体设计
本设计采用单片机89C52作为控制器,通行时间及等待时间使用数码管以倒计时的方式显示,使用单片机P1口控制交通灯(红黄绿三色LCD)的替换。
用
单片机的P1.0-P1.5六个I/O口控制东西南北的红黄绿灯,用P0.0—P0.7八个I/O口控制数码管的段选,用P2.4—P2.7四个I/O口控制数码管的位选,其中用四个NPN三极管放大数码管位选的电流,用驱动芯片74LS573驱动数码管的段选。
四、硬件设计介绍
1.数码管倒计时显示的理论分析
利用MCS-51内部的定时器/计数器进行,配合软件延时实现倒计时。
在工作之前必须通过软件设定它的工作方式,即对寄存器TMOD中每位进行设定,格式如表3所示。
表3TMOD格式
D7D6D5D4D3D2D1D0
CATE
C/T
M1
M0
其中,低四位用于决定T0的工作方式,高四位用于决定T1的工作方式,M1和M0工作方式控制位用以确定4种工作方式,如下表4所示:
表4M1和M0控制4种工作方式
M1M0
工作方式
说明
00
方式0
13位计数器
01
方式1
16位计数器
10
方式2
自动装载8位计数器
11
方式3
定时器0:
分为两个8位计数器
定时器1:
对外部停止计数
采用T0方式1,定时1S,系统时钟为6MHZ,所以时钟周期=(12*1/6)us=2us;
采用每隔100ms中断一次,中断10次为1S,使时间的计数值减1,实现了倒计时的功能。
计算计数初值X:
(216-X)*2us=1s,所以X=15536=3CB0H,因此TH0=3CH,TL0=B0H。
状态灯显示的理论分析
南北通行,东西禁止时利用定时器中断倒计时15S;
东西通行,南北禁止时利用定时器中断倒计时15S。
中断理论分析
MCS-51中断系统有5个中断源,分别是外部中断0、外部中断1、定时器/计数器T0溢出中断、定时器/计数器T1溢出中断、串行口中断请求。
MCS-51的CPU对中断源的开放和屏蔽,是由片内的中断允许寄存器IE控制。
中断允许控制寄存器IE的格式,如表5所示。
位地址
AF
AE
AD
AC
AB
AA
A9
A8
位符号
EA
/
ES
ET1
EX1
ET0
EX0
EA—中断允许总控制位,EA=0,中断总禁止,禁止所有中断。
EA=1,中断总
允许,总允许位打开后,各中断的允许或禁止由各中断允许控制位设置决定。
EX0(EX1)—外部中断允许控制位,EX0(EX1)=0,禁止外部中断。
EX0(EX1)=1,允许外部中断。
ET0(ET1)—定时/计数中断允许控制位,ET0(ET1)=0,禁止定时/计数中断。
ET0(ET1)=1,允许定时/计数中断。
ES—串行中断允许控制位,ES=0,禁止串行中断。
ES=1,允许串行中断。
利用MCS-51内部的中断进行,采用外部中断0,跳沿触发方式;
外部中断0的中断入口地址为0003H。
2.三极管的工作原理
三极管是电流放大器件,有三个极,分别叫做集电极C,基极B,发射极E。
分成NPN和PNP两种。
我们仅以NPN三极管的共发射极放大电路为例来说明一下三极管放大电路的基本原理。
如上图所示,我们把从基极B流至发射极E的电流叫做基极电流Ib;
把从集电极C流至发射极E的电流叫做集电极电流Ic。
这两个电流的方向都是流出发射极的,所以发射极E上就用了一个箭头来表示电流的方向。
三极管的放大作用就是:
集电极电流受基极电流的控制(假设电源能够提供给集电极足够大的电流的话),并且基极电流很小的变化,会引起集电极电流很大的变化,且变化满足一定的比例关系:
集电极电流的变化量是基极电流变化量的β倍,即电流变化被放大了β倍,所以我们把β叫做三极管的放大倍数(β一般远大于1,例如几十,几百)。
如果我们将一个变化的小信号加到基极跟发射极之间,这就会引起基极电流Ib的变化,Ib的变化被放大后,导致了Ic很大的变化。
如果集电极电流Ic是流过一个电阻R的,那么根据电压计算公式U=R*I可以算得,这电阻上电压就会发生很大的变化。
我们将这个电阻上的电压取出来,就得到了放大后的电压信号了。
3.二联共阳数码管原理
①静态显示
静态显示是当显示器显示某个字符时,相应的段恒定地导通或截止,指导显示另一个字符为止
当采用静态显示方式时,各段公共端接地(共阴极)或接电源(共阳极),段选线与一个8位锁存器的输出口相连,显示器的各位相互独立
静态方式显示器亮度较高,编程容易,但占用的IO口线资源较多,日常生活中比较少用。
②动态显示
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
4.74LS573驱动芯片原理
说明:
LS573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出
将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,
新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总
线,而不需要外接口。
特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工
作寄存器
五、电路图及仿真设计
设计完成原理图如下
在电路连接完成后,将写好的程序放入单片机,运行。
单片机交通灯控制原理图
交通灯实物图
实物图
六、源程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitred_dongxi=P1^0;
//P1.0东西红灯
sbityellow_dongxi=P1^1;
//P1.1东西黄灯
sbitgreen_dongxi=P1^2;
//P1.2东西绿灯
sbitred_nanbei=P1^3;
//P1.3南北红灯
sbityellow_nanbei=P1^4;
//P1.4南北黄灯
sbitgreen_nanbei=P1^5;
//P1.5南北绿灯
sbitnbweixuan1=P2^4;
//P2.4南北数码管位选1
sbitnbweixuan2=P2^5;
//P2.5南北数码管位选2
sbitdxweixuan1=P2^6;
//P2.6东西数码管位选1
sbitdxweixuan2=P2^7;
//P2.7东西数码管位选2
uintaa,shi1,shi2,ge1,ge2;
//定义无符号整型变量
uintcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelay(uintz);
//延时函数声明
voiddisplay(uintshi1,uintge1,uintshi2,uintge2);
//数码管显示函数声明
voidinit1();
//状态函数1声明
voidinit2()//状态函数2声明
voidinit3();
//状态函数3声明
voidinit4();
//状态函数4声明
voidinit5();
//状态函数5声明
voidmain()//主函数
{P0=0xFF;
//P0口初始化
P1=0xFF;
//P1口初始化
P3=0xFF;
//P3口初始化
EA=1;
//打开中断
ET0=1;
TR0=0;
init1();
while
(1)
{init2();
init3();
init4();
init5();
}
}
voidinit1()//状态函数1
{uinttemp;
temp=5;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
{red_dongxi=0;
red_nanbei=0;
green_dongxi=1;
green_nanbei=1;
yellow_nanbei=1;
yellow_dongxi=1;
if(aa==20)
{aa=0;
temp--;
shi1=shi2=temp/10;
ge1=ge2=temp%10;
if(temp==0)break;
display(shi1,ge1,shi2,ge2);
}
voidinit2()//状态函数2
temp=10;
{red_dongxi=1;
green_dongxi=0;
shi1=(temp+5)/10;
ge1=(temp+5)%10;
shi2=temp/10;
ge2=temp%10;
voidinit3()//状态函数3
{
uinttemp;
{
yellow_dongxi=~yellow_dongxi;
shi1=temp/10;
shi2=shi1;
ge1=temp%10;
ge2=ge1;
voidinit4()//状态函数4
red_nanbei=1;
green_nanbei=0;
ge1=temp%10;
shi2=(temp+5)/10;
ge2=(temp+5)%10;
voidinit5()//状态函数5
{red_nanbei=1;
red_dongxi=0;
yellow_nanbei=~yellow_nanbei;
voiddisplay(uintshi1,uintge1,uintshi2,uintge2)//数码管显示
{dxweixuan1=1;
dxweixuan2=0;
nbweixuan1=0;
nbweixuan2=0;
P0=table[ge1];
delay(5);
dxweixuan1=0;
dxweixuan2=1;
P0=table[shi1];
nbweixuan1=1;
P0=table[ge2];
nbweixuan2=1;
P0=table[shi2];
}
voidxtimer0()interrupt1//中断函数
aa++;
voiddelay(uintz)//延时函数
{uintx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
110;
y++);
七.设计体会与建议
在本次课程设计中,重新巩固了单片机理论课时,感觉到的内容很多,知识点很杂、很繁琐。
通过自己的努力也更进一步掌握了单片机的内容构造和工作原理,以及接外部电路的情况。
当然光有理论知识那只是“纸上谈兵”,还需实际动手去实践。
真正把所学的用到日常生活中,理论联系实际,做出实物模型。
这次单片机课程设计,我们设计的是简易十字路口交通灯设计,通过这次课程设计我感觉到要想做成功,必须花时间多做准备,查阅大量资料,每个过程都很繁琐,都要认真地分析每一步每一个模块要实现大的功能,然后分步进行编写调试,最后整合成在一起。
在这次课程设计中,让我感到过程决定结果,细节觉得成败。
过程很艰难,每个细节都要认真的分析。
通过本次课程设计,我们要对所做的事情有耐性,在编程的时候有困难,也可能变得不一定成功,所以要经过多次调试,分析,改正,反复去做;
认真虚心求教老师和同学。
在本次课程设计中,遇到最难的问题是倒计时这个模块。
从一位静态LED显示开始调试,到2位动态LED显示调试,遇到很多困难。
一位一位的静态显示都可以,用动态显示方法的时候,就出现乱码,之后一条一条指令的测试,知道没出错为止。
这时又有问题了,十位先显示个位要显示的数再显示十位要显示的数,经过反复的调试和老师的帮助下,发现我们把段选和位选分开了(有两个子程序来写)。
程序经过更改后,继续调试,又发现2个数码管只是移位的在显示,可且间隔时间很长(这是由延时时间太长引起的)。
设置延时时间很短的时候,就发现显示很快(很容易会发生交通意外),经过同学的帮助下,查处我们的定时有问题,在同学的帮助下,重新编写和调试定时,最后成功了。
在本次课程设计中,我们用汇编语言编写,觉得汇编语言很复杂很麻烦,能用的寄存器少,每个参数都要放在寄存器里,很繁琐,而且格式是固定的,编写出来的程序很长。
在这次课程设计中,经历了多次失败的洗礼,我明白在以后学习和实践中,我要努力掌握知识,多动手,多思考,以免在以后的学习工作中犯同样的错误。