单片机交通灯控制系统.docx
《单片机交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《单片机交通灯控制系统.docx(17页珍藏版)》请在冰豆网上搜索。
单片机交通灯控制系统
《计算机控制技术课程设计报告》
题目:
计算机温度控制硬件系统设计
学院:
专业班级:
姓名:
指导教师:
2011年06月28日
目录
第1章引言…………………………………………………1
第2章硬件系统组成与说明………………………………4
第3章结论…………………………………………………10
参考书目
引言
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
本设计是根据我所学习的单片机课程,按照大纲要求对我进行的一次课程检验,是进行单片机课程训练的必要任务,也对我们掌握单片机应用有很大的帮助。
掌握单片机技术是一门不可或缺的技术,对我将来的工作以及生活和学习都有很密切的联系。
当今世界的发展是以科学技术为基础的,微控技术在生产中所占的比重也越来越大。
单片机的出现是近代计算机技术发展史上的一个重要里程碑。
近年来,随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。
1课程设计目的
1.通过单片机课程设计,熟练掌握汇编语言的编程方法
2.通过交通信号灯控制系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高我们的逻辑抽象能力。
2课程设计题目和要求
题目利用单片机制作交通控制系统
要求1.设计任务在一十字路口设置交通灯,并用单片机对其进行合理的控制。
时间方向控制要求白天东西绿灯黄灯红灯南北红灯绿灯黄灯夜晚东西黄灯南北黄灯
2.总体设计方案现在流行的一种设计为两主干线相交的十字路。
本设计采用一主干道(南北方向),一从干道(东西方向)的路口,即主干道的通行时间为从干道的2倍。
在正常情况下,两干道的交通灯按图1进行转换,并以倒计数的方式将剩余时间显示在每个干道对应的两位LED上;另发挥部分为当出现紧急情况时,路口的交通灯全为红灯,紧急情况解除时,恢复到原来的状态。
3课程设计报告内容
3.1设计方案的选定与说明
芯片的选定
主控芯片采用AT89S52单片机。
单片机,亦称单片微型计算机。
它是把中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。
于是,微型计算机(即单片机)在这种情况下诞生了。
纵观生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
单片机以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信设备、家用电器等嵌入式应用领域中独占鳌头。
如果说C语言程序设计课程设计的基础课,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计基础课。
MCS-51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS-51系列单片机。
8051单片机包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
3.2论述方案的各部分工作原理
3.2.1中央处理器(CPU)
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
3.2.2程序存储器(内部ROM):
程序存储器用于存放程序和固定不变的常数等。
通常采用只读存储器,且其又多种类型,在89系列单片机中全部采用闪存。
AT89S51内部配置了4KB闪存。
定时/计数器(ROM):
定时/计数器用于实现定时和计数功能。
AT89S51共有2个16位定时/计数器。
并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
每个口都由1个锁存器和一个驱动器组成。
它们主要用于实现与外部设备中数据的并行输入与输出,有些I/O口还有其他功能。
全双工串行口:
A89S51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
3.2.3时钟电路:
时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。
3.2.4中断系统:
中断系统的作用主要是对外部或内部的终端请求进行管理与处理。
AT89S51共有5个中断源,其中又2个外部中断源和3个内部中断源。
3.2.5定时/计数器
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
3.4交通灯设计方案的图表
主程序有车车道放行时的中断服务程序(外中断1)
中断响应
关中断
保护现场
开中断
A道有车吗
B道有车吗
A绿灯、B红灯
延时15S
A红灯、B绿灯
关中断
恢复现场
返回
开中断
紧急情况时的中断服务程序(外中断0)
中断响应
返回
恢复现场
延时20S
A红灯、B红灯
保护现场
3.5交通系统主程序
#include
#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;
led_data_temp=P0;
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))
{
P0=0xff;
GREEN_ZHI=0;
RED_ZHU=0;
}
if(!
int1_key)
{
delayms(10);
if(!
int1_key)
{
while(!
int1_key);
TH0=(65536-time)/256;
TL0=(65536-time)%256;
TR1=0;
TR0=1;
EX0=0;
EX1=0;
C50ms=0;
}
}
}
voidISRT0(void)interrupt1//定时器0中断服务子程序
{
temp1=N,temp2=Y,temp3=Z,temp4=M,temp5=G,temp6=U;
TH0=(65536-time)/256;
TL0=(65536-time)%256;//重装初值time
YELLOW_ZHU=1;//如果在黄5S时进行熄灭黄灯
YELLOW_ZHI=1;
if(!
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中断服务子程序
{
TH1=(65536-time)/256;
TL1=(65536-time)%256;//重装初值time
C50ms++;
if(C50ms>19)
{
N--;
M--;
Y--;
Z--;
G--;
U--;
C50ms=0;
}
}
/*=================延时=======================*/
voidDelay10uS(ucharsecond)
{
uinti;
while((second--)!
=0)
{
for(i=0;i<5;i++)
{}
}
}
voiddelayms(uintk)
{
uinti,j;
for(i=0;ifor(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;Delay10uS(10);P20=off;//高位
}
voiddisplay2(ucharnum3,ucharnum4)//控制东西数码管显示
{
P2=discode[num3];P23=on;Delay10uS(10);P23=off;//低位
P2=discode[num4];P22=on;Delay10uS(10);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!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);//当t0=20时东西、南北红灯(20s)
display1(t0/10,t0%10);//当t0=15时东西、南北红、绿灯交换点亮
}
else
{
if(N==5)
{
while(Z!
=0)
{
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!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
if(G==5)
{
while(U!
=0)
{
if(TR0==1)
{
display2(t0/10,t0%10);
display1(t0/10,t0%10);
}
else
{
display2(G/10,G%10);//东西红灯(5s)
display1(U/10,U%10);//南北黄灯(5s)
GREEN_ZHI=off;
YELLOW_ZHI=on;
}
}
}
else
{
display2(G/10,G%10);//东西红灯(25s)
display1(M/10,M%10);//南北绿灯(20s)
}
}
}
GREEN_ZHI=off;
RED_ZHU=off;
YELLOW_ZHI=off;
P0=0xff;
Delay10uS
(1);
/*=====================重新赋值===============================*/
N=50,Y=45,Z=50,M=75,G=80,U=80;
}
}
4总结
通过这次交通灯的课程设计,使我得到了一次用专业知识、专业技能分析和解决现实问题的能力。
使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为一名合格的应用型人才打下良好的基础。
综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更深层次的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得到解决。
在这次单片机课程设计中,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新,是要我们学会将理论很好地联系实际,并不断地去开动自己的大脑,从为人类造福的意愿出发,做自己力所能及的,别人却没想到的事。
使之不断地战胜别人,超越前人。
同时,更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
参考书目:
[1].杨立《计算机控制与仿真技术》,北京,中国水利水电出版社,2006
[2].张毅坤,《单片机卫星计算机原理及应用》,西安,西安电子科技大学出版社,1998
[3].余锡存,曹国华,《单片机原理及接口技术[M]》,陕西,西安电子科技大学出版社,2000.7
[4].雷丽文,《微机原理及接口技术[M]》,北京,电子工业出版社,1997.2
[5].李华,《MCS—51系列单片机实用接口技术》,北京,航天航空大学出版社,1999
[6].胡汉才,《单片机原理及其接口技术》,北京,清华大学出版社,2002