单片机课程设计示例交通灯控制文档格式.docx
《单片机课程设计示例交通灯控制文档格式.docx》由会员分享,可在线阅读,更多相关《单片机课程设计示例交通灯控制文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
双色发光二极管的共阴极通过电阻接地,阳极接P1口或P2口(南北为P1口,东西为P2口),经74HC244控制。
当发光电流为6mA时,限流电阻按公式R=(5-1.8)/0.006计算,取标称值为510Ω。
由于通行时南北双向指示牌相同,东西双向指示牌相同,因此每个端口应具有12mA的驱动电流能力,在单片机的输出口接驱动电路74HC244,以保护单片机的输出端口。
4.3.3时间显示模块
通行剩余时间显示模块如图4-6所示(以北路口为例)。
图4-3采用LED动态扫描的交通灯控制系统电路原理图
路口通行剩余时间采用高亮红色7段共阳LED发光数码管显示。
如用单片机吸收电流驱动,列扫描驱动使用三级管,按每段6mA电流算,全显示字型“8”时,每个数码管需6mA×
8=48mA。
由于时间显示每个路口相同,4组需192mA,因此设计中采用功率三极管S9012驱动。
由于单片机每位段码输出口需吸收24mA电流,因此在电路设计中也使用了驱动集成块74HC244。
4.3.4电源电路
电源电路如图4-7所示。
整个系统采用的电源电压只需+5V电压,将交流电经变压器变换为15V交流电,再用整流桥得到13.5V左右的直流电,采用不可调的3端稳压器件LM7805将电源稳定在5V直流输出。
图4-4控制模块原理图
图4-5通行灯输出显示模块
图4-6时间显示模块电路
图4-7电源电路图4-8AT89S52引脚功能
4.4系统软件设计
交通灯控制系统软件主要分为主程序、定时器中断服务子程序、特种车中断服务子程序三部分。
4.4.1主程序
主程序主要负责总体程序管理功能,包括初始化部分和人机交互设定部分。
由于采用动态扫描方式显示时间,因此主程序大部分时间是调用扫描显示程序。
主程序流程图如图4-9所示。
P3.7=0表示按下了自动/手动转换开关。
图4-9主程序流程图
初始化部分主要完成内存规划,定时器的工作模式、中断方式等的设定。
由于子程序调用较多,因此初始化时堆栈指针设于80H处。
定时器T0、T1设为16位定时器模式,定时时间为50mS,T0为秒计时用,T1为特种车通行秒计时用。
4.4.2定时器中断服务子程序
定时器中断服务子程序主要用于车辆和行人的通行指示,按照通行规则,红绿灯控制转换逻辑表如表4-1所示。
通行规则如下:
A.车辆南北直行、各路右拐,南北向行人通行。
南北向通行时间为1min(60S),各路右拐比直行滞后10S开放。
B.车辆南北向左拐、各路右拐,行人禁行。
通行时间为1min(60S)。
C.车辆东西直行、各路右拐,东西向行人通行。
东西向通行时间为1min(60S),各路右拐比直行滞后10S开放。
D.车辆东西向左拐、各路右拐,行人禁行。
交通灯的4种通行规则,是以给控制红绿灯端口送控制码的方式实现的。
它的原理是,将按不同规则通行时的各路口的红绿灯亮灭情况转换为单片机端口控制码。
红绿灯指示功能通过T0定时中断服务程序实现。
表4-1路口通行方式控制码数据表
南
北
方
向
端口
控制功能
120-110S
110-70S
70-60S
60-10S
10-0S
P1.7
左拐红
1(亮)
0(暗)
P1.6
左拐绿
1/0(提示)
P1.5
直行红
P1.4
直行绿
P1.3
右拐红
P1.2
右拐绿
P1.1
行人红
P1.0
行人绿
路口控制字
99H
95H
95H/84H
66H
66H/22H
东
西
方
向
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
AAH
A6H
A6H/A2H
定时器T0定时溢出中断周期设为50ms,中断累计20次(即1S)时对120S倒计时单元减一操作。
设计中将4种通行规则分成几种不同的亮灯方式,通过查询秒倒计时单元的数据,实现在不同的时间段给控制端口送不同的控制数据码。
控制码分为5个时间段:
120~110S、110~70S、70~60S、60~10S、10~0S。
交通管理定时功能程序流程图如图4-10所示。
图4-10交通管理定时功能程序
图4-11 特种车中断服务子程序流程图
4.5特种车中断服务子程序
将按钮S4按下,给
引脚输入低电平信号来模拟特种车通过信号,此时外部中断1被触发,中断处理流程如图4-11所示。
总的程序清单见附录4。
4.6算法分析
4.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
4.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
GATE
C/
M1
M0
图4-12TMOD的格式
TMOD各位的内容确定如下:
由于定时器/计数器0设为定时器,选用工作方式1,所以GATE(TMOD.3)=0,C/
(TMOD.2)=0,M1(TMOD.1)=0,M0(TMOD.0)=1;
定时器/计数器1没有使用,相应的D7~D4为随意状态“X”。
若取“X”为0,则(TMOD)=00000001B=01H
4.6.3.中断系统IE的取值
IE的格式如图4-13所示。
EA
---
ET2
ES
ET1
EX1
ET0
EX0
图4-13 IE的格式
IE每一位都由软件置1或清零。
本设计中CPU允许中断即EA=1,定时器/计数器0中断允许位ET0及外部中断0中断允许位EX0可申请中断,即ET0=1,EX0=1,其余不允许中断,均设为0,所以IE=10000011H=83H。
附录一交通灯控制程序清单
基于单片机的交通灯控制系统程序清单
;
************************************************;
交通灯控制系统程序 ;
******************初始化部分********************
TIMEEQU50H;
秒计数用
TIMESFREQU51H;
临时寄存器
CONR5EQU52H;
T1秒定时计数用
TIMED0EQU55H;
单向最大定时时间,直行开始,人行开
始(120S)
TIMED1EQU56H;
各路右拐开始时间(110S)
TIMED2EQU57H;
前行结束提醒(70S)
TIMED3EQU58H;
前行结束,人行结束,左拐开始(60S)
TIMED4EQU59H;
左拐结束提醒
TIMED5EQU5AH;
左拐结束
TIMED6EQU5BH
TIMED7EQU5CH
SNEQUP1;
南北口
EWEQUP2;
东西口
SCANEQUP3;
扫描口
LEDOUTEQUP0;
段码口
SNEWFLAGBIT09H;
东西口和南北口转换标志
*************中断入口程序********************
ORG0000H;
程序执行开始地址
LJMPSTART;
跳到标号START执行
ORG0003H;
外中断0中断程序入口
RETI;
外中断0中断返回
ORG000BH;
定时器T0中断程序入口
LJMPINTT0;
跳至INTT0执行
ORG0013H;
外中断1中断程序入口
LJMPINT11;
119﹑120中断
ORG001BH;
定时器T1中断程序入口
LJMPINTT1
ORG0023H;
串行中断程序程序返回
RETI
****************主程序*********************
P3.6所接S2开关打开,为120秒倒计时,合上,则为60秒倒计时
P3.7所接S2开关打开,正常状态,合上,全红灯。
定时器T0﹑T1溢出周期为50ms,T0为秒计数用
START:
MOVSP,#80H
MOVR0,#00H;
清00H~8EH内存单元
MOVR7,#8FH
CLEARDISP:
MOV@R0,#00H
INCR0
DJNZR7,CLEARDISP
MOVTIMED0,#78H;
单向最大定时时间,直行开始
人行开始
MOVTIMED1,#6EH;
MOVTIMED2,#46H;
MOVTIMED3,#3CH;
前行结束,人行结束,左拐开始
(60S)
MOVTIMED4,#0AH;
CLRSNEWFLAG;
南北先通行标志位
MOVTMOD,#01H;
设T0,T1为16位定时器
MOVTL0,#0B0H;
50ms定时初值(T0记时用)
MOVTH0,#3CH;
50ms定时初值
MOVTL1,#0B0H;
MOVTH1,#3CH;
JBSCAN.6,SSST;
120s管理
以下为60s管理
LCALLDL1MS
干扰
MOVTIMED0,#60;
MOVTIMED1,#55;
各路右拐开始时间(55S)
MOVTIMED2,#35;
前行结束提醒(35S)
MOVTIMED3,#30;
前行结束,人行结束,左拐开始(30S)
MOVTIMED4,#05;
SSST:
MOVTIME,TIMED0
LCALLTUNBCD
MOVSN,#99H
MOVEW,#0AAH
SETBEA;
总中断开放
SETBPX1
SETBEX1
SETBET0;
允许T0中断
SETBTR0;
开启T0定时器
MOVR4,#14H;
1S定时用初值(50ms×
20)
MOVCONR5,#20
START1:
LCALLDISPLAY;
调用显示子程序
JNBSCAN.7,KEYFUN;
手动状态
SJMPSTART1;
P3.7为1时跳回START1
KEYFUN:
LCALLDISPLAY
JBSCAN.7,START1
CLRET0
CLRTR0
MOVSN,#0A9H;
全车道停,行人通
MOVEW,#0A9H
MOVTIME,#00H;
时间显示0
KEYWAIT:
JNBSCAN.7,KEYWAIT
KEYWAIT1:
JNBSCAN.7,KEYWAIT1
MOVTIME,TIMED0;
重新开始计时初值
SETBTR0
SETBET0
AJMPSTART1
*****************1s计时程序(T0定时器中断服务子程序)*****************
INTT0:
PUSHACC;
累加器入栈保护
PUSHPSW;
状态字入栈保护
CLRET0;
关T0中断允许
CLRTR0;
关闭定时器T0
MOVA,#0B7H;
中断响应时间同步修正
ADDA,TL0;
低8位初值修正
MOVTL0,A;
重装初值(低8位修正值)
MOVA,#3CH;
高8位初值修正
ADDCA,TH0
MOVTH0,A;
重装初值(高8位修正值)
开启定时器T0
DJNZR4,OUTT00;
20次中断到(1S),重赋初值
MOVR4,#14H
JBSNEWFLAG,INT22
DECTIME
MOVA,TIME
CJNEA,TIMED1,LOOP11;
判断是否小于110S
LOOP11:
JCLOOP22;
120-110
MOVSN,#99H
MOVEW,#0AAH
LJMPOUTT0;
LOOP22:
CJNEA,TIMED2,LOOP33;
判断是否小于70S
LOOP33:
JCLOOP44;
110-70
MOVSN,#95H
MOVEW,#0A6H
LOOP44:
CJNEA,TIMED3,LOOP55;
判断是否小于60S
LOOP55:
JCLOOP66;
70-60
MOV20H,SN
CPL04H
CPL00H
MOVSN,20H
LOOP66:
CJNEA,TIMED4,LOOP77;
判断是否小于10S
LOOP77:
JCLOOP88;
60-10
MOVSN,#66H
LOOP88:
JZOUT88
CPL06H
CPL02H
MOVSN,20H
MOV20H,EW
MOVEW,20H
OUT88:
20初值
CPLSNEWFLAG
OUTT0:
OUTT00:
POPPSW;
恢复状态字(出栈)
POPACC;
恢复累加器
开放T0中断
RETI;
中断返回
INT22:
CJNEA,TIMED1,LOOP111;
LOOP111:
JCLOOP221;
MOVEW,#99H
MOVSN,#0AAH
LJMPOUTT01;
LOOP221:
CJNEA,TIMED2,LOOP331;
LOOP331:
JCLOOP441;
MOVEW,#095H
MOVSN,#0A6H
LOOP441:
CJNEA,TIMED3,LOOP551;
LOOP551:
JCLOOP661;
LOOP661:
CJNEA,TIMED4,LOOP771;
LOOP771:
JCLOOP881;
MOVEW,#66H
LOOP881:
JZOUT881
MOVEW,20H
OUT881:
120S初值
OUTT01:
状态恢复字(出栈)
**********************显示子程序******************
显示数据在70H~72H单元内,用3位LED共阳数码管显示,LEDOUT口输出段
码数据,
P3(SCAN)口作扫描控制,每个LED数码管亮1ms再逐位循环
DISPLAY:
MOVR1,#70H;
指向显示数据首址
MOVR5,#0FEH;
扫描控制字初值
PLAY:
MOVA,R5;
扫描字放入A
MOVSCAN,A;
从SCAN口输出
MOVA,@R1;
取显示表地址
MOVDPTR,#TAB;
取段码表地址
MOVCA,@A+DPTR;
查显示数据对应段码
MOVLEDOUT,A;
段码放入LEDOUT口
LOOP6:
LCALLDL1MS;
显示1ms
INCR1;
指向下一地址
MOVA,R5;
扫描控制字放入A
JNBACC.2,ENDOUT;
ACC.2=0时,一次显示结束
RLA;
A中数据循环左移
MOVR5,A;
放回R5内
MOVLEDOUT,#0FFH
AJMPPLAY;
跳回PLAY循环
ENDOUT:
MOVLEDOUT,#0FFH;
一次显示结束