单片机课程设计十字路口的交通灯控制电路.docx
《单片机课程设计十字路口的交通灯控制电路.docx》由会员分享,可在线阅读,更多相关《单片机课程设计十字路口的交通灯控制电路.docx(20页珍藏版)》请在冰豆网上搜索。
单片机课程设计十字路口的交通灯控制电路
《单片机原理及应用课程设计》报告
——交通灯设计
专业:
班级:
姓名:
学号:
2013年5月
1.课程设计目的
1.1巩固和加深对单片机原理和接口技术知识的理解;
1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;
1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;
1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;
1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求
1)设计一个十字路口交通灯控制器。
用单片机控制LED灯模拟指示。
模拟东西方向的十字路口交通信号控制情况。
东西向通行时间为80s,南北向通行时间为60s,缓冲时间为3s。
2)黄灯亮时,要求每秒闪亮一次。
3)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
4)当有突发事情发生时(如有救护车通过时),可通过按键将各个路口设置成红灯,只让救护车通过。
3.硬件设计
3.1设计思想
单片机选型:
AT89C52
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,8位微控制器8K字节在系统可编程FlashROM。
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入端用。
在访问外部数据存储器或程序存储器时,P0口被分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
P1端口引脚号第二功能:
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
P3端口引脚第二功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
RST——复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
3.2系统原理图
3.3复位电路:
上电+按钮
。
图中,上电时,接通电源,电容器C相当于瞬间短路,+5V加到了RST/VPD端,该高电平使8051全机复位。
若运行过程中,需要程序从头执行,只需按动按钮开关,则直接把+5V加到了RST/VPD端,从而复位。
显然,该电路即可以上电复位,也可以手动复位,是常用复位电路之一。
3.4数码管显示:
7SEG-MPX2-CC
此处采用的数码管时共阴极数码管,G、F、E、D、C、B、A七个端口是输入端口,对其各位进行赋值,置位则亮,复位则灭,用此来显示出相应的数字;1、2两端口用来控制高位和低位的选通显示,只要对端口置位,便可以选择该端口,并对其所代表的位进行赋值,显示。
3.5发光二极管显示
每个路口都采用了三个LED灯来显示,分别代表了红黄绿三种灯,来模拟路口交通灯的变换。
3.6键盘:
独立键盘+中断
采用开关来控制进入中断,可以在路口出现紧急情况时,拉动开关,来使得红绿灯发生相应的改变,已处理紧急情况下的车辆通行。
4.软件设计
4.1总体流程图
4.2紧急中断子程序流程图
4.3循环流程控制思路:
4.4源程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
uchartemp,aa,nn;
sbitrn=P2^0;
sbitnb=P2^1;
sbitgn=P2^2;
sbitrw=P2^3;
sbitdx=P2^4;
sbitgw=P2^5;
sbitshi=P3^6;
sbitge=P3^7;/*对要使用的单片机各个口进行定义*/
bitflag=0;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};/*将数字0123456789的16进制数定义成数组用以显示*/
voiddelay(uintz);
voiddisp(uintn);
voidnb_flash(void);
voiddx_flash(void);
voidxint0();
voidtimer0();
voidLED_ON();
voidxint1();
voidLED_OFF();
voidnanbei();
voiddongxi();/*将所使用的子函数定义*/
voidmain()
{
uintnum;
num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=0;
EX1=1;
IT1=1;/*中断初始化*/
while
(1)
{
nanbei();
nb_flash();
dongxi();
dx_flash();/*主函数中显示部分*/
}
}
voiddelay(uintz)/*延时子函数*/
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidtimer0()interrupt1/*定时器初始化*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==18)
{
aa=0;
flag=1;
}
}
voiddisp(uintn)/*显示子函数*/
{
while(!
flag)
{
ge=0;
P0=table[n%10];
delay(50);
shi=1;ge=1;
shi=0;
P0=table[n/10];
delay(50);
shi=1;ge=1;
}
if(flag==1)
flag=0;
}
voidnanbei()/*南北方向的红绿灯和数码管显示子函数*/
{uintnum;
num=60;
disp(num);
while(num<=60&&num>0)
{num--;
P2=0xde;
disp(num);
}
}
voiddongxi()/*东西方向的红绿灯和数码管显示子函数*/
{uintnum;
num=80;
while(num<=80&&num>0)
{P2=0xf3;
disp(num);
num--;
}
}
voidnb_flash(void)/*南北方向的黄灯和数码管显示子函数*/
{
uinta;
for(a=3;a>0;a--)
{P2=0xdd;
nb=1;
delay(100);
nb=0;
disp(a);
}
}
voiddx_flash(void)/*东西方向的黄灯和数码管显示子函数*/
{
uinta;
for(a=3;a>0;a--)
{P2=0xeb;
dx=1;
delay(100);
dx=0;
disp(a);
}
}
voidxint0()interrupt2/*中断定义*/
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
LED_ON();
}
voidLED_ON()/*开关控制灯的子函数*/
{uintb;
rn=0;
rw=0;
gn=1;
gw=1;
nb=1;
dx=1;
for(b=5;b>0;b--)
{
ge=0;shi=1;
P0=table[b];
delay(1000);
ge=1;shi=1;
}
return;
}
5.调试运行
5.1正常运行状态
5.2中断运行状态
5.3黄灯闪烁状态
6.设计心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
这次的单片机课程设计大概用了一周的时间,在这一周的时间当中,虽然开始遇到了很多的困难,但是由于合理地进行设计安排,分工合作,并各自查阅了相关的资料,最后在大家共同努力下我们顺利地完成了本次单片机课程设计,同时也学到了很多东西。
回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
例如我们在设计数码管显示的时候,刚开始的时候,由于对数码管引脚的不熟悉,我们都无法让数字显示,后来发现时十位和个位的置位、复位发生了问题,我们对此进行了修改,可以正确的显示出十位及个位的数值,但是数字的显示不稳定,不停的跳动,我们为此查阅了很多的资料,但还是未能解决,最后我们不停地对程序进行修改,终于发现了问题所在,在显示子程序上存在缺陷未能快速的切换对十位、个位的置位和复位,经过这样的修改,终于可以完美的显示时间了。
我们也更好地掌握了对数码管的使用,这都是课堂上学不到的知识。
这次的单片机课程设计是通过实践操作和理论相结合,提高动手实践能力,提高科学的思维能力。
与此同时,我们也对分工合作有了进一步的认识,只有通过合理的分工合作,我们们才能够在短短一周的时间内完成设计任务,相信这对以后在社会上工作和学习会有很多帮助,让我们能更好的进入工作状态。
最重要的是,这次课程设计也增加了我们对问题的研究和探讨,们以后的学习中会有更多的帮助。
单片机为我们的主要专业课之一,对我们还是很有帮助的,课程设计也是为我们以后的工作提前进行了一次练手,也是我们学习生活之中少有的一次自己探索、研究,发现问题、解决问题的机会。
当然要做好一个课程设计也不是很简单的,我认为有以下几步:
(1)在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;
(2)要有一个清晰的思路和一个完整的的软件流程图,善于将大的程序段缩小为每个子函数来实现;
(3)在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;
(4)要养成注释程序的好习惯,写程序是应该思路清晰,结构明了,应该让人一看就能明白你的思路,方便资料的保存和交流;
(5)我们们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的;
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
我们们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,或者与其他小组成员讨论,共同解决,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
通过这次课程设计我们也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
通过这次课程设计使我更加懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正将一个东西学好学透,从而提高自己的实际动手能力和独立思考的能力。
我想这对于我今后的学习生活和工作都会是有很大帮助的!
7.参考书目
【1】.肖金球.单片机原理与接口技术;
【2】.江志红.51单片机技术与应用系统开发案例精选;
【3】.周润景.基于PROTEUS的51单片机设计与仿真;
【4】.王守中.51单片机开发入门与典型实例;
【5】.张齐.朱宁西.单片机系统设计与开发;
【6】.周立功单片机开发网;
【7】.天津锐志单片机开发网;
【8】.ATMEL公司AT89S52单片机中文PDF资料;