《单片机交通灯设计报告22.doc》由会员分享,可在线阅读,更多相关《单片机交通灯设计报告22.doc(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、山东大学威 海 分 校课 程 设 计 报 告设计题目: _ 红绿灯控制器设置_ 姓名: 学号: 院系: 信息工程学院 专业: 电子信息科学与技术 年级: 07级 1班 2010年 7月 19日27目 录目 录1摘 要2关 键 词2Abstract2Keywords21、引言22、设计方案论证/选择32.1 方案一32.2 方案二32.3 方案三42.4 方案选择43、概述/简介43.1材料准备43.2仿真软件简介44、课题描述与分析54.1课题描述54.2本系统的工作流程55、课题设计65.1软件设计:6电源模块7单片机基本工作模块7串口下载模块8数码管显示模块8按键控制模块9HYM1380/
2、HYM1381 串行时钟芯片9EEPROM模块106、系统测试106.1硬件调试106.2软件调试107、结论11参考文献12附 录13谢 辞27摘 要红绿灯控制器是以51单片机(STC89C52)为核心,基于keil编制软件系统,结合4位数码管和发光二极管输出结构和按键的输入结构,能够准确显示红绿灯控制状态,并且可以通过按键完成主干道和次干道的通行时间及黄灯点亮的时间的手动设置,在没有手动设置通行时间时,系统自动所要求的模式进行工作,并且所做制作的系统中包含复位模块、ISP在线下载模块、DS18B20测温模块、EPROM存储模块、串口下载模块以及自制5V电源。各个模块之间协同工作,使系统在稳
3、定完成基本要求功能的时候,实现与电脑串口通信。关 键 词单片机,红黄绿灯,数码管,4*4按键,电源AbstractThe traffic light controller is based on 51 single-chip microcomputer (STC89C52) as the core, based on the preparation keil software system, combined with digital control and four light-emitting diode structure and the key of the input structu
4、re , and the system is able to accurately display the status of traffic light control and can be completed through the keys trunk roads and sub-passage time and the yellow light lit manually to set the time, in the absence of current time settings manually, the system are in automatically required w
5、ork mode, and so the production system reset module contains, ISP online Download module, DS18B20 temperature measurement module, EPROM memory module, serial download, as well as self-5V power supply module. Between modules to work together, allowing the system to complete the basic requirements in
6、a stable function of time, and serial communication with the computer.Keywords MCU, traffic lights, LED DISPLAY, 4*4keyboard,Source1、引言单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。而这个计算机系统包括中央处理器、随机存取存储器、只读存储器、输入/输出端口等主要计算机功能部件,尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外
7、部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。单片机具有性能高、速度快、体积小、价格低、稳定可靠、应用广泛、通用性强等突出优点。单片机的设计目标主要是增强“控制”能力,满足实时控制(就是快速反应) 的需要。因此,它在硬件结构、指令系统、I/O端口、功率消耗及可靠性等方面均有其独特之处,其最显著的特点之一就是具有非常有效的控制功能。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:1.在智能仪器仪表上的应用, 2.在工业控制中的
8、应用, 3.在家用电器中的应用, 4.在计算机网络和通信领域中的应用, 5.单片机在医用设备领域中的应用, 6.在各种大型电器中的模块化应用, 7.单片机在汽车设备领域中的应用。 众所周知,交通灯是我们日常生活中不可缺少的保障交通安全的工具,那么通过本次设计题目的探索,我们会深入了解交通灯的原理,从中深受启发,从而开发出更实用,更有保障的交通灯控制器。 个人所做的工作是参与原理图的设计和硬件的焊接,部分程序编辑。系统完成运行后,基本能够达到所要求的功能。复位键,加减键,设置键。能完成时间的设置,红绿灯的转换等。2、设计方案论证/选择2.1 方案一输入设置为44的键盘,16个按键包括09共10个
9、数字按键,南北和东西2个方向按键,绿灯和黄灯2个选择指示灯的按键,1个设置完成按键,还有一个转换数码管显示十位和个位的按键;由于I/O口不够用,数码管显示使用74LS164扩展I/O口,串行数据转换为并行数据输出。本方案的优点是按键比较多,每个按键可以对应的具体的功能,一目了然,用户可以随意选择设置某个方向某个指示灯亮灭的时间。本方案的缺点是按键较多,硬件和软件处理起来都比较麻烦;使用74LS164扩展I/O口进一步增加了系统的复杂性。2.2 方案二输入设置为3个按键,分别是设置键、增加键和减少键,设置键选择方向和指示灯,增加键增加指示灯亮的时间,减少键减少指示灯亮的时间;数码管显示直接使用单
10、片机I/O口输出。本方案的优点是按键少,I/O口不用扩展,系统复杂性比较低,硬件和软件处理起来都比较容易。本方案的缺点是用户进行设置时,由于按键少功能集合在一起,使用不太方便;单片机的I/O口正好够用,不利于系统的扩展。2.3 方案三输入设置为3个按键,分别是设置键、增加键和减少键,设置键选择方向和指示灯,增加键增加指示灯亮的时间,减少键减少指示灯亮的时间;数码管显示使用74LS164扩展I/O口,串行数据转换为并行数据输出。本方案的优点是采用3个按键,系统简单,硬件和软件处理起来都比较容易;I/O口有剩余,便于对系统进行扩展。本方案的缺点是用户设置时不太方便;使用74LS164扩展I/O口在
11、一定程度上也增加了系统的复杂性。2.4 方案选择按键较多时用户使用起来方便,但系统复杂性也相应增加了不少,硬件和软件处理起来都比较困难;按键少时,系统简单,但用户使用时不太方便;考虑到用户设置红绿灯亮灭时间时通常都是一次性设置4个指示灯的时间,而且用户设置不会太频繁,所以输入选择使用按键比较少的方案。数码管显示直接使用单片机I/O口输出,系统简单,但占用单片机的I/O口比较多;数码管显示使用74LS164扩展I/O口,系统相对复杂,但节省了单片机的I/O口;考虑到系统的可扩展性,数码管显示选择使用74LS164扩展I/O口。综上所述,本设计选择方案三。3、概述/简介3.1材料准备本次设计需要的
12、器材主要有:共阳数码管一个; 单片机STC89C52一个;按键九个; DS18B20温度传感器一个;12M晶振一个; 10K电阻八个;1K电阻八个; 4.7K电阻一个;8.2K电阻一个;30PF电容两个;10uF电容一个;s9012三极管四个;二极管四个;1000uF电容、0.33uF电容、0.1uF电容各一个;插座一个;导线若干。3.2仿真软件简介Keil软件是目前最流行开发MCS-51系列单片机的软件, Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。Keil C51软件提供丰富的
13、库函数和功能强大的集成开发调试工具,全Windows界面,其语句容易理解,生成目标代码效率较高,同时具有高级语言易编写的优势。Proteus不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情,Proteus软件所提供了30多个元件库,数千种元件,元件涉及到数字和模拟、交流和直流等,同时Proteus软件能够提供丰富的仪表资源和调试手段,并可以与Keil软件联机调试。4、课题描述与分析4.1课题描述南北东西利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,并且用4只LED数码管显示十字路口两个方向的剩余时间。要求能用按键设置两个方向的通行
14、时间(绿灯点亮的时间)和暂缓通行时间(黄灯点亮的时间),系统的工作符合一般交通灯控制要求。 往南和往北的信号一致,即红灯(绿灯或黄灯)同时亮或同时熄灭。用两个数码管来显示被点亮的指示灯还将点亮多久。往东和往西方向的信号一致,其工作方式与南北方向一样,也采用两个数码管来倒计时。当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行;而东西方向为绿灯和黄灯时,南北向的红灯点亮禁止通行。4.2本系统的工作流程1. 接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行60秒,东西向通行30秒,黄灯亮4秒,工作模式如表1.1所示。首先南北向通行,然后东西向通行,如此循环。2. 通行时间的设置:当需
15、要更改主、次干道的通行时间时,可以用“设置键、增加键、减少键”进行设置。 第一次按“设置键”时,南北向的绿灯亮,南北向的数码管显示当前南北向的通行时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向的通行时间。按一次“增加键”或“减少键”,数码管的显示时间增加1秒或减小1秒,长按“增加键”或“减少键”(按下的时间超过1秒钟以上),则数码管显示的时间按每秒钟增加或减少10的速度快速变化。 第二次按“设置键”时,南北向的黄灯亮,南北向的数码管显示当前南北向黄灯的点亮时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次
16、),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向黄灯的点亮时间。 第三次按“设置键”时,东西向的绿灯亮,东西向的数码管显示当前东西向的通行时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向的通行时间。 第四次按“设置键”时,东西向的黄灯亮,东西向的数码管显示当前东西向黄灯的点亮时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向黄灯的点亮时间。 第五次按“设置键”时,系统退出设置状态,回到交通信号灯状态,并且南北向先通行,东西向后通行。“设置键”的功能如表1.2所示。表1.2 设置键的功能按“设置键”的次数
17、 第1次第2次第3次第4次第5次调整内容 南北向的绿灯点亮时间南北向的黄灯点亮时间东西向的绿灯点亮时间东西向的黄灯点亮时间恢复交通灯工作状态调整范围 099秒09秒099秒09秒5、课题设计5.1软件设计: 1)系统资源分配:为了便于程序的设计、阅读及修改,需要先对系统的存储器资源进行分配和说明。 2)软件模块:根据上述工作流程和设计要求,软件设计可以分为以下几个功能模块: 主程序:初始化及键盘监控。 计时程序模块:为定时器的中断服务子程序,完成0.1秒和1秒的时间定时。 显示程序模块:完成12个发光二极管(实际上只需驱动6个)和4个LED数码管的显示驱动。 键盘扫描程序模块:判断是否有键按下
18、,并求取键号。 键处理程序模块:分别是“设置键”“增加键”“减少键”的处理子程序。5.2硬件电源模块图2 自制5V电源电路如图电源模块电路图,市电220V交流经过变压器变为12V交流电,在经过全桥和稳压芯片7805变为5V直流电,在输出端加入开关和发光二极管作为指示灯,经过测量电源很稳定。单片机基本工作模块如图所示,该模块主要保证单片机的基本工作,包括晶振(12MHZ)单元、复位单元。该部分与其他部分分离,在保证单片机供电正常工作的同时可以将IO口引出,可以保证再次使用该模块。串口下载模块图4 串口模块如图,该模块主要由串口芯片MAX232组成,使单片机通过串口与计算机进行通信,其中最主要的应
19、用是下载单片机的程序到STC89C51中,使其按要求工作。数码管显示模块按键控制模块图9 按键模块系统中共使用了4个按键,分别用来控制主干道和次干道的通行时间及黄灯点亮的时间。HYM1380/HYM1381 串行时钟芯片EEPROM模块6、系统测试6.1硬件调试 硬件的调试首先要从单片机最小系统开始,先检测各个引脚输出的电平是否正确,以及晶振是否工作,最小系统正常工作后,在对数码管进行段和位的逐步检测,看能否正常显示。当这些最基本的基础电路正常时,开始检测温度测试电路是否正确,包括各元件的接法,以及与单片机的接口是否正确。最后检测的是按键的硬件连接是否正确。在检测的过程中,通过一些简单的测试程
20、序来辅助硬件测试会得到意想不到的收获,因此,软件测试更是必不可少的。6.2软件调试软件的测试一般要分步进行,首先从最基本的功能开始调试,数码管接好后用简单的显示程序检测单片机最小系统和数码管能否正常工作,然后再添加交通灯程序,看LED是否正确显示,当单片机系统可实现正确显示时,再使用按键更改时间,然后再观察系统是否正确执行。完成以上测试,若LED均能正常显示说明系统能够正常工作。7、结论本次设计虽然时间短,任务重,但是经过大家共同努力,课题完成了红绿灯控制器的所有基本要求,设计布局合理,做工精细;小组内部分工明确,互相团结,相互学习,在成功的那一刻大家都十分的激动,毕竟是大家辛勤努力的结果。在
21、设计的过程中,我们理论联系实际,注重动手实践,此次课程设计使我受益匪浅;只有勤动手才能将知识更好的应用在实践中,更好地学习了单片机的应用,加深了理解。对以后的工作学习帮助很大。参考文献1曹立军,吕强. 单片机原理与应用.成都:电子科技大学出版社,2005年9月.2李光飞,楼然苗,胡佳文,谢象佐. 北京:北京航空航天大学出版社,2004年3月. 3何小海,刘嘉勇. 微型计算机原理与接口技术. 四川:四川大学出版社,2003年1月. 4胡伟,季晓衡.单片机C语言程序设计及应用实例.人民邮电出版社,2004年3月北京第三次印刷5 于永, 戴佳, 常江. 51单片机C语言常用模块与综合系统设计实例精讲
22、. 北京:电子工业出版社,20076 徐玮, 徐富军, 沈建良. C51单片机高效入门. 北京:机械工业出版社,2007. 附 录#include unsigned char cnt_ctr; unsigned int scdEW,scdSN; unsigned int cntSN,cntEW; unsigned char csxdP3_4,cntP3_5,cntP3_6;unsigned cnt_num,cnt_key,keyMemory,cnt_flash; unsigned char num=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9
23、0;/unsigned char ctr=0xfa,0xf5;/0xfa(P3_0和P3_2为0,即高位有效)0xf5(P3_1和P3_3为0,即低位有效)unsigned char disEW2;/记录东西向高低位数值unsigned char disSN2; /记录南北向高低位数值int greenEW = 6,yellowEW = 3,greenSN = 6,yellowSN = 5; /东西方向sbit EW_yellow=P32;sbit EW_red=P33;sbit EW_green=P25;/南北方向sbit SN_yellow=P27;sbit SN_red=P26;sbit
24、 SN_green=P37; sbit lie=P24;sbit hang1=P20;sbit hang2=P21;sbit hang3=P22;sbit duan=P30; sbit wei=P31;void delay(char num)while(num-);/延时函数,a为1延时1毫秒 void delay_ms(unsigned int a)int i;while(a-)i = 70;while(i-); /长按加10秒void add_10s(void)cnt_key = 0;switch(csxdP3_4)case 1:greenEW = greenEW + 10;/长按秒数加1
25、0if(greenEW = 90)greenEW = 0;keyMemory = greenEW + 10;/keyMemory用来标记秒数已经加10scdEW = greenEW;scdSN = greenEW + yellowEW + 1;break;case 3:greenSN = greenSN + 10;if(greenSN =90)greenSN = 0;keyMemory = greenSN + 10;scdEW = greenSN + yellowSN + 1;scdSN = greenSN;break;void display(void)cnt_num+;if(cnt_ctr
26、 = 10) cnt_ctr = 0; wei=1;duan=0; P1=numdisSN0; duan=1; delay_ms(10); P1=0xef; wei=0; delay_ms(10); wei=1;duan=0; P1=numdisSN1; duan=1; delay_ms(10); P1=0xdf; wei=0; delay_ms(10); wei=1;duan=0; P1=numdisEW0; duan=1; delay_ms(10); P1=0xfb; wei=0; delay_ms(10); wei=1;duan=0; P1=numdisEW1; duan=1; dela
27、y_ms(10); P1=0xf7; wei=0; delay_ms(10); wei=1;/闪烁显示秒数void dspFlash(void)cnt_flash+;if(cnt_flash 660) wei=0;P1 = 0xff;/数码管灭elseif(cnt_flash = 1333)/数码管亮 1333=4000/3 即1秒闪3次 cnt_flash = 0; if(cnt_ctr = 25) cnt_ctr = 0; P1=0xff; switch(csxdP3_4)case 3:case 4: /东西方向显示wei=1;duan=0; P1=numdisSN0; duan=1; d
28、elay_ms(10); P1=0xef; wei=0; delay_ms(10); wei=1;duan=0; P1=numdisSN1; duan=1; delay_ms(10); P1=0xdf; wei=0; delay_ms(10);break;case 1:case 2: wei=1;duan=0; P1=numdisEW0; duan=1; delay_ms(10); P1=0xfb; wei=0; delay_ms(10); wei=1;duan=0; P1=numdisEW1; duan=1; delay_ms(10); P1=0xf7; wei=0; delay_ms(10
29、); wei=1;break;/长按减10秒void sub_10s(void)cnt_key = 0;switch(csxdP3_4)case 1:greenEW = greenEW - 10;/长按秒数减10if(greenEW 0)greenEW = 89;keyMemory = greenEW - 10;/keyMemory用来标记秒数已经减10scdEW = greenEW;scdSN = greenEW + yellowEW + 1;break;case 3:greenSN = greenSN - 10;if(greenSN 0)greenSN = 89;keyMemory = g
30、reenSN - 10;scdEW = greenSN + yellowSN + 1;scdSN = greenSN;break; /T0中断void t0(void) interrupt 1cnt_ctr+;/中断的次数 if(csxdP3_4 = 0)display();/正常显示秒数 if(csxdP3_4 != 0)dspFlash();/闪烁显示秒数 if(cnt_num = 4000) cnt_num = 0; if(scdEW- = 0) /正显示的秒数减1 cntEW+;/东西向秒数减至0,标志位加1 if(scdSN- = 0) cntSN+;/南北向秒数减至0,标志位加1
31、switch(cntEW) /标记显示的是哪个灯case 1:scdEW = yellowEW;/东西向黄灯亮,显示黄灯秒数/东西方向 EW_yellow=0; EW_red=1; EW_green=1;cntEW+;/避免程序到此阻塞,故将其至为2break;case 3:/避免cntEW为2scdEW = greenSN + yellowSN + 1;/东西向红灯亮,显示红灯秒数/东西方向 EW_yellow=1; EW_red=0; EW_green=1;cntEW+;/避免程序到此阻塞,故将其至为4break;case 5:/避免cntEW为4scdEW = greenEW;/东西向绿
32、灯亮,显示绿灯秒数/东西方向 EW_yellow=1; EW_red=1; EW_green=0;cntEW = 0;break;switch(cntSN) /标记是哪个灯case 1:scdSN = greenSN;/南北向绿灯亮,显示绿灯秒数/南北方向 SN_yellow=1; SN_red=1; SN_green=0;cntSN+;/避免程序到此阻塞,故将其至为2break;case 3:/避免cntSN为2scdSN = yellowSN;/南北向黄灯亮,显示黄灯秒数/南北方向 SN_yellow=0; SN_red=1; SN_green=1;cntSN+;/避免程序到此阻塞,故将其
33、至为4break;case 5:/避免cntSN为4scdSN = greenEW + yellowEW + 1;/南北向红灯亮,显示红灯秒数/南北方向 SN_yellow=1; SN_red=0; SN_green=1;cntSN = 0;break;if(hang2 = 0)if(cnt_key+ = 4000)add_10s();/长按数码管加10秒if(hang3 = 0)if(cnt_key+ = 4000)sub_10s();/长按数码管减10秒 disEW0 = scdEW/10; disEW1 = scdEW%10; disSN0 = scdSN/10; disSN1 = sc
34、dSN%10;/设置红绿黄灯秒数void setSecond(void)while(hang1= 0);csxdP3_4+;/标志设置键被按下的次数/设置红绿黄灯秒数switch(csxdP3_4)case 1: /东西cntEW = 5; EW_yellow=1; EW_red=1; EW_green=0; SN_yellow=1; SN_red=1; SN_green=1;/P1 = 0xf7; /P13break;case 2:cntEW = 1; EW_yellow=0; EW_red=1; EW_green=1; SN_yellow=1; SN_red=1; SN_green=1;/
35、P1 = 0xef; /P14break;case 3: /南北cntSN = 1; EW_yellow=1; EW_red=1; EW_green=1; SN_yellow=1; SN_red=1; SN_green=0;/P1 = 0xfe;/P10break;case 4:cntSN = 3;EW_yellow=1; EW_red=1; EW_green=1; SN_yellow=0; SN_red=1; SN_green=1;/P1 = 0xfd; / P11break;case 5:cntEW = 5;cntSN = 5;cnt_num = 0;csxdP3_4 = 0;break;
36、/秒数加1void addSecond()while(hang2= 0);cnt_key = 0;/记录长按键的参数清零switch(csxdP3_4)case 1:if(keyMemory != greenEW + 10)/判断按键是否已经加10,如果没有加10则秒数加1,如果已经加10则不加1greenEW+;if(greenEW = 90)greenEW = 0;scdEW = greenEW;/西边绿灯显示时间scdSN = greenEW + yellowEW + 1;/南边红灯的时间break;case 2:if(yellowEW+ = 9)yellowEW = 0;scdEW =
37、 yellowEW; scdSN = greenEW + yellowEW + 1;/南边红灯的时间break;case 3:if(keyMemory != greenSN + 10)greenSN+;if( greenSN = 90) greenSN = 0;scdEW = greenSN + yellowSN + 1;/西边红灯时间 以秒为单位,增加scdSN = greenSN;/南边绿灯break;case 4:if(yellowSN+ = 9)yellowSN = 0;scdSN = yellowSN;scdEW = greenSN + yellowSN + 1 ;break;/秒数
38、减1void subSecond()while(hang3 = 0);cnt_key = 0;/记录长按键的参数清零switch(csxdP3_4)case 1:if(keyMemory != greenEW - 10)/判断按键是否已经减10,如果没有减10则秒数减1,如果已经减10则不减1greenEW-;if(greenEW = -1)greenEW = 89;scdEW = greenEW;scdSN = greenEW + yellowEW + 1;break;case 2:if(yellowEW- = 0)yellowEW = 9;scdEW = yellowEW;scdSN =
39、greenEW + yellowEW + 1;break;case 3:if(keyMemory != greenSN - 10)greenSN-;if(greenSN = -1) greenSN = 89;scdEW = greenSN + yellowSN + 1;scdSN = greenSN;break;case 4:if(yellowSN- = 0)yellowSN = 9;scdSN = yellowSN; scdEW = greenSN + yellowSN + 1;break; /主函数void main() TMOD = 0x02;/设置定时器0为工作方式2TH0 = 0x06;TL0 = 0x06;/初始化8位定时器 (256 - 6)*40000 = 1sEA = 1;/总中断允许ET0 = 1;/T0中断允许TR0 = 1;/打开T0中断 /东西向绿灯,南北向红灯/东西方向 EW_yellow=1; EW_red=1; EW_green=0;/南北方向 SN_yellow=1; SN_red=0; SN_green=1;scdEW = greenEW;/设置东西向显示秒数scdSN = greenEW + yellowEW + 1;/设置南北向显示秒数
限制150内