目 录
1 绪论.............................................................. 1
2 总体方案设计...................................................... 2
2.1 课题研究主要内容 .............................................. 2
2.2课题的设计思路 ................................................ 3
2.3 总体方案组成和说明 ............................................ 4
3 硬件电路设计及描述................................................ 5
3.1 单片机最小系统 ................................................ 5
3.2按键接口电路的设计 ............................................ 8
3.3 指示电路的设计 ................................................ 9
3.4 显示电路的设计 ............................................... 10
3.5 按键电路 ..................................................... 10
3.6 PCB 印刷图 ................................................... 11
4 软件设计......................................................... 12
4.1 软件流程图 ................................................... 13
4.2 交通灯程序清单 ............................................... 16
4.3 软件仿真 ..................................................... 27
4.4 误差分析 ..................................................... 27
4.5设计心得体会 ................................................. 28
致 谢............................................................. 29
参考文献........................................................... 29
附 录A : ......................................................... 31
附 录B : ......................................................... 31
附 录C : ......................................................... 31
1 绪论
近年来,随着汽车数量的猛增,我国大中型城市的城市交通,正面临着严峻的考验,从而导致交通问题日益严重,其主要表现如下:交通事故频发,对人类生命安全造成极大威胁;交通拥堵严重,导致出行时间增加,能源消耗加大;空气污染和噪声污染程度日益加深等。日常的交通堵塞成为人们司空见惯而又不得不忍受的问题。在这种背景下,结合我国城市道路交通的实际情况,开发出真正适合我们自身特点的智能信号灯控制系统已经成为当前的主要任务。
和谐的城市交通具有很重要的现实意义。城市交通是城市经济生活的命脉,是衡量一个城市文明进步的标志,对于城市经济的发展和人民生活水平的提高起着十分重要的作用。作为城市交通网的重要组成部分, 交叉口是道路通行能力的瓶颈和交通阻塞及事故的多发地。城市的交通拥堵,大部分是由于交叉口的通行能力不足或没有充分利用造成的,这导致车流中断、事故增多、延误严重。对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。
2 总体方案设计
本设计的重点是交通灯的现实电路的设计,另外还包含了单片机的最小系统,电源电路以及设计的核心单元单片机。在设计前要先对各部分电路设计方案进行选择,本章对采用哪种方案及如何选择芯片做出了具体的说明,并最终给出了总体框图和设计思路。
2.1 课题研究主要内容
本设计以单片机为核心,通过Proteus professional软件进行模拟仿真,以此来实现交通灯控制系统的模拟功能,从而达到有效的控制交通状况的目的。 设计内容及要求:
设计一个具有特定功能的十字路口交通灯。该交通灯上电或按键复位后能自动显示系统提示符“P. ”, 进入准备工作状态。按开始键则开始工作,按结束键则返回“P. ”状态。要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过
针对以上要求,着重要完成以下几个方面的内容:
对于系统的硬件设计,主要包括:
单片机基本系统电路设计;
显示、按键电路设计;
对于系统的软件设计,主要包括:
系统主程序的设计;
统几个中断子程序的设计;
系统软件流程图;
Proteus professional软件的模拟仿真等内容;
针对本次设计中所存在的问题,提出部分改进意见和下一步所要研究的目标。最后,总结了设计过程的收获与不足并展望了未来。
2.2课题的设计思路
交叉字路口是城市交通运输的咽喉,如何使各种交通流顺畅地通过是城市交通信号控制系统成功与否的关键。随着现代城市的发展,交通流量的增加,现在的大中城市都以六车道居多,本方案即以六车道为控制对象,其结构如图2-1所示:
本设计主要是关于交通灯的智能控制,车辆行驶时共有直行、左转、右转三个方向,通过数码管对倒计时间的显示和红、绿、黄三色灯的指示,以达到交通顺畅通行的目的。同时,可以通过按键来控制倒计时的长短,实现智能控制人流高峰和低谷时,交通灯运行的状态。
单片机的特点:
(1)控制系统在线作用。单片机的控制作用可分为两个方面:一是离线控制,二是在线控制。
(2)软硬件结合。单片机的引入使控制系统大大“软化 [1]”,相比其他计算机应用问题,单片机控制应用中的硬件内容较多,所以单片机控制应用有软硬结合的特点。
(3)应用现场环境恶劣。通常单片机应用现场的环境比较恶劣,电磁干扰、电源波动、冲击振动、高低温等因素都会影响系统的工作的稳定。此外,无人值守的环境也会对单片机系统的稳定性和可靠性提出更高的要求。所以稳定和可靠在单片机的应用中具有格外重要的意义。
(4)应用的广泛性。在生活和生产的各个领域中,凡是有自动控制要求的地方都会有单片机的身影出现。其应用领域包括工业自动化方面、仪器仪表方面、家用电器方面、信息和通信产品方面以及军事装备方面。
综上所述,单片机的稳定性,可靠性都有着很好的保证,它也具有一定的精度,且低电压、低功耗。从经济方面考虑,也最为合适。所以此次设计选用单片
图2-1 交叉路口结构图
机为核心控制器。选择ATMEL 公司的AT89S52单片机最合适。
2.3 总体方案组成和说明
单片机模块是整个系统的核心部分,在这样一个模拟交通灯系统中,需要有时钟电路模块提供基准震荡频率 [2]以及单片机基本系统、指示电路、显示电路、键盘电路、电源电路、下载线电路设计。系统基本原理方框图如图2-2所示: 图
2-2
系
统
基
本
原
理
方
框图
由上总体方框图可以看到此次设计硬件电路有六大部分所构成,围绕以主控部分发挥各自的功能。只有这几部分有机结合才可以很好的实现本次设计的的。
3 硬件电路设计及描述
本系统的硬件结构主要由单片机系统、键盘电路、电源电路、显示电路、LED 指示电路等五部分组成。下面对以上六部分进行逐一介绍。
3.1 单片机最小系统
单片机最小系统主要组成部分包括:AT89S52单片机、时钟电路、复位电路。单片机是本设计的核心部分,它是整个系统能够正常运行的控制中心。
系统采用美国ATMEL 公司的AT89S52单片机,其内部含有可重复编程的Flash 存储器, 可进行1000次擦写操作, 故在开发过程中可以十分容易进行程序的修改, 大大缩短了开发周期。AT89S52是一种带8K 字节闪烁可编程可擦除只读存储器(FPEROM —Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。AT89S52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
下面是对单片机AT89S52主要特性进行了一些描述。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程
Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89S52芯片引脚图见图3-1。系统结构框图如图3-2所示:
图3-1 AT89S52的引脚图
图3-2 AT89S52系统结构框图
AT89S52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件的话,XTAL2可以不接,而从XTAL1
接入,如图3-3所示。
图3-3 外部振荡电路连接图
外接晶体以及电容C1、C2构成并联谐振电路 [3],接在放大器的反馈回路中,内部振荡器产生自激振荡,一般晶振可在2~12MHz 之间任选。对外接电容值虽然没有严格的要求,但电容的大小多少会影响振荡频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性。外接晶体时,C1和C2通常选30pF 左右;外接陶瓷谐振器时,C1和C2的典型值为47pF 。
单片机在开机时都需要复位,以便中央处理器CPU 以及其他功能部件都处于一个确定的初始状态,并从这个状态开始工作。51的RST 引脚是复位信号的输入端。复位电平是高电平有效,持续时间要有24个时钟周期以0上。本系统中单片机时钟频率为6MHz 则复位脉冲至少应为4us 。
方案一:上电复位电路
上电瞬间,RST 端的电位与Vcc 相同,随着电容的逐步充电,充电电流减小,RST 电位逐渐下降。上电复位所需的最短时间是振荡器建立时间加上二个机器周期,在这段时间里,振荡建立时间不超过10ms 。复位电路的典型参数为:C 取10uF,R 取2k, 故时间常数
τ=RC=10⨯10-6⨯2⨯103=20ms
足以满足要求。其电路如图3-5所示。
图3-5 上电复位电路连接图
方案二:外部复位电路
按下开关时,电源通过电阻对外接电容进行充电,使RES 端为高电平,复位按钮松开后,电容通过下拉电阻放电,逐渐使RET 端恢复低电平。
图3-6 手动上电复位电路连接图
考虑到电路对复位电路的要求不高,且尽量使电路简单,故采用方案一:上电复位电路。
3.2按键接口电路的设计
单片机使用的键盘分为独立式和矩阵式两种。
方案一:矩阵式键盘适用于按键数量较多的场合,它有行线和列线组成,按键位于行、列的交叉点上。行、列线分别连接到按键开关的两端,而有键按下时,行线电平状态将由与此行线相连的列线电平决定,列线电平如果为低,则行线电平为低;反之,则为高。这一点是识别矩阵键盘按键是否被按下的关键。矩阵式键盘各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。
方案二:矩阵式键盘也称行列式键盘,因为键的数目较多,所以键按行列组成矩阵。独立式键盘就是各按键相互独立,每个按键各接一根输入线,一根输入线上的按键工作状态不会影响其他输入线上的工作状态。因次,通过检测输入线的电平状态可以很容易的判断哪个按键被按下了。独立式按键电路配置灵活,软件结构简单。但每个按键需占用一根输入口线,此种按键电路适用于按键较少或操作速度教高的场合独立式实际上就是一组相互独立的按键,这些按键可直接与
单片机的I/O口连接,连接方法就是每个按键独立一条口线,各按键之间状态不会影响且接口简单。
考虑到这个控制器中,设定的按键不多,为了使系统简单明了,在这里选择独立式按键。如图所示,[SET]键用来设置倒计时时间,[SELECT]用来选择“+”“—”。
图3-7 独立的按键电路连接图
3.3 指示电路的设计
指示很简单,采用LED (发光二极管),考虑到单片机端口常态是高电平,设计采用低电平点亮发光管,如图3-8所示。I/O口的灌电流最大30mA 左右,假设每根线20mA ,C 系列都低于20mA, 假设单个发光管耐压2V (不同的管子不同,相差不多),系统采用5V 供电,则限流电阻R 的阻值为:
实际选择200Ω,实验发现发光二极管显示正常。通过程序来控制指示灯红、绿、黄的通断来模拟交通灯的指示作用。其电路图如图3-8所示。 R =U (5-2)V ==150ΩI 0.02A
图3-8 指示电路部分电路图
3.4 显示电路的设计
数码管显示电路有多种方式,按照数据传输方式有两种:并行形式 和串行形式,下面针对两种方式进行说明。
本设计由两个8段共阳极的LED 显示块组成,P0口接两块LED 的段控,P2口接位控。与单片机接口电路硬件连接图如图3-10所示。
[4]
图3-10 显示部分连接图
3.5 按键电路
交通灯控制电路,所需按键不多,就用单片机最小系统的三个键,电路如图3-11。
图 3-11
3.6 PCB 印刷图
4 软件设计
4.1 软件流程图
按交通灯的功能,系统程序必须具备按键扫描处理、实时数码管显示等任务。
4.1.1 主程序的设计
系统在上电复位后,先对档位寄存器赋默认值,并进行清除超时标志位,设置定时器及中断系统的工作方式等初始化工作。
图4-1 主程序流程图
4.1.2 按键扫描处理子程序的设计
按键扫描处理子程序负责设置东西、南北走向的等待时间按,若有键按下,则做出相应的处理。
图4-2 按键扫描子程序
键B 功能子程序流程图
键A 功能子程序流程图
4.2 交通灯程序清单
;**************************************************** **********: ; 项目名称:交通灯的设计
; 设计者:凡文波 Num:[1**********] ; 设计日期:2010年12月29日
;********************************************************************; ; 堆栈栈底7FH;
;********************************************************************; ;LED 数码管显示器设定;
;P0.7---P0.0段控线,接LED 的显示段dp,g,f,e,d,c,b,a
;P2.7---P2.0位控线, 从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ; 显示缓冲区设定从左至右依次7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ;********************************************************************; ; 独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;********************************************************************; ; 子程序;
;DISP (数码管显示子程序)
;DL(1毫秒延时子程序, 晶振频率12MHz)
;********************************************************************; ; 常数表格;
;TAB(共阳数码管字型代码表)
;DISPH(系统提示符P. 字型代码序号表)
;********************************************************************; ; 中断服务程序;
;********************************************************************; ; 键功能程序;
;******** ***********************************************************; ; 数据存储器变量及常量单元定义;
;********************************************************************; ; 伪指令定义区
;************************ *******************************************; ; 系统起始程序区
为
ORG 0000H
START: LJMP MAIN
;******************************************************************** ; 系统监控程序区
ORG MOV MOV MOV
0030H SP, IE, PSW, R0,
#5FH #00H
; 确定堆栈区 ;中断被禁止
;RAM 区首地址 ;RAM 区单元个数
MAIN: MOV
#00H #20H
MOV R7, #96
ML: MOV @R0, #00H
; 清空00-7FH 这96个单元
INC R0
DJNZ R7, ML
;******************************************************************** ; 给最低位送P. 指令,高7位送灭指令,再调显示子程序,并判断是否有某键按下
LOOP: MOV 78H, #0BH
MOV
MOV MOV MOV MOV MOV MOV
79H, 7AH, 7BH, 7CH, 7DH, 7EH, 7FH,
#0AH #0AH #0AH #0AH #0AH #0AH #0AH
;送P. 指令,高7位送灭指令 ;调显示子程序 ;调键扫子程序 ;调用比较子程序
LCALL DIR LCALL KEY LJMP
LOOP
LCALL BIJIAO
;******************************************************************** ; 键功能程序(初始化)
KEYA: MOV
MOV MOV MOV MOV MOV LJMP
R5, P3, R0, R1, 78H, 79H, LL
#00H #7EH #00H #06H #00H #06H
;将会从00H 加到第56秒
LCALL MIE
;******************************************************************** ; 下一段程序实现 当数是10的倍数时个位变9十位减1的操作(因交通灯倒计时)
LP0: CJNE
MOV DEC MOV MOV
R0, R0, R1 A, 79H,
#00H, BJ1 ; 个位不等于0转到BJ1 #09H
R1 A
;再调用高6位“灭”段码
LCALL MIE
LJMP MOV INC MOV CJNE
R0 LL A, 78H, R5 A, A,
BJ1: DEC ;将R0(个位) 减1
LL: MOV R0 A R5
LCALL DL1S
#38H, LP0
;******************************************************************** ; 本程序将第57秒的LED 灯全灭(后一秒黄灯闪烁)
MOV MOV MOV
P3, R4, 78H, 79H,
#0FFH #75H #04H #00H
;LED 灯全灭
; 再调用高6位“灭”段码 ; 调键扫
LOOP6:MOV
LCALL MIE LCALL DIR LCALL KEY DJNZ
R4,
LCALL BIJIAO1
LOOP6 ;第57秒全灭, 下一秒闪黄灯
;******************************************************************** ; 以下程序黄灯在58、59、60秒中闪烁3次 ; 黄灯初亮0.5秒
MOV MOV MOV
P3, R4, 78H, 79H,
#0BDH #3AH #03H #00H
; 给显示缓存区低二位赋值“03” ; 调用“灭”段码指令 ; 用显示子程序DIR 延时
; 键扫后比较
LP1: MOV
LCALL MIE LCALL DIR LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LP1 ;延时0.5秒
;******************************************************************** ; 黄灯灭0.5秒
CPL CPL
P3.1 P3.6
; 黄灯灭
LP2: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LP2
; 延时0.5秒
;******************************************************************** ; 黄灯亮0.5秒
MOV MOV MOV CPL CPL
R4, 78H, 79H, P3.1 P3.6
#3AH #02H #00H
; 给显示缓存区低二位赋值“02”
LCALL MIE
; 黄灯亮
LPB: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPB
;延时0.5秒
;******************************************************************** ; 黄灯灭0.5秒
MOV CPL CPL
R4, P3.1 P3.6
#3AH
;黄灯灭
LPC: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPC
;延时0.5秒
;******************************************************************** ; 黄灯亮0.5秒
MOV MOV MOV
R4, 78H, 79H,
#3AH #01H #00H
; 给显示缓存区低二位赋值“01”
LCALL MIE
CPL
P3.6
LPD: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPD
;延时0.5秒
;******************************************************************** ; 黄灯最后灭0.5秒
MOV CPL CPL
R4, P3.1 P3.6
#3AH
;黄灯灭
LPE: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPE
;延时0.5秒
;******************************************************************** ; 乙车道绿灯开始亮,甲车道红灯亮,大数程序注释同上程序
MOV MOV MOV MOV MOV MOV LJMP MOV DEC MOV MOV LJMP LJMP
P3, R5, R0, R1, 78H, 79H, LL1 R0, R0, R1 A, 79H, LL1 R0 LL1
R1 A #0DBH #1AH #00H #03H #00H #03H
; 再送一遍“30” ; 调高6位“灭”
;延时参数,延时26秒
;给十位送3,个位送0
LCALL MIE
LP3: CJNE #00H, BJ2 ;不等于0就将最低位减1 #09H
LCALL MIE
BJ2: DEC
MOV DJNZ
78H, R5,
A
;延时26秒
LP3
LCALL DL1S
;******************************************************************** ; 第27秒全灭, 下一秒闪黄灯
MOV MOV MOV MOV MOV
P3, 78H, 79H, R0, R1,
#0FFH #04H #00H #04H #00H
;第27秒全灭, 下一秒闪黄灯
LCALL MIE LCALL DL1S MOV MOV MOV MOV MOV
P3, 78H, 79H, R0, R1,
#0BDH #03H #00H #03H #00H
LCALL MIE LCALL DL05S
;******************************************************************** ; 黄灯亮灭,亮灭3次
CPL CPL CPL CPL MOV MOV MOV MOV
P3.1 P3.6 P3.1 P3.6 78H, 79H, R0, R1,
#02H #00H #02H #00H
;黄灯亮灭,亮灭3次
LCALL DL05S
LCALL MIE LCALL DL05S CPL
P3.1
CPL CPL MOV MOV MOV MOV
P3.1 P3.6 78H, 79H, R0, R1,
#01H #00H #01H #00H
LCALL DL05S
LCALL MIE LCALL DL05S CPL LJMP
P3.6 KEYA
; 返回KEYA
CPL P3.1
LCALL DL05S
;******************************************************************** ; 应急车辆红灯亮区
KEYB: MOV
PUSH SETB SETB MOV MOV MOV MOV MOV MOV
21H, PSW RS1 RS0 P3, R7, 79H, 78H, R0, R1,
; 保护作用
; 延时参数
#7BH #09H #01H #00H #00H #01H
; 以上赋值“10” ; 调“灭”指令
P3
LCALL MIE MOV MOV MOV
R0, R1, 78H, 79H,
LCALL DL1S2
#09H #0AH R0 R1
;"9" 赋给显示缓存区
LOOP5: MOV
LCALL MIE LCALL DL1S2
DJNZ POP MOV RET
R7, PSW P3,
; 显示9次,分别为9、8„„ 1
LOOP5
LCALL MIE
21H
;******************************************************************** ; 子程序;
; 键扫后判断是否为某一键按下,在无键按下功能范围内使用
BIJIAO: MOV
A,
20H
;B键按下就执行KEYB 程序
;无键按下返回
CJNE A, LJMP KEYB
#01H, LP01
LJMP KEYA
#02H, LP00
LP00: CJNE A, LP01: RET
;******************************************************************** ; 键扫后判断是否为某一键按下,在KEYA 功能范围内使用
BIJIAO1: MOV
CJNE RET
#02H, LP03
;B键按下就执行KEYB 程序
;无键按下返回
LJMP KEYB
A, A,
20H
#01H, LP02
LP02: CJNE A, LP03: RET
;******************************************************************** ; 键盘扫描子程序KEY
KEY: LCALL KEYCHULI
JZ
EXIT
LCALL DIR LCALL DIR JZ MOV JZ
EXIT B, KEY1
;调显示子程序去抖动
;没有键按下,转返回 ;保存取反后的键值 ;调P1口数据处理子程序 ;键释放,转恢复键值
LCALL KEYCHULI
20H
;调P1口数据处理子程序 ;没有键按下,转返回
KEYSF: LCALL KEYCHULI
LJMP
20H,
;等待键释放 ;键值送20H 保存 ;子程序返回
KEYSF
KEY1: MOV EXIT: RET
B
;P1口数据处理子程序KEYCHULI
KEYCHULI: PUSH
SETB CLR MOV MOV CPL ANL MOV CLR CLR POP
PSW RS1 RS0 P1, A, A A, 20H, RS1 RS0 PSW
;恢复,返回
;保护
;先向P1口写1 ;读P1口数据 ;P1口数据取反
;保存取反后的键值
#0FFH P1
#03H A
RET
;******************************************************************** ; 显示子程序
DIR:PUSH PSW
SETB CLR MOV MOV MOV MOVC MOV MOV MOV MOVC MOV INC
RS0 RS1 R3, R0, A, A, P2, A, A, P0, R3
#00H #78H
; 查表位控代码
R3 @A+DPTR A @R0 @A+DPTR A
; 延时1ms
; 查表段控代码
DIR0: MOV DPTR, #TAB2
DPTR, #TAB1
LCALL DL
CJNE POP RET
R3, PSW
#08H, DIR0
;******************************************************************** ; 显示字符段选码表(共阳极代码)
TAB1: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
TAB2: DB
0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
;位控代码
;0-8
DB 90H, 0FFH,0CH
;9,灭,p.
;******************************************************************** ; 将数码管高6位赋" 灭" 指令 MIE: MOV
;******************************************************************** ; 延时、亮灯并调键扫1秒,在KEYA 功能范围内使用,含键扫比较
DL1S: MOV
R4,
#75H
; 延时并亮灯1秒
LOOP1: LCALL DIR
LCALL KEY LCALL BIJIAO1 MOV MOV DJNZ RET
78H, 79H, R4,
R0 R1
MOV MOV MOV MOV MOV RET
7AH, 7BH, 7CH, 7DH, 7EH, 7FH,
#0AH #0AH #0AH #0AH #0AH #0AH
LCALL MIE
LOOP1 ; 延时1s
;******************************************************************** ; 延时、亮灯并调键扫1秒,在KEYB 功能范围内使用,不含键扫比较
DL1S2: MOV
MOV MOV DJNZ RET
R4, 78H, 79H, R4,
#78H R0 R1 LOO1
; 延时并亮灯1秒
LOO1: LCALL DIR
LCALL MIE
;******************************************************************** ; 延时、亮灯并调键扫0.5秒,在KEYA 功能范围内使用,含键扫比较
DL05S: MOV
R4,
#3AH
; 延时并亮灯0.5秒
LOOP9: LCALL DIR
LCALL KEY LCALL BIJIAO1 MOV MOV DJNZ RET
78H, 79H, R4,
R0 R1 LOOP9
LCALL MIE
;******************************************************************** ; 延时1ms 程序 DL: MOV
END
DL1: MOV DL2: DJNZ
DJNZ RET
R7, #02H R6, #0FFH R6, DL2 R7, DL1
; 延时1MS 程序
4.3 软件仿真
Proteus7.2是目前最好的模拟单片机外围器件的工具,可以仿真51 系列、AVR ,PIC 等常用的MCU 及其外围电路。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。
本次设计通过Proteus7.2对交通灯模拟系统进行仿真, 进行软件和模拟硬件的结合调试, 得到了比较比较理想的效果, 如图4-3模拟仿真的结果.
图4-3 Proteus7.2模拟仿真图
4.4 误差分析
本次实验虽然成功,但也存在一些不足,比如说编写程序冗杂过长,延时时间不够精确等等,最主要的问题是延时是采用显示主程序DIR 延时,估算其为8ms 多一点,故倒计时时不够精确,在严密工程上必然会暴露它的弊端,不过是初学者所编学习程序而已。
4.5设计心得体会
本次设计之后,加深了我对单片机的认知。第一:加深了我对电路设计 电路分析的能力,提高了我们单片机技术基础知识的掌握的程度。第二:熟悉 各软件的操作与应用,如Protell99SE 和Proteus 。第三:增强了我们独立思 主动查阅资料的能力,为了准备这次课程设计我们组查阅了许多的资料。第四 我们的动手能力在这次课程设计中得到了很大的提高,特别是我们的耐心得到 前所未有的锻炼,没有足够的耐心是无法取得成功的。第五:我们更加清楚的 识到实践是检验真理的唯一标准。
致 谢
本次设计得以成功,离不开吴乐老师的细心指导,及其多次询问研究过程中,给我指点迷津,帮助我开拓思路,考虑问题要周全。在此我对吴乐老师表示衷心地感谢!
也离不开电子科技协会的PCB 板制作过程中提供的工具和相关技术支持,在此我对电子科技协会表示深深地感谢!
感谢学校实验提供的实验与制作及环境,感谢电气与信息工程系老师的督促。
参考文献
[1] [2] [3] [4]
鲜于泽, 李际周 1995 科学通报 40 124
汤涌 2006 电网技术 30 29电力系统强迫功率振荡的基础理论29-33 贺昱曜, 王伟根, 徐德民 1999 中国电机工程学报 19 14串并联谐振 DC —AC 变换器原理分析, 建模及仿真14-17
周德仿 2004 黄冈职业技术学院学报 6 42非晶态 Fe86Co4Zr10 因瓦合金的声子谱软化124-126
附 录A :
单片机最小系统元件列表
目 录
1 绪论.............................................................. 1
2 总体方案设计...................................................... 2
2.1 课题研究主要内容 .............................................. 2
2.2课题的设计思路 ................................................ 3
2.3 总体方案组成和说明 ............................................ 4
3 硬件电路设计及描述................................................ 5
3.1 单片机最小系统 ................................................ 5
3.2按键接口电路的设计 ............................................ 8
3.3 指示电路的设计 ................................................ 9
3.4 显示电路的设计 ............................................... 10
3.5 按键电路 ..................................................... 10
3.6 PCB 印刷图 ................................................... 11
4 软件设计......................................................... 12
4.1 软件流程图 ................................................... 13
4.2 交通灯程序清单 ............................................... 16
4.3 软件仿真 ..................................................... 27
4.4 误差分析 ..................................................... 27
4.5设计心得体会 ................................................. 28
致 谢............................................................. 29
参考文献........................................................... 29
附 录A : ......................................................... 31
附 录B : ......................................................... 31
附 录C : ......................................................... 31
1 绪论
近年来,随着汽车数量的猛增,我国大中型城市的城市交通,正面临着严峻的考验,从而导致交通问题日益严重,其主要表现如下:交通事故频发,对人类生命安全造成极大威胁;交通拥堵严重,导致出行时间增加,能源消耗加大;空气污染和噪声污染程度日益加深等。日常的交通堵塞成为人们司空见惯而又不得不忍受的问题。在这种背景下,结合我国城市道路交通的实际情况,开发出真正适合我们自身特点的智能信号灯控制系统已经成为当前的主要任务。
和谐的城市交通具有很重要的现实意义。城市交通是城市经济生活的命脉,是衡量一个城市文明进步的标志,对于城市经济的发展和人民生活水平的提高起着十分重要的作用。作为城市交通网的重要组成部分, 交叉口是道路通行能力的瓶颈和交通阻塞及事故的多发地。城市的交通拥堵,大部分是由于交叉口的通行能力不足或没有充分利用造成的,这导致车流中断、事故增多、延误严重。对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。
2 总体方案设计
本设计的重点是交通灯的现实电路的设计,另外还包含了单片机的最小系统,电源电路以及设计的核心单元单片机。在设计前要先对各部分电路设计方案进行选择,本章对采用哪种方案及如何选择芯片做出了具体的说明,并最终给出了总体框图和设计思路。
2.1 课题研究主要内容
本设计以单片机为核心,通过Proteus professional软件进行模拟仿真,以此来实现交通灯控制系统的模拟功能,从而达到有效的控制交通状况的目的。 设计内容及要求:
设计一个具有特定功能的十字路口交通灯。该交通灯上电或按键复位后能自动显示系统提示符“P. ”, 进入准备工作状态。按开始键则开始工作,按结束键则返回“P. ”状态。要求甲车道和乙车道两条交叉道路上的车辆交替运行,甲车道为主车道,每次通车时间为60秒,乙车道为次车道,每次通车时间为30秒,要求黄灯亮3秒,并且1秒闪烁一次。有应急车辆出现时,红灯全亮,应急车辆通车时间10秒,同时禁止其他车辆通过
针对以上要求,着重要完成以下几个方面的内容:
对于系统的硬件设计,主要包括:
单片机基本系统电路设计;
显示、按键电路设计;
对于系统的软件设计,主要包括:
系统主程序的设计;
统几个中断子程序的设计;
系统软件流程图;
Proteus professional软件的模拟仿真等内容;
针对本次设计中所存在的问题,提出部分改进意见和下一步所要研究的目标。最后,总结了设计过程的收获与不足并展望了未来。
2.2课题的设计思路
交叉字路口是城市交通运输的咽喉,如何使各种交通流顺畅地通过是城市交通信号控制系统成功与否的关键。随着现代城市的发展,交通流量的增加,现在的大中城市都以六车道居多,本方案即以六车道为控制对象,其结构如图2-1所示:
本设计主要是关于交通灯的智能控制,车辆行驶时共有直行、左转、右转三个方向,通过数码管对倒计时间的显示和红、绿、黄三色灯的指示,以达到交通顺畅通行的目的。同时,可以通过按键来控制倒计时的长短,实现智能控制人流高峰和低谷时,交通灯运行的状态。
单片机的特点:
(1)控制系统在线作用。单片机的控制作用可分为两个方面:一是离线控制,二是在线控制。
(2)软硬件结合。单片机的引入使控制系统大大“软化 [1]”,相比其他计算机应用问题,单片机控制应用中的硬件内容较多,所以单片机控制应用有软硬结合的特点。
(3)应用现场环境恶劣。通常单片机应用现场的环境比较恶劣,电磁干扰、电源波动、冲击振动、高低温等因素都会影响系统的工作的稳定。此外,无人值守的环境也会对单片机系统的稳定性和可靠性提出更高的要求。所以稳定和可靠在单片机的应用中具有格外重要的意义。
(4)应用的广泛性。在生活和生产的各个领域中,凡是有自动控制要求的地方都会有单片机的身影出现。其应用领域包括工业自动化方面、仪器仪表方面、家用电器方面、信息和通信产品方面以及军事装备方面。
综上所述,单片机的稳定性,可靠性都有着很好的保证,它也具有一定的精度,且低电压、低功耗。从经济方面考虑,也最为合适。所以此次设计选用单片
图2-1 交叉路口结构图
机为核心控制器。选择ATMEL 公司的AT89S52单片机最合适。
2.3 总体方案组成和说明
单片机模块是整个系统的核心部分,在这样一个模拟交通灯系统中,需要有时钟电路模块提供基准震荡频率 [2]以及单片机基本系统、指示电路、显示电路、键盘电路、电源电路、下载线电路设计。系统基本原理方框图如图2-2所示: 图
2-2
系
统
基
本
原
理
方
框图
由上总体方框图可以看到此次设计硬件电路有六大部分所构成,围绕以主控部分发挥各自的功能。只有这几部分有机结合才可以很好的实现本次设计的的。
3 硬件电路设计及描述
本系统的硬件结构主要由单片机系统、键盘电路、电源电路、显示电路、LED 指示电路等五部分组成。下面对以上六部分进行逐一介绍。
3.1 单片机最小系统
单片机最小系统主要组成部分包括:AT89S52单片机、时钟电路、复位电路。单片机是本设计的核心部分,它是整个系统能够正常运行的控制中心。
系统采用美国ATMEL 公司的AT89S52单片机,其内部含有可重复编程的Flash 存储器, 可进行1000次擦写操作, 故在开发过程中可以十分容易进行程序的修改, 大大缩短了开发周期。AT89S52是一种带8K 字节闪烁可编程可擦除只读存储器(FPEROM —Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。AT89S52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
下面是对单片机AT89S52主要特性进行了一些描述。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程
Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89S52芯片引脚图见图3-1。系统结构框图如图3-2所示:
图3-1 AT89S52的引脚图
图3-2 AT89S52系统结构框图
AT89S52单片机有一个用于构成内部振荡器的反相放大器,XTAL1和XTAL2分别是放大器的输入、输出端。石英晶体和陶瓷谐振器都可以用来一起构成自激振荡器。从外部时钟源驱动器件的话,XTAL2可以不接,而从XTAL1
接入,如图3-3所示。
图3-3 外部振荡电路连接图
外接晶体以及电容C1、C2构成并联谐振电路 [3],接在放大器的反馈回路中,内部振荡器产生自激振荡,一般晶振可在2~12MHz 之间任选。对外接电容值虽然没有严格的要求,但电容的大小多少会影响振荡频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性。外接晶体时,C1和C2通常选30pF 左右;外接陶瓷谐振器时,C1和C2的典型值为47pF 。
单片机在开机时都需要复位,以便中央处理器CPU 以及其他功能部件都处于一个确定的初始状态,并从这个状态开始工作。51的RST 引脚是复位信号的输入端。复位电平是高电平有效,持续时间要有24个时钟周期以0上。本系统中单片机时钟频率为6MHz 则复位脉冲至少应为4us 。
方案一:上电复位电路
上电瞬间,RST 端的电位与Vcc 相同,随着电容的逐步充电,充电电流减小,RST 电位逐渐下降。上电复位所需的最短时间是振荡器建立时间加上二个机器周期,在这段时间里,振荡建立时间不超过10ms 。复位电路的典型参数为:C 取10uF,R 取2k, 故时间常数
τ=RC=10⨯10-6⨯2⨯103=20ms
足以满足要求。其电路如图3-5所示。
图3-5 上电复位电路连接图
方案二:外部复位电路
按下开关时,电源通过电阻对外接电容进行充电,使RES 端为高电平,复位按钮松开后,电容通过下拉电阻放电,逐渐使RET 端恢复低电平。
图3-6 手动上电复位电路连接图
考虑到电路对复位电路的要求不高,且尽量使电路简单,故采用方案一:上电复位电路。
3.2按键接口电路的设计
单片机使用的键盘分为独立式和矩阵式两种。
方案一:矩阵式键盘适用于按键数量较多的场合,它有行线和列线组成,按键位于行、列的交叉点上。行、列线分别连接到按键开关的两端,而有键按下时,行线电平状态将由与此行线相连的列线电平决定,列线电平如果为低,则行线电平为低;反之,则为高。这一点是识别矩阵键盘按键是否被按下的关键。矩阵式键盘各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。
方案二:矩阵式键盘也称行列式键盘,因为键的数目较多,所以键按行列组成矩阵。独立式键盘就是各按键相互独立,每个按键各接一根输入线,一根输入线上的按键工作状态不会影响其他输入线上的工作状态。因次,通过检测输入线的电平状态可以很容易的判断哪个按键被按下了。独立式按键电路配置灵活,软件结构简单。但每个按键需占用一根输入口线,此种按键电路适用于按键较少或操作速度教高的场合独立式实际上就是一组相互独立的按键,这些按键可直接与
单片机的I/O口连接,连接方法就是每个按键独立一条口线,各按键之间状态不会影响且接口简单。
考虑到这个控制器中,设定的按键不多,为了使系统简单明了,在这里选择独立式按键。如图所示,[SET]键用来设置倒计时时间,[SELECT]用来选择“+”“—”。
图3-7 独立的按键电路连接图
3.3 指示电路的设计
指示很简单,采用LED (发光二极管),考虑到单片机端口常态是高电平,设计采用低电平点亮发光管,如图3-8所示。I/O口的灌电流最大30mA 左右,假设每根线20mA ,C 系列都低于20mA, 假设单个发光管耐压2V (不同的管子不同,相差不多),系统采用5V 供电,则限流电阻R 的阻值为:
实际选择200Ω,实验发现发光二极管显示正常。通过程序来控制指示灯红、绿、黄的通断来模拟交通灯的指示作用。其电路图如图3-8所示。 R =U (5-2)V ==150ΩI 0.02A
图3-8 指示电路部分电路图
3.4 显示电路的设计
数码管显示电路有多种方式,按照数据传输方式有两种:并行形式 和串行形式,下面针对两种方式进行说明。
本设计由两个8段共阳极的LED 显示块组成,P0口接两块LED 的段控,P2口接位控。与单片机接口电路硬件连接图如图3-10所示。
[4]
图3-10 显示部分连接图
3.5 按键电路
交通灯控制电路,所需按键不多,就用单片机最小系统的三个键,电路如图3-11。
图 3-11
3.6 PCB 印刷图
4 软件设计
4.1 软件流程图
按交通灯的功能,系统程序必须具备按键扫描处理、实时数码管显示等任务。
4.1.1 主程序的设计
系统在上电复位后,先对档位寄存器赋默认值,并进行清除超时标志位,设置定时器及中断系统的工作方式等初始化工作。
图4-1 主程序流程图
4.1.2 按键扫描处理子程序的设计
按键扫描处理子程序负责设置东西、南北走向的等待时间按,若有键按下,则做出相应的处理。
图4-2 按键扫描子程序
键B 功能子程序流程图
键A 功能子程序流程图
4.2 交通灯程序清单
;**************************************************** **********: ; 项目名称:交通灯的设计
; 设计者:凡文波 Num:[1**********] ; 设计日期:2010年12月29日
;********************************************************************; ; 堆栈栈底7FH;
;********************************************************************; ;LED 数码管显示器设定;
;P0.7---P0.0段控线,接LED 的显示段dp,g,f,e,d,c,b,a
;P2.7---P2.0位控线, 从左至右(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ; 显示缓冲区设定从左至右依次7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0) ;********************************************************************; ; 独立式键盘设定;
;8个按键S2至S9分别依次接在P1.0至P1.7口线;
;********************************************************************; ; 子程序;
;DISP (数码管显示子程序)
;DL(1毫秒延时子程序, 晶振频率12MHz)
;********************************************************************; ; 常数表格;
;TAB(共阳数码管字型代码表)
;DISPH(系统提示符P. 字型代码序号表)
;********************************************************************; ; 中断服务程序;
;********************************************************************; ; 键功能程序;
;******** ***********************************************************; ; 数据存储器变量及常量单元定义;
;********************************************************************; ; 伪指令定义区
;************************ *******************************************; ; 系统起始程序区
为
ORG 0000H
START: LJMP MAIN
;******************************************************************** ; 系统监控程序区
ORG MOV MOV MOV
0030H SP, IE, PSW, R0,
#5FH #00H
; 确定堆栈区 ;中断被禁止
;RAM 区首地址 ;RAM 区单元个数
MAIN: MOV
#00H #20H
MOV R7, #96
ML: MOV @R0, #00H
; 清空00-7FH 这96个单元
INC R0
DJNZ R7, ML
;******************************************************************** ; 给最低位送P. 指令,高7位送灭指令,再调显示子程序,并判断是否有某键按下
LOOP: MOV 78H, #0BH
MOV
MOV MOV MOV MOV MOV MOV
79H, 7AH, 7BH, 7CH, 7DH, 7EH, 7FH,
#0AH #0AH #0AH #0AH #0AH #0AH #0AH
;送P. 指令,高7位送灭指令 ;调显示子程序 ;调键扫子程序 ;调用比较子程序
LCALL DIR LCALL KEY LJMP
LOOP
LCALL BIJIAO
;******************************************************************** ; 键功能程序(初始化)
KEYA: MOV
MOV MOV MOV MOV MOV LJMP
R5, P3, R0, R1, 78H, 79H, LL
#00H #7EH #00H #06H #00H #06H
;将会从00H 加到第56秒
LCALL MIE
;******************************************************************** ; 下一段程序实现 当数是10的倍数时个位变9十位减1的操作(因交通灯倒计时)
LP0: CJNE
MOV DEC MOV MOV
R0, R0, R1 A, 79H,
#00H, BJ1 ; 个位不等于0转到BJ1 #09H
R1 A
;再调用高6位“灭”段码
LCALL MIE
LJMP MOV INC MOV CJNE
R0 LL A, 78H, R5 A, A,
BJ1: DEC ;将R0(个位) 减1
LL: MOV R0 A R5
LCALL DL1S
#38H, LP0
;******************************************************************** ; 本程序将第57秒的LED 灯全灭(后一秒黄灯闪烁)
MOV MOV MOV
P3, R4, 78H, 79H,
#0FFH #75H #04H #00H
;LED 灯全灭
; 再调用高6位“灭”段码 ; 调键扫
LOOP6:MOV
LCALL MIE LCALL DIR LCALL KEY DJNZ
R4,
LCALL BIJIAO1
LOOP6 ;第57秒全灭, 下一秒闪黄灯
;******************************************************************** ; 以下程序黄灯在58、59、60秒中闪烁3次 ; 黄灯初亮0.5秒
MOV MOV MOV
P3, R4, 78H, 79H,
#0BDH #3AH #03H #00H
; 给显示缓存区低二位赋值“03” ; 调用“灭”段码指令 ; 用显示子程序DIR 延时
; 键扫后比较
LP1: MOV
LCALL MIE LCALL DIR LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LP1 ;延时0.5秒
;******************************************************************** ; 黄灯灭0.5秒
CPL CPL
P3.1 P3.6
; 黄灯灭
LP2: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LP2
; 延时0.5秒
;******************************************************************** ; 黄灯亮0.5秒
MOV MOV MOV CPL CPL
R4, 78H, 79H, P3.1 P3.6
#3AH #02H #00H
; 给显示缓存区低二位赋值“02”
LCALL MIE
; 黄灯亮
LPB: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPB
;延时0.5秒
;******************************************************************** ; 黄灯灭0.5秒
MOV CPL CPL
R4, P3.1 P3.6
#3AH
;黄灯灭
LPC: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPC
;延时0.5秒
;******************************************************************** ; 黄灯亮0.5秒
MOV MOV MOV
R4, 78H, 79H,
#3AH #01H #00H
; 给显示缓存区低二位赋值“01”
LCALL MIE
CPL
P3.6
LPD: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPD
;延时0.5秒
;******************************************************************** ; 黄灯最后灭0.5秒
MOV CPL CPL
R4, P3.1 P3.6
#3AH
;黄灯灭
LPE: LCALL DIR
LCALL KEY
LCALL BIJIAO1 DJNZ
R4,
LPE
;延时0.5秒
;******************************************************************** ; 乙车道绿灯开始亮,甲车道红灯亮,大数程序注释同上程序
MOV MOV MOV MOV MOV MOV LJMP MOV DEC MOV MOV LJMP LJMP
P3, R5, R0, R1, 78H, 79H, LL1 R0, R0, R1 A, 79H, LL1 R0 LL1
R1 A #0DBH #1AH #00H #03H #00H #03H
; 再送一遍“30” ; 调高6位“灭”
;延时参数,延时26秒
;给十位送3,个位送0
LCALL MIE
LP3: CJNE #00H, BJ2 ;不等于0就将最低位减1 #09H
LCALL MIE
BJ2: DEC
MOV DJNZ
78H, R5,
A
;延时26秒
LP3
LCALL DL1S
;******************************************************************** ; 第27秒全灭, 下一秒闪黄灯
MOV MOV MOV MOV MOV
P3, 78H, 79H, R0, R1,
#0FFH #04H #00H #04H #00H
;第27秒全灭, 下一秒闪黄灯
LCALL MIE LCALL DL1S MOV MOV MOV MOV MOV
P3, 78H, 79H, R0, R1,
#0BDH #03H #00H #03H #00H
LCALL MIE LCALL DL05S
;******************************************************************** ; 黄灯亮灭,亮灭3次
CPL CPL CPL CPL MOV MOV MOV MOV
P3.1 P3.6 P3.1 P3.6 78H, 79H, R0, R1,
#02H #00H #02H #00H
;黄灯亮灭,亮灭3次
LCALL DL05S
LCALL MIE LCALL DL05S CPL
P3.1
CPL CPL MOV MOV MOV MOV
P3.1 P3.6 78H, 79H, R0, R1,
#01H #00H #01H #00H
LCALL DL05S
LCALL MIE LCALL DL05S CPL LJMP
P3.6 KEYA
; 返回KEYA
CPL P3.1
LCALL DL05S
;******************************************************************** ; 应急车辆红灯亮区
KEYB: MOV
PUSH SETB SETB MOV MOV MOV MOV MOV MOV
21H, PSW RS1 RS0 P3, R7, 79H, 78H, R0, R1,
; 保护作用
; 延时参数
#7BH #09H #01H #00H #00H #01H
; 以上赋值“10” ; 调“灭”指令
P3
LCALL MIE MOV MOV MOV
R0, R1, 78H, 79H,
LCALL DL1S2
#09H #0AH R0 R1
;"9" 赋给显示缓存区
LOOP5: MOV
LCALL MIE LCALL DL1S2
DJNZ POP MOV RET
R7, PSW P3,
; 显示9次,分别为9、8„„ 1
LOOP5
LCALL MIE
21H
;******************************************************************** ; 子程序;
; 键扫后判断是否为某一键按下,在无键按下功能范围内使用
BIJIAO: MOV
A,
20H
;B键按下就执行KEYB 程序
;无键按下返回
CJNE A, LJMP KEYB
#01H, LP01
LJMP KEYA
#02H, LP00
LP00: CJNE A, LP01: RET
;******************************************************************** ; 键扫后判断是否为某一键按下,在KEYA 功能范围内使用
BIJIAO1: MOV
CJNE RET
#02H, LP03
;B键按下就执行KEYB 程序
;无键按下返回
LJMP KEYB
A, A,
20H
#01H, LP02
LP02: CJNE A, LP03: RET
;******************************************************************** ; 键盘扫描子程序KEY
KEY: LCALL KEYCHULI
JZ
EXIT
LCALL DIR LCALL DIR JZ MOV JZ
EXIT B, KEY1
;调显示子程序去抖动
;没有键按下,转返回 ;保存取反后的键值 ;调P1口数据处理子程序 ;键释放,转恢复键值
LCALL KEYCHULI
20H
;调P1口数据处理子程序 ;没有键按下,转返回
KEYSF: LCALL KEYCHULI
LJMP
20H,
;等待键释放 ;键值送20H 保存 ;子程序返回
KEYSF
KEY1: MOV EXIT: RET
B
;P1口数据处理子程序KEYCHULI
KEYCHULI: PUSH
SETB CLR MOV MOV CPL ANL MOV CLR CLR POP
PSW RS1 RS0 P1, A, A A, 20H, RS1 RS0 PSW
;恢复,返回
;保护
;先向P1口写1 ;读P1口数据 ;P1口数据取反
;保存取反后的键值
#0FFH P1
#03H A
RET
;******************************************************************** ; 显示子程序
DIR:PUSH PSW
SETB CLR MOV MOV MOV MOVC MOV MOV MOV MOVC MOV INC
RS0 RS1 R3, R0, A, A, P2, A, A, P0, R3
#00H #78H
; 查表位控代码
R3 @A+DPTR A @R0 @A+DPTR A
; 延时1ms
; 查表段控代码
DIR0: MOV DPTR, #TAB2
DPTR, #TAB1
LCALL DL
CJNE POP RET
R3, PSW
#08H, DIR0
;******************************************************************** ; 显示字符段选码表(共阳极代码)
TAB1: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
TAB2: DB
0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
;位控代码
;0-8
DB 90H, 0FFH,0CH
;9,灭,p.
;******************************************************************** ; 将数码管高6位赋" 灭" 指令 MIE: MOV
;******************************************************************** ; 延时、亮灯并调键扫1秒,在KEYA 功能范围内使用,含键扫比较
DL1S: MOV
R4,
#75H
; 延时并亮灯1秒
LOOP1: LCALL DIR
LCALL KEY LCALL BIJIAO1 MOV MOV DJNZ RET
78H, 79H, R4,
R0 R1
MOV MOV MOV MOV MOV RET
7AH, 7BH, 7CH, 7DH, 7EH, 7FH,
#0AH #0AH #0AH #0AH #0AH #0AH
LCALL MIE
LOOP1 ; 延时1s
;******************************************************************** ; 延时、亮灯并调键扫1秒,在KEYB 功能范围内使用,不含键扫比较
DL1S2: MOV
MOV MOV DJNZ RET
R4, 78H, 79H, R4,
#78H R0 R1 LOO1
; 延时并亮灯1秒
LOO1: LCALL DIR
LCALL MIE
;******************************************************************** ; 延时、亮灯并调键扫0.5秒,在KEYA 功能范围内使用,含键扫比较
DL05S: MOV
R4,
#3AH
; 延时并亮灯0.5秒
LOOP9: LCALL DIR
LCALL KEY LCALL BIJIAO1 MOV MOV DJNZ RET
78H, 79H, R4,
R0 R1 LOOP9
LCALL MIE
;******************************************************************** ; 延时1ms 程序 DL: MOV
END
DL1: MOV DL2: DJNZ
DJNZ RET
R7, #02H R6, #0FFH R6, DL2 R7, DL1
; 延时1MS 程序
4.3 软件仿真
Proteus7.2是目前最好的模拟单片机外围器件的工具,可以仿真51 系列、AVR ,PIC 等常用的MCU 及其外围电路。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象。
本次设计通过Proteus7.2对交通灯模拟系统进行仿真, 进行软件和模拟硬件的结合调试, 得到了比较比较理想的效果, 如图4-3模拟仿真的结果.
图4-3 Proteus7.2模拟仿真图
4.4 误差分析
本次实验虽然成功,但也存在一些不足,比如说编写程序冗杂过长,延时时间不够精确等等,最主要的问题是延时是采用显示主程序DIR 延时,估算其为8ms 多一点,故倒计时时不够精确,在严密工程上必然会暴露它的弊端,不过是初学者所编学习程序而已。
4.5设计心得体会
本次设计之后,加深了我对单片机的认知。第一:加深了我对电路设计 电路分析的能力,提高了我们单片机技术基础知识的掌握的程度。第二:熟悉 各软件的操作与应用,如Protell99SE 和Proteus 。第三:增强了我们独立思 主动查阅资料的能力,为了准备这次课程设计我们组查阅了许多的资料。第四 我们的动手能力在这次课程设计中得到了很大的提高,特别是我们的耐心得到 前所未有的锻炼,没有足够的耐心是无法取得成功的。第五:我们更加清楚的 识到实践是检验真理的唯一标准。
致 谢
本次设计得以成功,离不开吴乐老师的细心指导,及其多次询问研究过程中,给我指点迷津,帮助我开拓思路,考虑问题要周全。在此我对吴乐老师表示衷心地感谢!
也离不开电子科技协会的PCB 板制作过程中提供的工具和相关技术支持,在此我对电子科技协会表示深深地感谢!
感谢学校实验提供的实验与制作及环境,感谢电气与信息工程系老师的督促。
参考文献
[1] [2] [3] [4]
鲜于泽, 李际周 1995 科学通报 40 124
汤涌 2006 电网技术 30 29电力系统强迫功率振荡的基础理论29-33 贺昱曜, 王伟根, 徐德民 1999 中国电机工程学报 19 14串并联谐振 DC —AC 变换器原理分析, 建模及仿真14-17
周德仿 2004 黄冈职业技术学院学报 6 42非晶态 Fe86Co4Zr10 因瓦合金的声子谱软化124-126
附 录A :
单片机最小系统元件列表