1 课题设计内容
对基于单片机的交通灯控制系统进行设计。所设计的系统功能为:以MCS-51系列单片机作为控制核心,在东西南北四个方向设置左拐、右拐、直行及行人4种通行指示灯,用计时器显示路口通行转换剩余时间。在出现紧急情况时,可以由交警手动实现全路口车辆禁行而行人通行状态,在特种车辆如119、120通过路口时,系统可自动转为特种车辆放行,其他车辆禁止通行状态。
2 设计方案论证
根据设计内容要求,提出了如下三种方案: 方案一:采用40脚、片内带8kB Flash ROM的AT89S52单片机作为控制核心,采用四组高亮红绿双色二极管作为东西南北四个路口的通行指示灯,采用四组3位LED数码管作为四个路口的通行倒计时显示器,LED显示采用动态扫描方式,以节省端口数。方案一结构框图如图4-1所示,按照这种结构设计,单片机端口资源刚好满足要求。 复位晶振RSTP1口P2口P0口南北通行灯(2组)东西通行灯(2组)3位LED显示X1X2特种车辆检测自动/手动控制转换INT1AT89S52列扫描驱动P3.7P3口 图4-1 方案一:采用LED动态扫描的交通灯控制系统结构框图 方案二:采用20脚、片内带2kB Flash ROM的AT89C2051单片机作为控制器,左拐、右拐、直行及行人4种通行指示采用16×16点阵双色LED发光管,通行倒计时显示也采用16×16点阵LED发光管。LED点阵的列驱动采用74LS595,以实现串行端口扩展,行译码采用4/16译码器74LS154,74LS154生成16条行选通信号线,每条行线上需要较大的驱动电流,选用大功率三极管作为驱动管。方案二结构框图如图4-2所示,
方案三:采用AT89C2051单片机作为控制器,左拐、右拐、直行、行人通行指示及通行倒计时指示采用单块LCD液晶点阵显示器。
三种方案的特点比较如下:方案一具有电路简单,设计方便,显示亮度高,耗
1
RXDTXDAT89C2051列驱动器74LS595...I/O口行译码器74LS154行驱动器双色LED显示点阵(每个路口7个)图4-2 方案二:采用16×16点阵LED发光管设计的交通灯控制系统结构框图
电较少,可靠性高等特点;方案二的图案显示逼真,单片机占用端口资源少,
缺点是需要大量的硬件,电路复杂,耗电量大,不太适合于模型制作;方案三设计占用单片机的端口最少,硬件也少,耗电也最少,虽然显示图案也很精美,但由于亮度太暗,晚上还得开背光灯,不够实用。可见方案一优于其他两种方案,因此本设计选用方案一:采用LED动态扫描的方案进行设计。
...... 3 系统硬件设计
采用LED动态扫描的交通灯控制系统电路原理图如图4-3所示系统由控制模块、通行灯显示模块、时间显示模块、电源模块四部分组成。 4.3.1控制模块 控制模块电路如图4-4所示。主控制器采用AT89S52。 AT89S52的晶振及复位电路按典型电路设计,元器件参数如图4-4中所示,晶振频率选为12MHz。P1口用于控制南北通行灯,P2口用于控制东西通行灯,P0口用于四组3位LED显示器的段码控制,P3.0~P3.2口用于3位LED显示器的位码控制。对不同城市,准备采用两种倒计时方式:对车流量较大的大城市采用120S倒计时,对中小城市采用60S倒计时。两种倒计时采用P3.6上的S2开关进行转换。在出现紧急情况时,由交警手动按S3实现全路口车辆禁行而行人通行状态。现场特种车的到来信号可以采用红外线接收器采集,使用单片机的外部中断1响应特种车的通行要求。此处采用S4按键模拟特种车的到来信号,按一下S4表示有特种车要通行,执行相应的中断服务程序。由于AT89S52使用片内的8KB的Flash程序存储器,所以片内外程序存储器选择引脚EA/VPP接+5V电源。 4.3.2 通行灯显示模块 通行灯显示模块如图4-5所示(以西路口和北路口为例)。通行灯指示采用高亮共阴红绿双色发光二极管,左拐、右拐、直行及行人各一个。双色发光二极管的共阴极通过电阻接地,阳极接P1口或P2口(南北为P1口,东西为P2口),经74HC244控制。当发光电流为6mA时,限流电阻按公式R=(5-1.8)/0.006计算,取标称值为510Ω。由于通行时南北双向指示牌相同,东西双向指示牌相同,因此每个端口应具有12mA的驱动电流能力,在单片机的输出口接驱动电路74HC244,以保护单片机的输出端口。 4.3.3 时间显示模块
通行剩余时间显示模块如图4-6所示(以北路口为例)。
2
+5VR34-R41510Ω*81234567COMCOMCOMCOMCOM1A11A21A31A42A12A22A32A412345678P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27VCCGND393837363534333221222324252627282040+5VP20P21P22P23P24P25P26P27COMCOMCOMCOMCOMS4+5V11131517119P3.313P3.2122A12A22A32A41G2G74H C244Q1AS9012R1710KQ2AS9012R1810KQ3AS9012R1910KP3.0Q4AS9012R2010KQ5AS9012R2110KP3.1COM24681A11A21A31A41Y11Y21Y31Y42Y12Y22Y32Y4VCCGND1816141297531234567DS1DS2DS3DS4北路口显示器DS5DS6东路口显示器Q6AS9012R2210KP3.0+5VP3.1P3.2C630pFC730pFS3S2Y112 M HZ1514+5V3119189P3.71716P3.6AT89S52P3.2C520uFS1P3.010RXDP3.111TXD30ALE/P29PSENP20P21P22P23P24P25P26P27246811131517119123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678COMIC1IC312345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdp123456712345678abcdefgdpDPYafegdbcdpabcdefgdpDPYafegdbcdpCOMCOMCOMCOMCOMR3010KR31-R33510Ω*3COMCOMCOMCOMCOMQ7AS9012R2310KQ8AS9012R2410KP3.1Q9AS9012R2510KP3.0Q11AS9012R2710K+5V2A12A22A32A41G2G74H C2442Y12Y22Y32Y4VCC20GND1097532Y12Y22Y32Y4+5VCOM1A11A21A31A41Y11Y21Y31Y4181614121Y11Y21Y31Y4DS7DS8DS9南路口显示器DS10Q10AS9012R2610KDS11COMIC4西路口显示器DS12Q12AS9012R2810KP3.0P3.1P3.2P3.21Y1R12P10R4D4510ΩP17R5D52Y4R13510Ω+5VD121Y21Y31行人灯510ΩP11R11行人灯R3D3510ΩR2510ΩP16P15左拐灯510ΩD132Y3R6D6510Ω2Y2左拐灯R14510ΩD1715VAC423IC27805INADJD111Y4OUT2+5V右拐灯西路口R10510Ω510ΩP12P13P14右拐灯北路口P14直行灯南路口R7510ΩD142Y1直行灯东路口R15510ΩBRIDGE31D18C3220uFC40.1uFR29510ΩIC51A11A21A31A424681A11A21A31A41Y11Y21Y31Y4181614129753P10P11P12P13P14P15P16P17+5V2Y1P13D102Y2直行灯R9D9510ΩD2P15D7P12P111Y4直行灯R1510Ω右拐灯D151Y3C1220uFR8D8510Ω右拐灯R16510ΩC20.1uF2A1112A2132A3152A41711974H C2442A12Y12A22A32A41G2G2Y22Y32Y4VCC20GND102Y3P162Y4左拐灯P17D11Y2左拐灯P10行人灯1Y1D16行人灯 图4-3 采用LED动态扫描的交通灯控制系统电路原理图 3
路口通行剩余时间采用高亮红色7段共阳LED发光数码管显示。如用单片机吸收电流驱动,列扫描驱动使用三级管,按每段6mA电流算,全显示字型“8”时,每个数码管需6mA×8=48mA。由于时间显示每个路口相同,4组需192mA,因此设计中采用功率三极管S9012驱动。由于单片机每位段码输出口需吸收24mA电流,因此在电路设计中也使用了驱动集成块74HC244。 4.3.4 电源电路
电源电路如图4-7所示。整个系统采用的电源电压只需+5V电压,将交流电经变压器变换为15V交流电,再用整流桥得到13.5V左右的直流电,采用不可调的3端稳压器件LM7805将电源稳定在5V直流输出。 IC112345678P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27VCCGND393837363534333221222324252627282040S4+5VP3.313P3.212C630pFC730pFS3S2Y112 M HZP3.515P3.414+5V3119189P3.71716P3.6AT89 S 52C520uFS1P3.010RXDP3.111TXD30ALE/P29PSENR3010KR31-R33510Ω*3+5V 图4-4 控制模块原理图 P20P21P22P23P24P25P26P27246811131517119IC41A11A21A31A42A12A22A32A41G2G1Y11Y21Y31Y42Y12Y22Y32Y4VCC20GND101816141297531Y11Y21Y31Y42Y12Y22Y32Y41Y1R12P10R4D4510Ω74H C244D121Y21Y3行人灯510ΩP11R11行人灯R3D3510ΩR2510Ω+5VD111Y4右拐灯西路口R10510Ω510ΩP12P13P14右拐灯北路口IC51A11A21A31A424681A11A21A31A42A12A22A32A41G2G1Y11Y21Y31Y42Y12Y22Y32Y4VCC20GND10181614129753P10P11P12P13P14P15P16P17+5V2Y1D102Y2直行灯R9D9510ΩD2P15直行灯R1510Ω2A1112A2132A3152A41711974H C2442Y3P162Y4左拐灯P17D1左拐灯 图4-5 通行灯输出显示模块 4
1234567COMCOMCOMCOMP04P05P06P071113151711974H C2442A12Y12A22A32A41G2G2Y22Y32Y4VCCGND9753567+5V+5VS9012R1710KP3.2S9012R1810KP3.1COMP00P01P02P0324681A11A21A31A41Y11Y21Y31Y4181614121234DS1DS2Q1ADS3Q2AQ3AS9012R1910KP3.0北路口显示器COMIC312345678DPYaabcfbgdeecdfdpgdp123456712345678DPYaabcfbgdeecdfdpgdp123456712345678DPYaabcfbgdeecdfdpgdp 39383736353433322122232425262728204010P3.011P3.13029图4-6 时间显示模块电路
12345678P3.313P3.212P3.515P3.414P10P11P12P13P14P15P16P17INT1INT0T1T0P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P27VCCGNDRXDTXDALE/PPSEN1D1715VAC423IC27805INOUT2+5VADJD181BRIDGEAT89S523C1220uFC20.1uFC3220uFC40.1uFR29510ΩP3.63119189P3.71716EA/VPX1X2RESETRDWR 图4-7 电源电路 图4-8 AT89S52引脚功能
4 系统软件设计
交通灯控制系统软件主要分为主程序、定时器中断服务子程序、特种车中断服务子程序三部分。 4.1 主程序
主程序主要负责总体程序管理功能,包括初始化部分与人机交互设定部分。由于采用动态扫描方式显示时间,因此主程序大部分时间是调用扫描显示程序。主程序流程图如图4-9所示。P3.7=0表示按下了自动/手动转换开关。
开始初始化显示程序P3.70?Y手动控制程序N
图4-9主程序流程图
5
初始化部分主要完成内存规划,定时器的工作模式、中断方式等的设定。由于子程序调用较多,因此初始化时堆栈指针设于80H处。定时器T0、T1设为16位定时器模式,定时时间为50mS,T0为秒计时用,T1为特种车通行秒计时用。
4.2 定时器中断服务子程序
定时器中断服务子程序主要用于车辆与行人的通行指示,按照通行规则,红绿灯控制转换逻辑表如表4-1所示。
通行规则如下:
A.车辆南北直行、各路右拐,南北向行人通行。南北向通行时间为1min(60S),各路右拐比直行滞后10S开放。
B.车辆南北向左拐、各路右拐,行人禁行。通行时间为1min(60S)。 C.车辆东西直行、各路右拐,东西向行人通行。东西向通行时间为1min(60S),各路右拐比直行滞后10S开放。
D.车辆东西向左拐、各路右拐,行人禁行。通行时间为1min(60S)。
交通灯的4种通行规则,是以给控制红绿灯端口送控制码的方式实现的。它的原理是,将按不同规则通行时的各路口的红绿灯亮灭情况转换为单片机端口控制码。红绿灯指示功能通过T0定时中断服务程序实现。
表4-1 路口通行方式控制码数据表
端口 南 北 方 向 P1.7 P1.6 P1.4 P1.3 P1.2 P1.1 P1.0 P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 控制功能 左拐红 左拐绿 直行红 直行绿 右拐红 右拐绿 行人红 行人绿 左拐红 左拐绿 直行红 直行绿 右拐红 右拐绿 行人红 行人绿 120-110S 1(亮) 0(暗) 0(暗) 1(亮) 1(亮) 0(暗) 0(暗) 1(亮) 99H 1(亮) 0(暗) 1(亮) 0(暗) 1(亮) 0(暗) 1(亮) 0(暗) AAH 110-70S 1(亮) 0(暗) 0(暗) 1(亮) 0(暗) 1(亮) 0(暗) 1(亮) 95H 1(亮) 0(暗) 1(亮) 0(暗) 0(暗) 1(亮) 1(亮) 0(暗) A6H 70-60S 1(亮) 0(暗) 0(暗) 1/0(提示) 0(暗) 1(亮) 0(暗) 1/0(提示) 95H/84H 1(亮) 0(暗) 1(亮) 0(暗) 0(暗) 1(亮) 1(亮) 0(暗) A6H 60-10S 0(暗) 1(亮) 1(亮) 0(暗) 0(暗) 1(亮) 1(亮) 0(暗) 66H 1(亮) 0(暗) 1(亮) 0(暗) 0(暗) 1(亮) 1(亮) 0(暗) A6H 10-0S 0(暗) 1/0(提示) 1(亮) 0(暗) 0(暗) 1/0(提示) 1(亮) 0(暗) 66H/22H 1(亮) 0(暗) 1(亮) 0(暗) 0(暗) 1/0(提示) 1(亮) 0(暗) A6H/ A2H P1.5 路口控制字 东 西 方 向 路口控制字 定时器T0定时溢出中断周期设为50ms,中断累计20次(即1S)时对120S倒计时
6
单元减一操作。设计中将4种通行规则分成几种不同的亮灯方式,通过查询秒倒计时单元的数据,实现在不同的时间段给控制端口送不同的控制数据码。控制码分为5个时间段:120~110S、110~70S、70~60S、60~10S、10~0S。交通管理定时功能程序流程图如图4-10所示。
T0中断程序现场保护关中断T0T0初始重装TIME110?NNNNMOVSN,#99HMOVEW,#AAHMOVSN,#95HMOVEW,#A6HMOVSN,#95/84HMOVEW,#A6HMOVSN,#66HMOVEW,#A6HMOVSN,#66/22HMOVEW,#A6/A2HYTIME70?YTIME60?YTIME10?YTIME0?Y南北/东西标志位取反N中断返回 图4-10 交通管理定时功能程序 外部中断程序现场保护15S倒计时结束?N红灯显示关外部中断1开定时器T1送全红灯Y关定时器T1,开外部中断1现场恢复,中断返回 图4-11 特种车中断服务子程序流程图 5 特种车中断服务子程序
将按钮S4按下,给INT1引脚输入低电平信号来模拟特种车通过信号,此时外部中断1被触发,中断处理流程如图4-11所示。 总的程序清单见附录4。
7
6 算法分析
6.1.定时器/计数器 本设计涉及到120~110S、110~70S、70~60S、60~10S、10~0S五段计时,首先须将它们转为16进制代码。 120=7×16+8=78H 110=6×16+14=6EH 70=4×16+6=46H 60=3×16+12=3CH 10=0×16+10=0AH 6.2.定时时间初值与TMOD的设置 T0、T1为16位定时器,由于定时时间大于8192μS,应选用工作方式1。 由于晶振频率为12MHz,TCY=1μS,故有 T=(65536-X)TCY=(65536-X)×1μs =50ms 初值 X=15536=3CB0H,即TH0=3CH ,TL0=0B0H。 TMOD的格式如图4-12所示。 D7 D6 D5 D4 D3 D2 D1 D0 M0 GATE C/T M1 M0 GATE C/T M1 图4-12 TMOD的格式 TMOD各位的内容确定如下:由于定时器/计数器0设为定时器,选用工作方式1,所以GATE(TMOD.3)=0,C/T(TMOD.2)=0,M1(TMOD.1)=0,M0 (TMOD.0)=1;定时器/计数器1没有使用,相应的D7~D4为随意状态“X”。若取“X”为0,则(TMOD)=00000001B=01H 6.3.中断系统IE的取值 IE的格式如图4-13所示。 D7 EA D6 --- D5 D4 D3 ET1 D2 D1 D0 EX0 ET2 ES EX1 ET0 图4-13 IE的格式 IE每一位都由软件置1或清零。本设计中CPU允许中断即EA=1,定时器/计数器0中断允许位ET0及外部中断0中断允许位EX0可申请中断,即ET0=1,EX0=1,其余不允许中断,均设为0,所以IE=10000011H=83H。
7.总结结论
8
附录一 原理图 附录二 PCB图
附录三 交通灯控制程序清单
基于单片机的交通灯控制系统程序清单
;************************************************; ; 交通灯控制系统程序 ; ;************************************************; ;******************初始化部分********************
TIME EQU 50H ;秒计数用 TIMESFR EQU 51H ;临时寄存器
CONR5 EQU 52H ;T1秒定时计数用
TIMED0 EQU 55H ;单向最大定时时间,直行开始,人行开
;始(120S)
TIMED1 EQU 56H ;各路右拐开始时间(110S)
TIMED2 EQU 57H ;前行结束提醒(70S)
TIMED3 EQU 58H ;前行结束,人行结束,左拐开始(60S) TIMED4 EQU 59H ;左拐结束提醒 TIMED5 EQU 5AH ;左拐结束 TIMED6 EQU 5BH TIMED7 EQU 5CH
SN EQU P1 ;南北口 EW EQU P2 ;东西口 SCAN EQU P3 ;扫描口 LEDOUT EQU P0 ;段码口
SNEWFLAG BIT 09H ;东西口与南北口转换标志 ;*************中断入口程序********************
ORG 0000H ;程序执行开始地址 LJMP START ;跳到标号START执行 ORG 0003H ;外中断0中断程序入口 RETI ;外中断0中断返回
9
ORG 000BH ;定时器T0中断程序入口 LJMP INTT0 ;跳至INTT0执行 ORG 0013H ;外中断1中断程序入口 LJMP INT11 ;119﹑120中断
ORG 001BH ;定时器T1中断程序入口 LJMP INTT1
ORG 0023H ;串行中断程序程序返回 RETI
;****************主程序*********************
;P3.6所接S2开关打开,为120秒倒计时,合上,则为60秒倒计时 ;P3.7所接S2开关打开,正常状态,合上,全红灯。 ;定时器T0﹑T1溢出周期为50ms,T0为秒计数用 START: MOV SP, # 80H
MOV R0, # 00H ;清00H~8EH内存单元 MOV R7, # 8FH CLEARDISP: MOV @R0, # 00H INC R0
DJNZ R7, CLEARDISP
MOV TIMED0, # 78H ;单向最大定时时间,直行开始 ;人行开始
MOV TIMED1, # 6EH ;各路右拐开始时间(110S) MOV TIMED2, # 46H ;前行结束提醒(70S)
MOV TIMED3,# 3CH ;前行结束,人行结束,左拐开始
;(60S)
MOV TIMED4,# 0AH ;左拐结束提醒
CLR SNEWFLAG ;南北先通行标志位
MOV TMOD, # 01H ;设T0,T1为16位定时器 MOV TL0, #0B0H ;50ms定时初值(T0记时用) MOV TH0, #3CH ;50ms定时初值 MOV TL1, #0B0H ;50ms定时初值 MOV TH1, #3CH ;50ms定时初值 JB SCAN.6, SSST ;120s管理 ;以下为60s管理
LCALL DL1MS LCALL DL1MS LCALL DL1MS
JB SCAN.6, SSST ;干扰
10
MOV TIMED0, #60 ;单向最大定时时间,直行开始
;人行开始 MOV TIMED1, #55 ;各路右拐开始时间(55S) MOV TIMED2, #35 ;前行结束提醒(35S)
MOV TIMED3, #30 ;前行结束,人行结束,左拐开始(30S) MOV TIMED4, #05 ;左拐结束提醒 SSST: MOV TIME, TIMED0 LCALL TUNBCD MOV SN, #99H START1: KEYFUN: KEYWAIT: KEYWAIT1:
MOV SETB SETB SETB SETB SETB MOV MOV LCALL JNB SJMP LCALL LCALL JB CLR CLR MOV MOV MOV LCALL LCALL JNB LCALL JNB MOV LCALL CLR SETB SETB AJMP EW, #0AAH
EA ;总中断开放
PX1 EX1
ET0 ;允许T0中断 TR0 ;开启T0定时器
R4, #14H ;1S定时用初值(50ms×20) CONR5, #20
DISPLAY ;调用显示子程序 SCAN.7, KEYFUN ;手动状态
START1 ;P3.7为1时跳回START1 DISPLAY
DISPLAY
SCAN.7, START1
ET0 TR0
SN, #0A9H ;全车道停,行人通 EW, #0A9H
TIME, #00H ;时间显示0 TUNBCD DISPLAY
SCAN.7, KEYWAIT
DISPLAY
SCAN.7, KEYWAIT1
TIME, TIMED0 ;重新开始计时初值 TUNBCD SNEWFLAG ;南北先通行标志位 TR0 ET0 START1
11
;*****************1s计时程序(T0定时器中断服务子程序)***************** INTT0: PUSH ACC ;累加器入栈保护 PUSH PSW ;状态字入栈保护 CLR ET0 ;关T0中断允许 CLR TR0 ;关闭定时器T0
MOV A, #0B7H ;中断响应时间同步修正 ADD A, TL0 ;低8位初值修正
MOV TL0, A ;重装初值(低8位修正值) LOOP11: LOOP22: LOOP33: LOOP44: LOOP55: LOOP66:
MOV ADDC MOV SETB DJNZ MOV JB DEC MOV CJNE JC MOV MOV LJMP MOV CJNE JC MOV MOV LJMP MOV CJNE JC MOV CPL CPL MOV MOV LJMP MOV A, #3CH ;高8位初值修正 A, TH0
TH0, A ;重装初值(高8位修正值) TR0 ;开启定时器T0 R4, OUTT00 ;20次中断到(1S),重赋初值 R4, #14H
SNEWFLAG, INT22 TIME A, TIME
A, TIMED1, LOOP11 ;判断是否小于110S LOOP22 ;120-110 SN, #99H
EW, #0AAH
OUTT0 ;120-110 A, TIME
A, TIMED2, LOOP33;判断是否小于70S LOOP44 ;110-70 SN, #95H EW, #0A6H
OUTT0 ;110-70 A, TIME
A, TIMED3, LOOP55 ;判断是否小于60S LOOP66 ;70-60 20H, SN 04H 00H
SN, 20H EW, #0A6H
OUTT0 ;70-60 A, TIME
12
CJNE A, TIMED4, LOOP77 ;判断是否小于10S LOOP77: JC LOOP88 ;60-10 MOV SN, #66H MOV EW, #0A6H
LJMP OUTT0 ;60-10 LOOP88: MOV A, TIME JZ OUT88 MOV 20H, SN CPL 06H OUT88: OUTT0: OUTT00: INT22: LOOP111: LOOP221: LOOP331: LOOP441: LOOP551:
CPL MOV MOV CPL MOV LJMP MOV CPL LCALL POP POP SETB RETI DEC MOV CJNE JC MOV MOV LJMP MOV CJNE JC MOV MOV LJMP MOV CJNE JC MOV 02H SN, 20H
20H, EW 02H
EW, 20H
OUTT0 ;70-60 TIME, TIMED0 ;20初值 SNEWFLAG TUNBCD
PSW ;恢复状态字(出栈) ACC ;恢复累加器 ET0 ;开放T0中断
;中断返回 TIME A, TIME
A, TIMED1, LOOP111 ;判断是否小于110S LOOP221 ;120-110 EW, #99H SN, #0AAH
OUTT01 ;120-110 A, TIME
A, TIMED2, LOOP331 ;判断是否小于70S LOOP441 ;110-70 EW, #095H SN, #0A6H
OUTT01 ;110-70 A, TIME
A, TIMED3, LOOP551 ;判断是否小于60S LOOP661 ;70-60 20H, EW
13
CPL 04H CPL 00H
MOV EW, 20H MOV SN, #0A6H
LJMP OUTT01 ;70-60
LOOP661: MOV A, TIME
CJNE A, TIMED4, LOOP771 ;判断是否小于10S LOOP771: JC LOOP881 ;60-10 MOV EW, #66H MOV SN, #0A6H
LJMP OUTT01 ;60-10 LOOP881: MOV A, TIME JZ OUT881 MOV 20H, EW CPL 06H CPL 02H MOV EW, 20H MOV 20H, SN CPL 02H
MOV SN, 20H
LJMP OUTT01 ;70-60
OUT881: MOV TIME, TIMED0 ;120S初值 CPL SNEWFLAG OUTT01: LCALL TUNBCD
POP PSW ;状态恢复字(出栈) POP ACC ;恢复累加器 SETB ET0 ;开放T0中断 RETI ;中断返回 ;**********************显示子程序******************
;显示数据在70H~72H单元内,用3位LED共阳数码管显示,LEDOUT口输出段 ;码数据,
;P3(SCAN)口作扫描控制,每个LED数码管亮1ms再逐位循环 DISPLAY: MOV R1, #70H ;指向显示数据首址 MOV R5, #0FEH ;扫描控制字初值 PLAY: MOV A, R5 ;扫描字放入A
MOV SCAN, A ;从SCAN口输出 MOV A, @R1 ;取显示表地址
14
MOV DPTR, #TAB ;取段码表地址
MOVC A, @A+DPTR ;查显示数据对应段码 MOV LEDOUT, A ;段码放入LEDOUT口 LOOP6: LCALL DL1MS ;显示1ms INC R1 ;指向下一地址
MOV A, R5 ;扫描控制字放入A
JNB ACC.2, ENDOUT ;ACC.2=0时,一次显示结束 RL A ;A中数据循环左移 MOV R5, A ;放回R5内 MOV LEDOUT, #0FFH
AJMP PLAY ;跳回PLAY循环
ENDOUT: MOV LEDOUT, # 0FFH ;一次显示结束,端口复位 MOV SCAN, #0FFH ;端口复位 RET ;子程序返回
TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H
DB 0FFH, 88H, 0BFH
;共阳段码表 \"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\" ;\"不亮\",\"A\",\"-\"
;***********************延时子程序******************* ;1ms延时程序,LED显示程序用 DL1MS: MOV R6, #14H DL1: MOV R7, #19H DL2: DJNZ R7, DL2 DJNZ R6, DL1 RET
;*******************十六进制转换为BCD码的子程序******************* TUNBCD: PUSH ACC PUSH PSW
PUSH B
MOV A, TIME MOV B, #100 DIV AB MOV 72H, A JNZ JJ0
MOV 72H, #0AH ;最高位为0,不点亮 JJ0: MOV A, B
15
MOV B, #10 DIV AB
MOV 71H, A JNZ JJ1
MOV A, 72H ;次高位为0,先看最高位是否为不亮 SUBB A, #0AH JNZ JJ1
MOV 71H, #0AH ;最高位不亮,次高位也不亮 JJ1: MOV 70H, B POP B POP PSW POP ACC RET
;*********************119,120特种车中断服务子程序**************** INT11: PUSH ACC PUSH PSW CLR EX1 CLR ET0 CLR TR0
MOV SN, #AAH ;全红灯 MOV EW, # AAH
MOV TIMESFR, TIME ;保存道口数据 MOV TIME, #0FH MOV CONR5, #20 LCALL TUNBCD SETB ET1 SETB TR1 POP PSW POP ACC RETI
;******************15s计时程序(T1中断服务程序)********************* INTT1: PUSH ACC ;累加器入栈保护 PUSH PSW ;状态字入栈保护 CLR ET1 ;关T1中断允许 CLR TR1 ;关闭定时器T1
MOV A, #0B7H ;中断响应时间同步修正
16
ADD A, TL1 ;低8位初值修正
MOV TL1, A ;重装初值(低8位修正值)
MOV A, #3CH ;高8位初值修正 ADDC A, TH1
MOV TH1, A ;重装初值(高8位修正值)
SETB TR1 ;开启定时器T1
DJNZ CONR5, OUTT333 ;20次中断未到,中断退出 MOV CONR5, #14H ;20次中断到(1S),重赋初值 DEC TIME OUT333: OUT444:
LCALL MOV JZ SETB POP POP RETI
CLR CLR MOV LCALL SETB SETB SETB POP POP RETI
END TUNBCD A, TIME OUT444 ET1 PSW ACC TR1 ET1
TIME, TIMESFR TUNBCD ET0
TR0 EX1 PSW ACC ;程序结束 17
因篇幅问题不能全部显示,请点此查看更多更全内容