交通灯课程设计.docx
《交通灯课程设计.docx》由会员分享,可在线阅读,更多相关《交通灯课程设计.docx(29页珍藏版)》请在冰点文库上搜索。
交通灯课程设计
《单片机技术》课程设计说明书
基于单片机的简易交通灯设计
院、部:
电气与信息工程学院
学生姓名:
方挣挣
指导教师:
桂友超职称讲师
专业:
电子信息工程
班级:
电子1004班
完成时间:
2013-6-4
摘要
对基于单片机的交通灯控制系统进行了设计。
系统功能为:
以MCS-51系列单片机作为控制核心,设计并制作交通灯控制系统,东西南北四个方向具有左拐、右拐、直行及行人4种通行指示灯,用计时器显示路口通行转换剩余时间,在特种车辆如119、120通过路口时,系统可转为特种车辆放行,其他车辆禁止通行状态。
在对系统功能分析的基础上,选择性能较优的LED动态循环显示方案进行了设计。
设计包括硬件和软件两大部分。
硬件部分包括单片机最小系统、交通灯显示二部分。
选用Atmel公司的AT89S52单片机作为控制核心,东西南北四个方向设置了LED时间显示和交通灯显示,时间显示采用二位LED显示器,交通灯显示则采用红绿黄三种高亮发光二极管来模拟。
软件采用了模块化的设计方法,主要分为主程序、定时器中断服务子程序、倒计时显示子程序、交通灯模拟显子程序四部分。
关键词:
单片机;AT89S52;交通灯
ABSTRACT
TrafficlightcontrolsystembasedonSCM(SingleChip
Microcomputer)isdesignedinthispaper.Systemrequiresthat
MCS-51seriesSCMisusedasCPU.Trafficlightcontrolsystem
shouldbedesignedandmade.Therearefourgroupslightwhich
indicatetoturnleft,turnright,andgostraightaheadand
pedestrianaccessineast,west,northandsouthfour
directions.Timershowstrafficconversionremaindertime.
Whenspecialvehicles,suchas119,120gothrough,thesystem
canautomaticallyallowspecialvehiclesrunningandother
vehiclesisprohibited.
Basedonanalysisofthesystemfunctions,threeschemesareputforward.Bycomparison,LEDdynamiccycledisplayscheme
hasbetterfunctionsanditisselectedtobedesigned.The
designincludeshardwarepartandsoftwarepart.Hardwarehas
threeparts.TheyareSCMsystem,LEDtimedisplay,traffic
lights.AT89S52SCMisselectedascontrolCPU.LEDdisplayand
trafficlightsaresetineast,west,northandsouthfour
directions.ThreeLEDmonitorsareusedtoshowtime.Highlight
andred-greentwoclortrafficlightsareusedastraffic
lights.Softwareisdesignedbymodule.Itisdividedintomain
program,timerinterruptingservicesubroutine,LEDdisplay
subroutine,trafficdisplaysubroutine.
Keywords:
scm;AT89S52;trafficlight
1设计课题任务、功能要求说明及总体方案介绍
1.1设计课题任务与功能要求
设计一个具有特定功能的十字路口交通灯。
该交通灯上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
按开始键则开始工作,按结束键则返回“P.”状态。
要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。
有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过。
1.2设计课题总体方案介绍及工作原理说明
本设计采用单片机以及其外部设备组成硬件电路,其中包括单片机、数码管显示器、按键。
数码管的P0口接段控,P2口接位控。
键盘接在P1口上。
除此之外还有晶振电路,复位电路,电源电路和下载口电路。
方案设计框图如图1所示:
图1系统设计框
2设计课题硬件系统的设计
2.1设计课题硬件系统各模块功能简要介绍
2.1.1主控制系统模块
图2.1.1主控制系统模块
2.1.2按键电路
图2.1.2按键电路
按键电路的设计就是在一端公共接地,另一端通过上拉电阻接到P1口,当有按键按下,相应的口就会变成低电平,产生一个下降沿。
2.1.3流水灯电路
图2.1.3流水灯电路
流水灯电路直接挂接在单片机的P3口上,采用共阳接法。
2.1.4数码管电路
图2.1.4数码管电路
数码管的段控口接在单片机的P0上,而位控口通过三极管接在单片机的P2口上。
2.1.5下载口电路
图2.1.5下载口电路
下载口的1脚接P1.5口,2脚悬空,3脚接单片机的复位口,4脚接P1.7口,5脚接P1.6口,6脚接vcc,7、8、9、10脚接地。
3设计课题软件系统的设计
3.1设计课题软件系统各模块功能简要介绍
3.1.1数码管显示子程序
显示函数主要完成数码管的动态显示,将相应的段控码送往P0口,相应的位控码送往P2口。
实现显示需要的字符信息。
3.1.2延时子程序
其中包括延时1ms函数。
延时函数在显示函数中用到,由于时间比较短,就采用纯软件的方法延时。
3.1.3主程序
主函数是程序的入口,在主函数中一直键扫描,当没有键按下时一直保证显示P点。
当S1键按下后,开启交通灯;当S2键按下后,关闭交通灯,当S3键按下后,是应急车道通车。
3.1.4初始化函数
初始化函数主要是对定时计数器0、定时计数器1的一些设置和中断的一些控制。
3.1.5定时器0中断函数
函数是对交通灯主通道和次通道进行定时,以刷新数码管显示;还控制黄、绿、红灯的显示。
3.1.6定时器1中断函数
此函数主要是对应急事件10s的定时,以及对主、次通道黄灯闪烁的定时控制。
3.2设计课题软件系统程序流程框图
3.2.1主程序流程图
图3.2.1主程序流程图
3.2.2数码管显示函数流程图
图3.2.2数码管显示函数流程图
3.2.3定时器中断0函数流程图
图3.2.3定时器0中断函数流程图
3.2.4定时器中断1函数流程图
图3.2.4定时器1中断函数流程
4设计结论及体会
4.1设计课题的设计结论及使用说明
本次课程设计完成了交通灯所要求的基本功能,经测试,也看到了各灯亮的情况。
在设计过程中,遇到了很多困难,但积累了许多宝贵经验。
本次设计中,S1键按下后,开启交通灯;当S2键按下后,关闭交通灯,当S3键按下后,是应急车道通车。
4.2设计课题的误差分析
该交通灯在运行中存在一定的误差。
由于编程时采用的是定时器定时,时间不能保证的很精确,因此会产生一定的误差。
同时也存在很多硬件系统上的问题。
如12MHZ晶振,虽说频率稳定度很高,但终究还是有误差的。
并且也有外部因素的影响,如温度温度、湿度等干扰。
故应该让单片机工作在适宜的环境下,同时采用实时时钟芯片,这样能将误差降低到最小。
4.3仿真结果图
图4.3.1上电显示班级、学号
图4.3.2应急时间
图4.3.3红灯等待时间
4.4实物结果图
图4.4.1上电显示班级、学号
图4.4.2通车时间
图4.4.3红灯等待时间
图4.4.4应急时间
4.5心得体会
第一,在编写软件中,在此过程中我更为熟练得掌握汇编语言各种指令的使用方法,掌握了keil软件的使用。
第二,在软件调试过程中,使我又一次复习了keil和proteus联合使用的方法。
在调试时曾经遇到数码管倒计时显示时间两位不能同时显示,后来经过查找资料不断调试才领悟到原来在显示的过程中要循环显示才能使得显示稳定下来。
第三,通过这次课程设计,我掌握了用单片机设计交通灯的基体方法,增强了我寻找问题,解决问题的能力。
培养了我的设计思维,此次课程设计的成功不仅帮助我更好地掌握书本知识,尤其重要的是增强了我的自信,培养了我独立思考的能力。
但是此次设计不中之处是不能实现左右弯灯,不有人行道控制灯,不能进行流量控制。
结束语
本次课程设计的过程是艰辛的,不过收获却是很大的。
本次课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,但通过查阅相关书籍、资料以及和周围同学交流后都得以一一解决。
由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅速,红绿灯规则效率还不是很高等等,这需要在实践中进一步完善。
致谢
本课题在选题及进行过程中得到了桂友超老师的指导以及同学的热心帮助,在这里特意感谢在课程设计中帮助过我的老师和同学们。
感谢桂老师的严格要求,严教之下才会更加认真的去学,将知识归于己用,所以很感谢桂老师。
在此,谨向老师们致以衷心的感谢和崇高的敬意!
另外,还要感谢所有同学对我的指导和帮助,是他们不厌其烦的帮助我学习自己不懂的东西。
正是由于他们的帮助才让这此课程设计最终可以顺利有效的做完。
参考文献
[1]李广弟、朱月秀、冷祖祁,《单片机基础》,北京航空航天大学出版社。
[2]华成英童诗白,《模拟电子技术基础(第四版)》,高等教育出版社。
[3]康华光,《电子技术基础数字部分(第五版)》,高等教育出版社。
[4]杨居义,《单片机课程设计指导》,清华大学出版社。
附录A
图A1电路原理图
图A2PCB图
附录B
表1设计所用元器件清单
序号
名称、大小
数量
1
电阻200Ω
1个
2
电阻470Ω
24个
3
电阻1KΩ
3个
4
电阻4.7KΩ
1个
5
电容22μF
1个
6
电容33pF
2个
7
18B20
1个
8
AT89S52
1个
9
单排插
40个
11
四位一体共阳极数码管
2个
12
LED
9个
13
PNP
9个
14
四脚按钮
9个
15
六脚开关
1个
16
USB电源接口
1个
17
下载口
1个
18
晶振12MHz
1个
附录C
/*项目名称:
交通灯*/
/*时间:
2013.6.1*/
/*作者:
方挣挣*/
/*P2口位控口,P0口段控口,P1口按键,P3口发光二极管*/
/********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
/*共阳数码管字型码数组*/
/*0,1,2,3,4,5,6,7,8,9,P.,灭*/
charcodedis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x21,0xff};
/*共阳数码管位控码数组(从右往左点亮,反向驱动)*/
charcodeweikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
charfind_code[8];
sbitS2=P1^0;//S1键启动交通灯控制器
sbitS3=P1^1;//S2键回归“班级”状态
sbitS4=P1^2;//S3键处理紧急状况
uchartime;
voidDelayX1ms(uintcount)//1ms延时函数
{
uintj;
while(count--!
=0)
{
for(j=0;j<80;j++);
}
}
/*********************显示函数*****************************/
voiddisp()
{
chari;
chark;
for(i=0;i<8;i++)
{
P2=weikong_code[i];
k=find_code[i];
P0=dis_code[k];
DelayX1ms
(1);
}
}
/********************1s延时********************************/
voiddelay1s()
{
TMOD=0X01;
EA=1;
ET0=1;
TH0=0x3C;//定时器定时50Ms
TL0=0XB0;
TR0=1;
PT0=1;
do{disp();}while(time!
=20&&S3&&S4);//有条件转移
TR0=0;
time=0;
}
voidtime_()interrupt1//中断程序
{
time++;
TH0=0x3C;
TL0=0XB0;
}
/********************500ms函数********************************/
voiddelay500ms()
{
TMOD=0X01;
EA=1;
ET0=1;
TH0=0x3C;
TL0=0XB0;
TR0=1;
PT0=1;
do{disp();}while(time!
=10);//有条件转移
TR0=0;
time=0;
}
/**************************紧急函数**************************/
voidjinji()
{
ucharf;
for(f=10;f>0;f--)
{
P3=0x6F;
find_code[1]=f/10;
find_code[0]=f%10;
delay500ms();
delay500ms();
disp();
}
}
/**********************主函数******************************/
voidmain()
{
while
(1)
{
charm,a;//上电显示“班级、学号”状态
TR0=0;
find_code[0]=9;
find_code[1]=1;
find_code[2]=10;
find_code[3]=4;
find_code[4]=0;
find_code[5]=0;
find_code[6]=1;
find_code[7]=11;
disp();
while(!
S2)
{
TR0=1;
find_code[0]=12;
find_code[1]=12;
find_code[2]=12;
find_code[3]=12;
find_code[4]=12;
find_code[5]=12;
find_code[6]=12;
find_code[7]=12;
while(S3)
{
P3=0XAF;
for(m=60;m>0&&(S3);m--)
{
if(!
S4)
jinji();
find_code[1]=m/10;
find_code[0]=m%10;
delay1s();
disp();
}
for(a=3;a>0&&S3;a--)
{
if(!
S4)
jinji();
find_code[1]=a/10;
find_code[0]=a%10;
P3=0xeF;
delay500ms();
P3=0xcF;
delay500ms();
disp();
}
P3=0X77;
for(m=30;m>0&&(S3);m--)
{
if(!
S4)
jinji();
find_code[1]=m/10;
find_code[0]=m%10;
delay1s();
disp();
}
for(a=3;a>0&&S3;a--)
{
if(!
S4)
jinji();
find_code[1]=a/10;
find_code[0]=a%10;
P3=0X7F;
delay500ms();
P3=0X7B;
delay500ms();
disp();
}
}
P3=0xFF;
}
}
}