《微型计算机系统》 课程设计 题目名称:基于单片机的交通灯控制系统设计 专业:电气工程及其自动化 班级:15级1班 姓名:赵* 学号:201*58 指导教师:辛*平 青岛理工大学自动化工程学院 课程设计任务书 课程名称:微型计算机系统 设计题目:基于单片机的交通灯控制系统设计 系统要求: 可用红、黄、绿三种颜色发光二极管和两位LED数码管模拟交通灯的变化规律: - 首先,东西路口红灯亮,同时开始60秒倒计时;
- 南北路口“直行”绿灯亮,同时开始40秒倒计时,南北人行道绿灯亮。当南北路口倒计时至4秒时,黄灯开始闪烁,南北人行道红灯亮;倒计时至0秒时,直行灯变红,左转绿灯亮,同时开始20秒倒计时。当20秒倒计时结束时,南北路口红灯亮,开始60秒倒计时;
- 东西路口直行绿灯亮,开始40秒倒计时,东西人行道绿灯亮;按照上述变化规律依次循环。
硬件设计: - 最小系统设计: 51单片机为本设计的控制器,包括外扩ROM、RAM(其大小由设计者自己设计),系统时钟电路、复位电路等构成的最小系统;
- 接口电路的设计:设计者扩展一个并行接口〔8155〕;
- 键盘设计:由设计者根据需要设计键盘的数量
- 显示设计:采用LED数码管显示时间,显示电路根据显示的内容设计;采用三种颜色(红、黄、绿)的发光二极管模拟交通灯;有开机显示状态(如显示888888);
- 在完成基本设计功能的基础上可以另加其他功能。
软件设计: 1)主程序设计 2)各功能子程序设计 其他要求: - 每位同学独立完成本设计。
- 依据题目要求,提出系统设计方案。
- 设计系统电路原理图。
- 调试系统硬件电路、功能程序。
- 编制课程设计报告书并装订成册,报告书内容(按顺序)
(1)报告书封面 (2)课程设计任务书 (3)系统设计方案的提出、分析 (4)系统中典型电路的分析 (5)系统软件结构框图 (6)系统电路原理图 (7)源程序 (8)课设字数不少于3000字 基于单片机的交通灯控制系统设计 摘要: 当你路过一个十字路口时,你是否注意到各个方向车辆和信任有条不紊的通过十字路口。这样井然有序的情景靠什么来实现呢?靠的是交通灯控制系统。在论文中我使用STC89C51作为主控单元。通过单片机芯片的P1口和P2口分别控制东西方向和南北方向红黄绿灯的点亮。通过单片机芯片STC89C51的RXD和TXD控制数码管的显示时间。采用发光二极管来实现交通灯的点亮,由数码管实现时间的显示。该系统不仅仅具有交通等的基本功能还有倒计时,还可以通过按键在紧急事件中四个方向都设置为红灯紧急模式。当然也可以通过按键来设置倒计时时间,使系统更加符合实际交通情况。 我设计的交通灯控制系统可以较好的模拟十字路口出现的交通状况,使行人和车辆能有序的通行。 关键词:交通控制系统 单片机 AT89C51 数码管 按键 LED 内容 1系统方案论证 1.1设计方案 方案一:控制系统主要控制东西方向和南北方向交通状况,系统以单片机芯片STC89C51为主控单元,通过控制三种颜色LED灯的亮灭来指导个车道通行,上电时复位系统使系统进入运行状态。总体框图如下:(见51hei附件)
1.2功能概述 在东西方向和南北方向的十字路口分别设立红黄绿交通指示灯,用数码管倒计时显示。正常情况下两个主干线上的红黄绿灯进行交换。红灯亮表示禁止通行,绿灯亮表示可以通行,每次绿灯变红灯之前,黄灯亮五秒,方便那些未能及时通过十字路口的车辆能继续通过。十字路口设立数码管有倒计时功能,方便人们直关把握通过时间。本设计也考虑紧急情况,当按下紧急模式按键后,四个方向红灯都会常亮。对于夜晚车辆比较少,本设计设计了夜晚模式,按下按键后四个方向黄灯会常亮。 2系统硬件设计 2.1交通信号灯控制系统的组成 2.1.1 ATC89C51芯片 选用的ATC89C51与同系列AT89C51在功能上有明显的提高,最突出的是可以实现在线编程。用于系统的总控制。其主要功能列举如下: - 为一般控制应用的8位单片机
- 内部具有时钟振荡器
- 内部程序存储器(ROM)位4KB
- 内部数据存储器(RAM)为128B
- 外部程序存储器可扩充至64KB
- 外部数据存储器可扩充至64KB
- 32条双向输入线,且每条均可以单独做I/O的控制
- 5个中断源
- 2组独立的16位定时器
- 1个全双工串行通信端口
- 单片机芯片提供位逻辑运算指令
单片机引脚图如下: 
2.1.2交通灯控制系统构成 芯片ATC89C51一片,2段共阴极数码管四个,红黄绿发光二极管各四个,电阻若干,晶振一个,电容若干,按键若干。 交通灯控制系统结构框图:(见51黑附件) 系统各部分工作原理:采用单片机的I/O口P0口通过上拉电阻和交通灯相连接,P3.0、P3.1口接到数码管控制位上,控制数码管的显示,程序放在ATC89C51单片机的ROM中来设置初始时间,在十字路口的四组红、黄、绿交通灯中,由单片机的P1.5—P1.7、P1.0—P1.2、P2.5—P2.7、P2.0—P2.2分别控制东西南北方向的三色灯。由于交通灯为发光二极管并且阳极通过限流电阻与电源正极相连,因此I/O口输出电平时,与之相连的指示灯才会点亮,然后通过数码管倒计时时间。I/O口输出高电平时,相应指示灯会灭。由于ATC89C51本身集成了看门狗指令,当系统出现异常时看门狗会发出溢出中断。通过专用的端口输出,引起RESET复位信号复位系统。 2.2各单元电路模块功能 2.2.1时钟电路模块 本时钟电路由一个晶体振荡器12MHz和两个30pF的瓷片电容组成。时钟电路用于产生单片机工作所需的时钟信号,而是需所研究的是指令执行中各信号之 间的相互关系。单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格的工作。其电路图所示: 2.2.2复位电路模块 电容在上接高电平,电阻在下接低电平,中间为RST。这种复位电路为高电平复位。其工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电容对电阻充电,RST端电压慢慢下降,降到一定程度,即为低电平,单片机开始正常工作。其电路如下: 2.2.3信号灯输出控制模块 路口交通灯指示采用红、黄、绿发光二极管进行提示。其电路如下: 2.2.4时间显示电路模块 本系统使用数码管完成倒计时显示功能。以东西方向为例,数码管显示的数值从绿灯的设置时间最大值往下减,每秒钟减1,一直减到零。然后又从红灯的设置时间最大值往下减,一直减到零。接下来又显示绿灯时间,如此循环。系统共有4个两位LED数码管,分别放在模拟交通灯的上方。路口通行剩余时间采用红色7段数码管显示,采用共阴极数码管,如用单机IP0口加上拉电阻驱动,P3.0/P3.1口来控制数码管的位。其显示电路如下: 2.2.5按键输入模块 由于该系统具有夜间模式,紧急情况模式和交通灯倒计时时间设定功能,所有需要加上这些功能键,如下图所示:
3系统软件设计
3.2延时的设定 3.2.1 计数器初值计算 定时器工作时必须给计数器送初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0自动产生溢出中断请求。因此,可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算公式: TC=M-C 式中,M为计数器模值,该值与计数器工作方式有关。在方式0时M为 2^13;在方式1时M的值为2^16;在方式2和3中为2^8。 算法公式:T=(M-TC)T(计数)或TC=M-T/T(计数) T(计数)是单片机时钟周期T(clk)的12倍;TC为定时的初值 如果单片机的主脉冲频率为T(clk)12MHz,经过12分频 方式0 TMAX=2^13*1微妙=8.192毫秒 方式1 TMAX=2^16*1微妙=65.536毫秒 实现1秒钟方法: 采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。 这样每当T1到50毫秒时CPU就响应他的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断他是否为零。为0表示1秒已到可以返回到输出时间显示程序。
定时器需定时50毫秒,故T1工作于方式1。 初值计算:TC=M-T/T(计数)=2^16-50ms/1us=15536=3CB0H 延时程序: START:MOV TMOD,#10H ;令TO为定时器方式1 MOV TH0,#3CH ;装入定时器初值 MOV TL0,#0B0H SETB EA ;打开总中断 SETB ET1 ;开T1中断 SETB ER ;启动T1计数器 CLR FLAG1 CLR FLAG2 CLR FLAG3 MOV R3,#20H ;软件计数器赋初值 ORG 001BH LJMP DSD ORG 0300H DSD:INC R3 MOV TH0,#3CH ;重装定时器初值 MOV TL0,#B0H CJNE R3,#20,FH DEC R0 DEC R1 MOV R3,#00H FH: RETI 程序的软件延时: 单片机的工作频率为12MHz。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12M)=1us。可以知道具体每条指令的周期数,这样就可以通过指令的执行条数来确定1秒的时间。 具体的延时程序分析: DELY: MOV R4,#80H ;延时一秒主程序 DE2: LCALL DELAY1 DJNE R4,DE2 RET DELAY1: MOV R4,#00H ;延时125us子程序 D1: MOV R5,DL2 DJNE R4,D1 RET DELAY1为一个双重循环,循环次数为256*256=65536次,所以延时时间=65536*2=131072us约为125ms。 DELY R4设置为初值8,主延时程序循环8次,所以125ms*8=1s 用于四个数码管的倒计时显示,代码如下: sbit smg1=P3^0; //定义南北方向数码管低位 sbit smg2=P3^1; //定义南北方向数码管高位 sbit smg1=P3^2; //定义东西方向数码管低位 sbit smg2=P3^3; //定义东西方向数码管高位 void djsxs() { int b1=0,b2=0; b1=djs/10; //将倒计时时间的高位赋予b1 b2=djs%10; //将倒计时时间的低位赋予b2 P0=table[b1]; smg1=0; delayms(3); smg1=1; //显示b1 P0=table[b2]; smg2=0; delayms(3); smg2=1; //显示b2 P0=table[b1]; smg3=0; delayms(3); smg3=1; //显示b1 P0=table[b2]; smg4=0; delayms(3); smg4=1; //显示b2
仿真电路图:
实物: 
总结:
经过我反复思考及验证,逐渐完善电路以及程序 bug,具体程序及电路图请详见附录。通过此次课程设计的学习,我已掌握老师课堂所述内容,并应用于实践中,在设计及过程中,发现自己好多知识都掌握不扎实,通过询问其他同学,以及查阅资料等,已逐步掌握未扎实的内容,为此,我从心底不免升起一份感激之情,感谢老师为了我们着想,老师谢谢您!
单片机源程序如下:
- #include<reg52.h>
- #include<LED.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar time,second,seconde,miao1,miao0;
- sbit smg1=P2^5;//低位
- sbit smg2=P2^6;//东西高位
- sbit smg3=P2^7;//南北高位
- uchar code table1[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
- uchar code table2[]={0x6d,0x66,0x4f,0x5b,0x06,0x3f};
- uchar code table3[]={0x4f,0x5b,0x06,0x3f,0x06,0x3f};
- void display(uchar miao1,miao0);
- void delay(uint z);
- void init();
- void LED();
- void EW_LED();
- void NS_LED();
- void main()
- {
- init();//初始化子程序
- while(1)
- {
- display(miao1,miao0);
- LED();
- }
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar miao1,miao0)
- {
- smg1=0;
- P0=table1[miao0];
- delay(3);
- smg1=1;
- if(seconde<60)
- {
- smg2=0;
- P0=table2[miao1];
- delay(3);
- smg2=1;
- smg3=0;
- P0=table3[miao1];
- delay(3);
- smg3=1;
- }
- else if(seconde>=60)
- {
- smg3=0;
- P0=table2[miao1];
- delay(3);
- smg3=1;
-
- smg2=0;
- P0=table3[miao1];
- delay(3);
- smg2=1;
- }
- }
- void init()
- {
- smg1=0;
- smg2=0;
- smg3=0;
- P0=0xff;
- TMOD=0x01;
- TH0=0x3c;
- TL0=0xb0;
- EA=1;
- ET0=1;
- TCON=0x10;
- second=0;
- seconde=0;
- }
- void timer0() interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0;
- time++;
- if(time==20)
- {
- time=0;
- second++;
- seconde++;
- }
- if(second>=60)
- {
- second=0;
- }
- miao0=second%10;
- miao1=second/10;
- if(seconde>=120)
- seconde=0;
- }
- void LED()
- {
- if(seconde<60)
- {
- P1=0x12;//60s内东西红灯亮
- NS_LED();
- }
-
- else if(seconde>=60)
- {
- P3=0x12;//60s以上南北红灯亮
- EW_LED();
- }
- }
- void NS_LED()
- {
- if(seconde<36)
- {
- P3=0x28;//36s南北绿灯亮
- }
- else if(seconde>=36&&seconde<40)
- {
- NSRP=1;
- NSGP=0;//人行道绿灯灭,红灯亮
- NSG=0;
- NSY=seconde%2;//南北绿灯灭,黄灯闪烁
- }
- else if(seconde>=40&&seconde<60)
- {
- P3=0x11;//南北左转灯亮;人行红灯亮
- }
- }
- void EW_LED()
- {
- if(seconde>=60&&seconde<96)
- {
- P1=0x28;//东西绿灯亮
- }
- else if(seconde>=96&&seconde<100)
- {
- EWRP=1;
- EWGP=0;//人行绿灯灭,红灯亮
- EWG=0;
- EWY=seconde%2;//东西绿灯灭,黄灯闪
- }
- else
- {
- P1=0x11;//东西左转灯亮,人行红灯亮;
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载(word格式的设计报告文件):
交通灯设计.rar
(9.99 MB, 下载次数: 112)
|