单片机交通灯.docx
《单片机交通灯.docx》由会员分享,可在线阅读,更多相关《单片机交通灯.docx(24页珍藏版)》请在冰点文库上搜索。
单片机交通灯
一、设计目的
《单片机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。
在课程设计过程中,在教师指导下,应用工程的方法,通过一个简单课题的设计练习,可使学生初步体验单片机应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。
通过课程设计,应该能加强学生如下能力的培养:
(1)独立工作能力和创造力;
(2)综合运用专业及基础知识,解决实际工程技术问题的能力;
(3)查阅图书资料、产品手册和各种工具书的能力;
(4)工程绘图的能力;
(5)编写技术报告和编写技术资料的能力。
二、设计要求
1总体要求
(1)独立完成设计任务
(2)绘制系统硬件总框图
(3)绘制系统原理电路图
(4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释
(5)制定编写调试方案,编写用户操作使用说明书
(6)写出设计工作小结。
对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研究方向。
2具体要求
本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。
软件编程是本次课程设计的重要环节。
在为期两周的工程实践中,将占据主要时间,完成的软件编程任务主要包括以下几点:
1)、熟悉KeilC51编程平台及相关编程软件
2)、编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调
3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调
4)、编写、调试键盘扫描子程序并进行软硬件联调
5)、编写、调试数码管动态扫描程序并进行软硬件联调
6)、基于交通灯的多功能控制设计
其中前五个内容是后两个内容的基础,主要是编制一些子程序,为后继的整个系统设计打下基础。
交通灯控制是在五个课题中选做的一个设计,是一个简单的单片机编程设计,来实现智能交通灯的多功能作用。
三、硬件电路的设计及描述
(一)硬件总框图及原理图
图1硬件总框图
图2硬件总原理图
(二)硬件单元电路设计及元器件说明
1)AT89C52单片机
设计中所用的单片机型号为AT89C52,其主要功能为:
AT89C52是低功耗、高性能的CMOS8位单片机。
片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C52的指令系统和引脚与80C52完全兼容,所以,近几年AT89C52单片机应用极为广泛。
AT89C52单片机除了含有8KB的Flash存储器外,片内还有256B的RAM,32条I/O口线,3个16位定时/计算器、6个中断源、1个全双工串行口等。
同时,与80C52一样,有空闲和掉电两种节电运行方式。
AT89C52单片机的结构与8051单片机的结构基本相同,不同之处以下几点:
有CHMOS工艺的节能运行方式、增加了一个16位的定时器T2、片内RAM由128B增加为256B、ROM类型属于Flash存储器。
AT89C52引脚如图7所示:
图7AT89C52引脚
AT89C52单片机为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测。
2)DS1302实时时钟模块
图8DS1302模块
图9DS1302的引脚图
其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
①概述
现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。
这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
采用普通32.768kHz晶振。
②引脚功能及结构
图8为DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电。
③DS1302的控制字节
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
④DS1302与CPU的连接
实际上,在调试程序时可以不加电容器,只加一个32.768kHz的晶振即可。
只是选择晶振时,不同的晶振,误差也较大。
另外,还可以在上面的电路中加入DS18B20,同时显示实时温度。
只要占用CPU一个口线即可。
LCD还可以换成LED,还可以使用北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块LCM101,内含看门狗(WDT)/时钟发生器及两种频率的蜂鸣器驱动电路,并有内置显示RAM,可显示任意字段笔划,具有3-4线串行接口,可与任何单片机、IC接口。
功耗低,显示状态时电流为2μA(典型值),省电模式时小于1μA,工作电压为2.4V~3.3V,显示清晰。
⑤总结
DS1302存在时钟精度不高,易受环境影响,出现时钟混乱等缺点。
DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。
这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。
传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。
DS1302慢速充电时钟芯片包括时时钟/日历和31B的静态RAM,经过一个简单的串行接口与单片机通信。
DS1302与单片机的通信仅需3根线,即RST(复位线)、I/O(数据线)、SCLK(串行时钟线)。
数据可按每次1B或多达31B的形式传送到时钟/RAM或从中送出。
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。
无论是读周期还是写周期,开始八位指定40个寄存器中哪个将被访问到。
在开始的8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。
时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。
DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向)。
SCLK始终是输入端。
3)数码管显示电路
图6数码管显示电路
数码显示电路设计中采用四位共阳极扫描型数码管即其公共端接正极,扫描型是指数码管的段选都是并联的。
其位选位控制哪一位的数码管亮,在设计中由单片机AT89C52的P1口控制其位选,以达到动态显示的效果,再通过P0口,控制其段选以显示相应的数值。
在其位选控制部分,采用了一个9012型三极管,要求当P1口输出低电平时,位选成功。
动态扫描显示接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了。
所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
4)LED流水灯循环显示
图3循环显示电路
要实现此功能,最重要的是设法将P2口的引脚变为低电平时,相应的LED灯管就会发光。
通过修改程序可使得IO口电平依次变为低电平后按设定的时间再变为高电平,这样就可以实现流水灯效果。
改变延时时间,可以改变流水灯的流动速度。
从上面中文表示看来实现单片机流水灯很简单,但是我们不能说P1.0你变低,它就变低了。
因为单片机只能接受二进制的1、0机器代码。
为了让单片机工作,只能将程序写为二进制代码交给其执行。
这里的“程序语言”主要有汇编语言和C语言两种;在这里我们将“程序语言”通过编译器产生单片机的二进制代码的。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
实现LED流水灯的现象是:
P20低电平àLED1亮、延时、P20高,P21低电平àLED2亮、延时、P21高,P22低电平àLED3亮、延时、P22高,P23低电平àLED4亮、延时、P23高,P24低电平àLED5亮、延时、P24高,P25低电平àLED6亮、延时、P25高,P26低电平àLED7亮、延时、P26高,P27低电平àLED8亮、延时、P27高,返回到开始、程序结束。
5)键盘扫描模块
图4按键输入电路
本模块四个开关分别用于控制流水灯控制电路,时间显示电路,音乐蜂鸣器电路,交通灯四部分功能。
当按下其中一个开关时,该部分电路导通,给单片机发出地址信号,实现其中一项功能的运做,如图4所示。
KEYA键:
其功能是当该键按下时,流水灯程序工作;
KEYB键:
其功能是当该键按下时,音频程序工作;
KEYC键:
其功能是当该键按下时,时间日期程序工作;
KEYD键:
其功能是当该键按下时,交通灯程序工作。
6)蜂鸣器电路
图5蜂鸣器电路
设计要求定时时间到时要有声音提醒信号产生,可选择一只蜂鸣器来实现这一功能。
压电式蜂鸣器(HA)工作时约需10mA的驱动电流,并设计一个相应的驱动及控制电路。
蜂鸣器单元电路是通过一个PNP三极管来放大驱动蜂鸣器,蜂鸣器的正极接到+5V电源上面,蜂鸣器的负极接到三极管的发射极,三极管的基极经过限流电阻后由单片机的P3.4控制。
当输出高电平时,三极管截止,蜂鸣器的两引脚间的直流电压接近于0V,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,使蜂鸣器的两个引脚间获得将接近+5V的直流电压,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制IO口输出的电平来控制蜂鸣器是否发出声音,实现各种可能音响的产生。
四、软件设计流程
(一)主程序流程图
图10主程序流程图
(二)各模块流程图
流水灯程序流程图
时间显示程序流程图
利用蜂鸣器的音乐流程图
智能交通灯
五、源程序代码
T_RSTBitP3.4;实时时钟复位线引脚
T_CLKBitP3.2;实时时钟时钟线引脚
T_IOBitP3.3;实时时钟数据线引脚
MINUTEEQU31H
HOUREQU32H
ORG0000H
LJMPSTART
ORG001bH
AJMPINTT1
ORG0100H
START:
MOVP2,#0FFH
MOVSP,#60H;修改堆
MOVMINUTE,#45H;初始时间设为12:
00:
00
MOVHOUR,#08H
LCALLKEY
AJMPSTART
;*******流水灯*******
KEY0:
MOVSP,#60H;修改堆栈
MOVDPTR,#TAB1;将流水灯花样表的首地址送入地址指针DPTR
LOOPa:
CLRA;寄存器A清零
MOVCA,@A+DPTR
CJNEA,#00H,SHOW;未到结束标志时跳到SHOW花样执行程序
AJMPKEY0
SHOW:
MOVP2,A;将花样送入P2口
ACALLDELAYa;延时一段时间
INCDPTR
AJMPLOOPa
DELAYa:
MOVR0,#255;延时约0.1秒
Dm:
MOVR1,#255
DJNZR1,$
DJNZR0,Dm
;流水花样
tab1:
db0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh
db0fah,0f5h,0ebh,0d7h,0afh,5fh,0beh,7dh
db0f0h,0e1h,0c3h,87h,0fh,1eh,3ch,78h
db0fch,0f0h,0c0h,0c0h,03h,0fh,3fh
db7eh,0bdh,0dbh,0e7h,0dbh,0bdh,7eh,00h
RET
;*******时间*******
KEY1:
LCALLSETDS1302
LCALLGET1302
LCALLDISPLAY
MOVR3,#25
MOVTMOD,#01H
MOVTH0,#70H;置定时器初值(定时40ms)
MOVTL0,#00H
SETBTR0;启动定时器0
LP11:
JBCTF0,LP21;查询计数溢出
SJMPLP11;未到40ms继续计数
LP21:
MOVTH0,#0B8H;重新置定时器初值
MOVTL0,#00H
LCALLDISPLAY1;显示
DJNZR3,LP11;未到1S继续循环
LCALLGET1302;每过1s从DS1302读取一次时间
MOVR3,#25
SJMPLP11;数码显示子程序
DISPLAY1:
MOVDPTR,#DIG_CODE;显示分
MOVP1,#11110111b
MOVA,minute
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111011b
MOVA,minute
SWAPA
ANLA,#07H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY;显示时
MOVP1,#11111101b
MOVA,hour
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111110b
MOVA,hour
SWAPA
ANLA,#03H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
;字符显示码表
DIG_CODE:
DB14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,05H
RET
;***********音乐*****************
KEY2:
MOVSP,#60H
MOVTMOD,#10H
SETBET1
SETBEA
SETBTR1
START0:
CLRP3.4
MOV30H,#00H
NEXTT:
MOVA,30H
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVR2,A
JZENDD
ANLA,#0FH
MOVR5,A
MOVA,R2
SWAPA
ANLA,#0FH
JNZSING
CLRTR1
AJMPDD1
SING:
DECA
MOV22H,A
RLA
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVTH1,A
MOV21H,A
MOVA,22H
RLA
INCA
MOVCA,@A+DPTR
MOVTL1,A
MOV20H,A
SETBTR1
DD1:
LCALLDELAYY
INC30H
AJMPNEXTT
ENDD:
CLRTR1
AJMPSTART0
INTT1:
PUSHPSW
PUSHACC
MOVTL1,20H
MOVTH1,21H
CPLP3.4
POPACC
POPPSW
RETI
DELAYY:
MOVR7,#02
DELAY0:
MOVR4,#187
DELAY1:
MOVR3,#248
DJNZR3,$
DJNZR4,DELAY1
DJNZR7,DELAY0
DJNZR5,DELAYY
RET
;声响时间
TABLE:
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H
;声调
TABLE1:
DW64260,64400,64524,64580,64684,64777,64820,64898
DW64968,65030,65058,65110,65157,65178,65217
;*******交通灯*******
KEY3:
MOVP2,#00H;信号灯初始状态全灭
SETBP2.2;亮东西向绿灯,东西向放行
SETBP2.3;亮南北向红灯,南北向禁止通行
MOVR4,#72H;延时57S
LP1:
LCALLDL
DJNZR4,LP1
CLRP2.2;熄灭东西向绿灯
SETBP2.1;点亮东西向黄灯
MOVR4,#06H;延时3S
LP2:
LCALLDL
DJNZR4,LP2
MOVP2,#00H
SETBP2.0;东西向红灯亮,禁止东西向通行
SETBP2.5;点亮南北向绿灯,南北向放行
MOVR4,#4AH;延时37S
LP3:
LCALLDL
DJNZR4,LP3
CLRP2.5;熄灭南北向绿灯
SETBP2.4;点亮南北向黄灯
MOVR4,#06H;延时3S
LP4:
LCALLDL
DJNZR4,LP4
MOVP2,#00H
LJMPSTART;重新开始下一个周期
DL:
MOVR7,#05H;0.5S软件延时子程序
DL1:
MOVR6,#0C8H
DL2:
MOVR5,#0FAH
DJNZR5,$
DJNZR6,DL2
DJNZR7,DL1
RET
;*******DS1302启动程序*******
SETDS1302:
CLRT_RST
NOP
CLRT_CLK
NOP
SETBT_RST
NOP
MOVB,#8EH;写控制命令字
LCALLINPUTBYTE
MOVB,#00H;写保护关闭
LCALLINPUTBYTE
SETBT_CLK
NOP
CLRT_RST
MOVR0,#SECOND;内存中的时间首地址
MOVR1,#80H;DS1302中的时间首地址
MOVR7,#7;字节数
SETLOOP:
CLRT_RST
NOP
CLRT_CLK
NOP
SETBT_RST
NOP
MOVB,R1;写命令字
LCALLINPUTBYTE
MOVA,@R0;设置时间
MOVB,A
LCALLINPUTBYTE
INCR0
INCR1
INCR1
SETBT_CLK
NOP
CLRT_RST
NO