单片机课程设计报告 - 十字路口交通灯控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宁夏大学新华学院课程考核
绪论
主要内容:
随着各种交通工具的发展和交通指挥的需要,第一盏名副其实的三色灯(红、黄、绿三种标志)于1918年诞生。
它是三色圆形四面投影器,被安装在纽约市五号街的一座高塔上,由于它的诞生,使城市交通大为改善。
黄色信号灯的发明者是我国的胡汝鼎,他怀着“科学救国”的抱负到美国深造,在大发明家爱迪生为董事长的美国通用电器公司任职员。
一天,他站在繁华的十字路口等待绿灯信号,当他看到红灯而正要过去时,一辆转弯的汽车呼地一声擦身而过,吓了他一身冷汗。
回到宿舍,他反复琢磨,终于想到在红、绿灯中间再加上一个黄色信号灯,提醒人们注意危险。
他的建议立即得到有关方面的肯定。
于是红、黄、绿三色信号灯即以一个完整的指挥信号家族,遍及全世界陆、海、空交通领域了。
交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。
模拟东西南北方向的十字路口交通灯信号控制情况。
以89C51单片机为核心芯片,采用中断方式实现控制。
本模拟系统由单片机硬/软件系统,两位8段数码管和LED灯显示系统。
和复位电路控制电路等组成,较好的模拟了交通路面的控制。
基本要求:
利用单片机的定时器产生秒信号,控制十字路口的红、绿、黄灯交替点亮和熄灭,并且用4只LED数码管显示十字路口两个方向的剩余时间。
要求能用按键设置两个方向的通行时间(绿、红等点亮的时间)和暂缓通行时间(黄灯点亮的时间)。
系统的工作应符合一般交通灯控制的要求。
参考文献:
[1] 张毅刚,彭喜元编著.《单片机原理与应用设计》
[2] 郭天祥编著.《新概念51单片机C语言教程:入门、提高、开发、拓展全攻略》
[3]编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。
[4]硬件实验部分可选用实验箱测试或Proteus仿真软件实现。
目录
1 绪论 (2)
1.1主要内容 (2)
1.2 基本要求 (3)
1.3 参考文献 (3)
2 设计方案简介 (5)
3 系统需求分析 (6)
4 单片机概述 (6)
5 本设计的简要概述 (7)
6 本设计主要包括几个主要的元件 (8)
7 模块设计 (9)
7.1硬件原理图 (9)
7.2软件系统结构图 (10)
7.3软件流程图 (10)
8 源程序 (12)
9 主要函数说明 (33)
对本设计的简单评述 (34)
附录A (35)
附录B (35)
设计方案简介:
交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本设计系统由单片机I/O口系统、交通灯状态显示系统、复位电路等几大部分组成。
系统具有基本的交通灯功能,较好的模拟实现了十字路口可能出现的状况。
本设计系统利用单片机的工作原理设计一个十字路口交通信号灯,要求东、西、南、北四个方向各有红黄绿色三个灯,当东西方向亮绿灯时,南北方向红灯亮起;反之,如果南北方向亮绿灯,同时东西方向亮绿灯;绿灯亮时车辆行驶,红灯亮时车辆停止。
即在同一时间内保证只有两个对应方向的车辆可以行驶。
本设计系统软件上采用Keil uVision3、Proteus。
使用C51编程,主要编写了主程序、中断子程序、延时子程序、数码管显示子程序、交通控制子程序、矩阵键盘子程序。
本设计系统经过整机调试,实现了对十字路口交通灯运作与设置的模拟。
系统需求分析:
本设计系统单片机89C51为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强、成本较低。
本设计就是采用单片机模拟十字路口交通灯的各种状态显示。
利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。
红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
用红、绿、黄发光二极管作信号灯,8 管共阴极数码管显示剩余时间,矩阵键盘用来设置交通灯的显示时间和状态。
单片机概述:
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
本设计的简要概述:
本设计系统利用单片机的工作原理设计一个十字路口交通信号灯,要求东、西、南、北四个方向各有红黄绿色三个灯,当东西方向亮绿灯时,南北方向红灯亮起;反之,如果南北方向亮绿灯,同时东西方向亮绿灯;绿灯亮时车辆行驶,红灯亮时车辆停止。
说明:南北方向红绿灯时间:红灯 15s 绿灯 15s 黄灯5s 东西方向红绿灯时间:红灯 20s 绿灯 10s 黄灯5s
按键1:暂停
按键2:设置时间按钮
按键3:设置完成重启
按键4:测试交通灯各个设备的好坏
按键5:设置南北绿灯时间 +
按键6:设置南北黄灯时间 +
按键7:设置南北绿灯时间 - 保证交通合理,绿灯最小值计时3s,绿灯不再减少
按键8:设置南北黄灯时间 -
按键9:设置东西绿灯时间 +
按键10:设置东西黄灯时间 +
按键11:设置东西绿灯时间 -
按键12:设置东西黄灯时间 -
按键13:南北紧急情况:南北绿灯常亮东西红灯常亮
按键14:东西紧急情况:东西绿灯常亮南北红灯常亮
本设计主要包括几个主要的元件:
1.AT89C51:
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
为本科单片机教学主要芯片
TMS320F2812,DSP原理与应用技术。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示。
现在AT89S51/52已经取代了AT89C51/52。
2.4*4矩阵键盘:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)
就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的
键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
3.RESPACK-8:
一般是接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。
排阻就是好多电阻连载一起,他们有一个公共端。
硬件原理图:
Proteus 仿真绘制软件系统结构图和软件流程图:
(1)系统结构图:
(2)流程图:
十字路口交通灯控制流程图
源程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //共阴极数码管码表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xC9,0xFF,0x40 };//设置码,测试码,不计时码
void delay(uint x);//延时函数
void display(uchar,uchar,uchar,uchar); //数码管显示函数void scankeys(); //键盘函数
void traffic(); //交通灯函数
uchar num,num1,num2, //1南北 2东西
shi1,ge1,shi2,ge2,
value1,value2,//南北绿灯时间黄灯时间
value3,value4,//东西绿灯时间黄灯时间
count1,count2,flag1,flag2; //南北标记东西标记南北设置标记东西设置标记
void main()
{
TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1)
TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
/*初状态*/
value1=15; //南北黄绿灯默认值
value2=5;
value3=10; //东西黄绿灯默认值
value4=5;
num1=value1; //南北数码管先绿灯时间
num2=value2+value1;//东西红灯时间 20s
P1=0x41;//初始状态:东西红灯南北绿灯 20 15
while(1){
if(num==20) //定时器1s
{
num=0;
num1--;
num2--;
traffic();
shi1=num1/10;
ge1=num1%10;
shi2=num2/10;
ge2=num2%10;
}
scankeys();
display(shi1,ge1,shi2,ge2);
}
}
/************************红绿灯主控制程序*******************
说明:南北方向红绿灯时间:红灯 15s 绿灯 15s 黄灯5s 东西方向红绿灯时间:红灯 20s 绿灯 10s 黄灯5s
*********************************************************** */
void traffic()
{
if(num1==0){ //1南北
count1++; //南北标志位
if(count1==1){ //南北方向红灯15s倒计时结束,
P1=0x42; //东西方向仍为红
灯,南北方向变为黄灯
num1=value2; //黄灯时间为5s
}
if(count1==2){ //南北方向黄灯5s倒计时结束,
P1=0x14; //东西方向变为绿灯,南北方向变为红灯
num1=value3+value4; //南北方法红灯时间为15s
}
if(count1==3){ //南北方向红灯15s倒计时结束,
P1=0x41; //东西方向变为红灯,南北方向变为绿灯
num1=value1; //南北方向绿灯时间15s
count1=0; //重置南北标志位
}
}
if(num2==0){ // 2东西
count2++; //东西标志位
if(count2==1){ //东西方向红灯20s
倒计时结束,
P1=0x14; //东西方向变为绿灯,南北方向变为红灯
num2=value3; //东西方向绿灯时间10s }
if(count2==2){ //东西方向绿灯10s倒计时结束,
P1=0x24; //东西方向变为黄灯,南北方向变为仍为红灯
num2=value4; //东西方向黄灯时间5s }
if(count2==3){ //东西方向黄灯时间5s 倒计时结束,
P1=0x41; //东西方向变为红灯,南北方向变为绿灯
num2=value1+value2; //东西方向红灯时间20s
count2=0; //重置东西标志位
}
}
}
/************************************数码管显示子函数********************************************/
void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) {
uchar temp;
temp=P2;
P2=0xfe;
P0=table[shi1];
delay(5);
P2=0xfd;
P0=table[ge1];
delay(5);
P2=0xfb;
P0=table[shi2];
delay(5);
P2=0xf7;
P0=table[ge2];
delay(5);
}
/*************************************延时子函数********************************************/
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/*************************4*4矩阵键盘功能子函数********************
说明:
*********************************************************** ********/
void scankeys()
{
uchar temp,key;
P3=0xfe; //第一行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10); //按键去抖
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: key=0; break;
case 0xde: key=1; break;
case 0xbe: key=2; break;
case 0x7e: key=3; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0) //按键1:
{
TR0=~TR0; //定时器取反
flag1=~flag1; //南北能够设置标志 0有效
flag2=~flag2; //东西能够设置标志
}
if(key==1&&flag1==0) //按键2:
{
TR0=0;
P1=0x44; //禁止东南西北车辆全为红灯可以设置
shi1=ge1=shi2=ge2=16; //数码管显示设置符号}
if(key==2&&flag2==0) //按键3:
{
TR0=1;
num=0; //定时器初始化
P1=0x41; //重新开始初状态
num1=value1; //南北数码管绿灯时间
num2=value2+value1; //东西数码管红灯时间
shi1=num1/10;
ge1=num1%10;
shi2=num2/10;
ge2=num2%10;
}
if(key==3&&P1==0x44){ //按键4: P1=0xff;
delay(1000);
P1=~P1;
shi1=ge1=shi2=ge2=17;
P1=0x44;
}
}
}
P3=0xfd;//第二行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xed: key=0; break;
case 0xdd: key=1; break;
case 0xbd: key=2; break;
case 0x7d: key=3; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){ //按键5:
num1=value1;
if(num2!=159){ //@@@@保证交通合理,红灯最大值计时
159s,绿灯不再增加
num1++;
value1=num1;
}
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==1&&P1==0x44){ //按键6:
num1=value2;
if(num2!=159)
{
num1++;
value2=num1;
}
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==2&&P1==0x44&&value1>3){ //按键7: num1=value1;
num1--;
value1=num1;
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
if(key==3&&P1==0x44&&value2>3){ //按键8: num1=value2;
num1--;
value2=num1;
shi1=num1/10;
ge1=num1%10;
num2=value1+value2;//显示东西红灯时间
shi2=num2/10;
ge2=num2%10;
}
}
}
////||||||||||||||||||
P3=0xfb;//第三行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xeb: key=0; break;
case 0xdb: key=1; break;
case 0xbb: key=2; break;
case 0x7b: key=3; break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){ //按键9:
num2=value3;
if(num1!=159){
num2++;
value3=num2;
}
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间shi1=num1/10;
ge1=num1%10;
}
if(key==1&&P1==0x44){ //按键10: num2=value4;
if(num1!=159){
num2++;
value4=num2;
}
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
if(key==2&&P1==0x44&&value3>3){ //按键11: num2=value3;
num2--;
value3=num2;
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
if(key==3&&P1==0x44&&value4>3){ //按键12: num2=value4;
num2--;
value4=num2;
shi2=num2/10;
ge2=num2%10;
num1=value3+value4;//显示南北红灯时间
shi1=num1/10;
ge1=num1%10;
}
}
}
P3=0xf7;//第四行线 2未用
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0; if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xe7:
key=0;
break;
case 0xd7:
key=1;
break;
case 0xb7:
key=2;
break;
case 0x77:
key=3;
break;
}
while(temp!=0xf0) {
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){ //按键13: P1=0x41;
shi1=ge1=shi2=ge2=18;
}
if(key==1&&P1==0x44){ //按键14: P1=0x14;
shi1=ge1=shi2=ge2=18;
}
if(key==2&&P1==0x44){//按键15:
}
if(key==3&&P1==0x44){//按键16:
}
}
}
}
/************************定时器T0 中断子程序*********************************/
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //定时50ms
TL0=(65536-45872)%256;
num++;
}
主要函数说明:
本程序用C51编写,在main()函数里面包含:
1) 延时函数:delay(uint x); 主要控制数码管动态显示,x用来控制延时长短
2) 十字路口剩余时间数码管显示函数:display(uchar,uchar,uchar,uchar); 给P0东西南北方向数码管每段十位、个位送数据
3) 键盘函数:mkeys();交通灯时间、状态的设置
4) 交通南北东西灯红黄绿工作顺序函数:traffic()。
交通灯运行规则控制
对本设计的简单评述:
通过这次课程设计,使我掌握了交通灯控制的基本思想与原理,学习到了一些有用的专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,电路图的绘制以及在常用编程设计思路技巧的掌握方面都向前迈了一大步。
而且本次课程设计是分三人小组设计模式,增强了我的团队意识,以及团队之间共同商量问题,解决问题的能力。
本次课程设计的过程是艰辛的,不过收获却是很大的。
在设计过程中,会出现了一些问题,但都是常见的小问题,如:在代码中中英文符号转换问题,输入字母出错,程序语法错误,代码维护困难等;在调试过程中出现异常,显示效果不是理想的效果。
不过经过调试修改,代码模块化,小组成员的共同商量与检查这些问题都一一解决,程序顺利完成,并实现了预期的功能。
综合课程设计让我们把课堂上学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我们通过查阅相关书籍、资料以及小组成员之间的交流、已经老师的耐性指导把困难统统克服。
由于使用的是单片机作为核心的控制元件,使得电路的可靠
性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,不过设计也有很多不足之处,譬如红灯和绿灯的切换还不够迅速,红绿灯规则不效率还不是很高,键盘效率不太高等等,这需要在实践中进一步完善,希望在今后的学习中学习更多新知识然后得以完善。
当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,在今后的学习和工作中设计出更好的作品!同时感谢老师和同学的耐心指点,使我能够顺利的完成本次任务。