《单片机课程设计--基于51单片机的交通灯》由会员分享,可在线阅读,更多相关《单片机课程设计--基于51单片机的交通灯(16页珍藏版)》请在金锄头文库上搜索。
1、 物理与信息工程学院单片机课程设计题 目:基于 51 单片机的交通灯学 院:物理与信息工程学院专 业:自动化目录1、概述-32、系统各部分硬件的设计-4(1)总的硬件设计流程-4(2)各硬件部分的电路设计-53、软件的分块流程图及程序编写-74、软件仿真图-155、心得体会-161、概述、概述背景背景:交通的发达,标志着城市的发达,相对交通的管理则显得越来越重要。 对于复杂的城市交通系统,为了确保安全,保证正常的交通秩序,十字路口的 信号控制必需按照一定的规律变化,以便于车辆行人能顺利地通过十字路口。 正常情况下,十字路口的红绿灯应交替变换,考虑紧急情况下,如有救护车或 警车到来时,应优先让其
2、通过。 交通灯在安全行车过程中起着十分重要的作用, 现在交通灯一般设在十字 路口, 在醒目位置用红、绿、黄三种颜色的指示灯, 加上一个倒计时的显示计 时器来控制行车, 对于一般情况下的安全行车、车辆分流发挥着作用, 但根据 实际行车过程中出现的情况, 主要有如下几个缺点: 1两车道让车轮流放行时间 相同且固定, 在十字路口, 经常一个车道为主干道,车辆较多, 放行时间应该长 些; 另一车道为副干道, 车辆较少,放行时间短些。2 没有考虑紧急车通过时, 两车道应采取的措施, 譬如, 有消防车通过执行紧急任务时, 两车道的车都应 停止, 让紧急车通过。根据行车过程中出现的实际情况, 如何全面有效地
3、利用 交通灯指示交通情况, 本人尝试用单片机来控制交通灯, 在软、硬件方面采取 一些改进措施, 使交通灯在控制中灵活而有效。 实现的任务实现的任务:单片机来实现,根据设计要求,交通信号灯控制器的外部输出信号为主、 副车道红、黄、绿灯共 12 个驱动信号;编程使相应位复/置位来实现信号灯的 亮/灭控制,使得十字路口的红、绿灯交替点亮;在灯色交换时,黄灯闪烁提醒。设计要求有紧急车辆通过时,十字路口均显示红灯。可以通过软件中断 来完成紧急任务,定义 T0 为计数中断并为下降沿触发,编写对应中断向量子程 序和中断服务程序,完成中断处理。 设计还对定时控制有所要求。对于精确定时,应该用计数器加以控制,
4、硬件实现复杂度增加。考虑到该设计对时间精度要求不高,所以采用软件定时 可以大大简化电路。先计算出程序单部执行的时间,设置循环参数,利用 if 语 句按设计要求完成定时控制。 (4)当南北方向车辆较多,东西方向车俩较少时,通过开关来改变各方向 的灯来调节。 2、系统硬件的设计与流程系统硬件的设计与流程晶振电路输入控制输出显示外围功能器 件单片机晶振和复位电路:单片机系统的必要组成部分,控制单片机的机器周期和功 能复位通用的晶振电路 单片机的晶振电路是一种典型电路,分为内部时钟方式和外部时钟方式两 种。输入控制:是指在一定要求下,采取何种形式的控制方式来实现单片机 不同功能的转换,以及控制指令以何
5、种方式传送到单片机 输出显示:是指单片机将需要显示的数据发送到 LED、液晶等显示模块, 并控制 LED 等显示模块按照一定的格式显示的功能。外围功能器件:单片机只是控制器件,对应与一定的设计要求,需要加 入特定功能的器件。单片机的最简单系统是指单片机能正常工作所必须的外围 元件,主要由单片机、晶振电路和复位电路构成。而输入/输出部分则通过单片机的 I/O 口实现。 开关用来实现特殊的功能,当有救护车等出现时,按下开关,所有灯变成 红灯,让救护车通行。3 3、软件的分块流程与程序编写软件的分块流程与程序编写 1、编写延时程序 void delay0(uint z) uint i,j; for(
6、i=0;i0;y-)for(i=1250;i0;i-) for(k=180;k0;k-); 2、定时 1ms 的程序代码当单片机的晶振为 12MHz 时,计数值 1 代表的时间就是 1us。 计数器的容量是 16 位,也就是最大的计数值达到 65536,因此计数计到 65536 就会产生溢出。Void t0(void)interrupt 1 using 0 TH0=(65536-1000)/256; /设置定时器高 8 位初值TL0=(65536-1000)%256; /设置定时器低 8 位初值 3、外部中断void xint0() interrupt 0 /外部中断 INT0 GREEN_Z
7、HU_ON();void xint1() interrupt 2 /外部中断 INT1 GREEN_ZHI_ON(); void GREEN_ZHU_ON()/外部中断 INT0 显示子程序P1=0xdb;P3_0=0;P3_1=1;P3_4=1;P3_7=0;delay0(10000);void GREEN_ZHI_ON()/外部中断 INT1 显示子程序 P1_2=0;P3_0=0; P1_5=1; P3_7=1; P1_0=1; P1_6=1; P1_3=0; P3_1=0; P1_1=1; P1_4=1; P3_4=1;P0=0xff; P2=0X00; delay0(1000); r
8、eturn;开 始计数单元清零TH0,TL0 装入初值各状态的定义初始状态东西绿灯,南北红灯延时 30s显示数据处理东西黄灯亮,南北红灯闪烁延时 5s东西红灯亮,南北绿灯亮东西红灯闪烁,南北黄灯亮显示数据处理延时 20s显示数据处理延时 5s显示数据处理四、总的程序#include#include/做移位的一个头文件头文件 #define uchar unsigned char /宏定义 #define uint unsigned int/宏定义 sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P14;
9、 sbit P1_5=P15; sbit P1_6=P16; sbit P1_7=P17; sbit P3_0=P30; sbit P3_1=P31; sbit P3_4=P34; sbit P3_7=P37; uint aa,a,b,c=10; /*数码管显示 0-9*/ uint code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/*子函数声明*/void delay0(uint z); void display(uint a,uint b); void flag1(); void flag2(); void flag
10、3(); void flag4(); void xint0();void xint1(); void xtimer0(); void GREEN_ZHU_ON(); void GREEN_ZHI_ON();/*/ void main() EA=1;/开中断 EX0=1;/允许外部中断 INT0 中断 IT0=0;/定义 INT0 触发方式 PX0=1;/中断优先级高 EX1=1;/允许外部中断 INT1 中断 IT1=0;/定义 INT1 触发方式 PX1=1;/中断优先级高while(1)flag1(); /东西方向绿灯亮,南北方向红灯亮flag2(); /东西方向黄灯亮,南北方向红灯亮fl
11、ag3(); /东西方向红灯亮,南北方向绿灯亮flag4(); /东西方向红灯闪烁,南北方向黄灯亮 void flag1()/东西方向绿灯亮,南北方向红灯亮 30s int time;time=11;/变量赋初值 TMOD=0x01;/定时器 T0 工作于方式 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256;/定时 50ms EA=1;/开中断 ET0=1;/开定时中断 TR0=1;/开定时器 T0while(1) P1=0x9e; /东西方向绿灯亮,南北方向红灯亮 30msP3_0=1;P3_1=1;P3_4=1;P3_7=0;if(aa=20)
12、/定时 20*50MS=1S aa=0;/定时完成一次后清 0 time-;/变量自减 if(time=5) break; /跳出整个循环 b=time%100/10;/显示十位 a=time%10;/显示个位 display(a,b); void flag2() int time; time=6;/变量赋初值 TMOD=0x01;/定时器 T0 工作于方式 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256;/定时 50msEA=1;/开中断 ET0=1;/开定时中断 TR0=1;/开定时器 T0 while(1) /东西方向黄灯闪烁,南北方向红灯闪
13、烁 P1_0=1;P1_1=0;P1_2=1;P1_3=1;P1_4=1;P1_6=1;P1_7=0;P3_0=1;P3_1=1;P3_4=1;if(aa=20)/定时 20*50MS=1S aa=0;/定时完成一次后清 0 time-;/变量自减 P1_1=P1_1; P1_7=P1_7; if(time0;y-)for(i=1250;i0;i-) for(k=180;k0;k-); 软件仿真图软件仿真图5 心得体会心得体会通过做这次课程设计报告,我自己收获了很多知识,也有很多的感受和体会。首先,我感触最深的是,理论的学习必须与实际的动手操作相结合。在刚刚学习单片机时,我们对于知识的学习主要
14、来自于书本以及老师的讲解,平时的上机实验也主要是以熟悉软件为目的,学习怎么应用软件。我们自己很少动手设计程序及用仿真进行验证。在做实验设计的过程中,我了解到只会书本的知识对于我们自行设计并没有很大的用处,并且学习是不容许有参假的成分,如果你读不懂程序,不会应用软件,那么你很难完成自己的设计报告。其次,通过这次的报告的设计,增强了我自主学习的能力,以前的学习主要来自于课本,我很少会通过其他途径进行学习。由于在完成这次的报告的过程中,我们会遇到很多我们以前没有见过的问题,那么,通过上网查找答案及向学长询问,往往能帮助我们学到更多的知识。第三点也是我觉得自己存在的很严重的一点的毛病就是,在学习,我自己不是一个特别愿意与人交流的人。在做这次的报告时,我自己能感觉到自己的缺点所带来的弊端,有时自己长久发现不了的问题,经别人一点拨就很轻松的解决,所以,学习不能闭门造车,要学会与别人多交流。然后我觉得这次的做报告的经历有苦有乐,对于我做的这个题目,对有的同学来说很简单,但是对我来说却有一定的难度,在设计报告之前,很多别人写的程序,我都看得不大懂,然后对使用protues 也不是很熟练,所以做起来比较痛苦,也是一个模块要做很久,但是当这部分做成功之后,又是一件很快乐的事。