《单片机交通信号灯模拟系统设计.doc》由会员分享,可在线阅读,更多相关《单片机交通信号灯模拟系统设计.doc(10页珍藏版)》请在三一办公上搜索。
1、基于单片机的交通信号灯模拟系统设计主要内容:利用单片机中的定时器、IO接口、中断系统等资源,设计一个十字路口交通信号灯的控制模拟系统。基本要求:(1)利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭。 (2)可通过按键对红绿灯点亮和熄灭时间进行调整及设置。(3)能对红绿灯点亮和熄灭时间进行倒计时时间显示。提高部分:(4)可进行紧急或特殊情况的人工处理控制。(5)有内部24小时钟,可根据时间表对对红绿灯点亮和熄灭时间进行自动调整。(如高峰期:7:30-8:30,17:00-18:30或夜间时段红绿灯主次干道时长比等)。(6)可根据交通流量自动调整对红绿灯点亮和熄灭时间。程序:Z8279
2、EQU 0FF82H ;8279 状态/命令口地址D8279 EQU 0FF80H ;8279 数据口地址LEDMOD EQU 00H ;左边输入八位字符显示 ;外部译码键扫描方式,双键互锁LEDFEQ EQU 2FH ;扫描速率LEDCLS EQU 0C1H ;清除显示RAMLEDWR0 EQU 80H ;设定的将要写入的显示RAM地址READKB EQU 40H ;读FIFO RAM 地址0 的命令字;-ORG 0000HLJMP START ORG 0003H LJMP EMERGENCY ORG 000BH ;定时器中断的入口地址 LJMP COUNTER ORG 0040HSTART
3、: MOV SP,#60H LCALL INIT8279 ;初始化 MOVTMOD,#01H MOVTL0,#056H ;50ms时间常数 MOVTH0,#4CH MOVR2,#20 ;设置循环次数20次,定时1s MOV R3,#1 MOV 20H,#5MOV 21H,#2 MOV R6,#06H ;时 MOV R1,#59H ;分 MOV R0,#45H ;秒 MOV R7,#00H ;交通灯状态选择 SETB ET0 ;允许定时器中断, SETB TR0 ;启动T0 SETB EX0 ;允许外部中断中断 SETB IT0 ;外部中断为电平触发方式 SETB EA ;开CPU开中断 ;-W
4、AIT: LCALL GETKEY ;读键盘 CJNE A,#0FFH,CONT ;判断是否有键输入 MOV A,B CJNE A,#3CH,KEY_B ;输入键是C,转CLEAR_T LCALL CLEAR_TKEY_B: CJNE A,#3BH,KEY_A ;输入键是B,转SET_T LCALL SET_T KEY_A: ;输入键是A,转START_T CJNE A,#3AH,KEY_E LCALL START_TKEY_E: ;输入键是E,进行高峰处理,调整时间 CJNE A,#3EH,KEY_F MOV 20H,#10 ;红绿灯时间为10s KEY_F: CJNE A,#3FH,KEY
5、_D ;输入是F,进行低峰处理,调整时间MOV 20H,#3KEY_D: CJNE A,#3DH,CONT ;输入是D,进行常态处理,调整时间MOV 20H,#5CONT: LCALL DISPLAY ;显示时间 SJMP WAIT ;循环CLEAR_T: ;时间清零 CLR TR0 MOV R3,#0H MOV R6,#0H ;时 MOV R1,#0H ;分 MOV R0,#0H ;秒 LCALL DISPLAY RETSTART_T: ;电子钟计时子程序 SETB TR0 RETSET_T: ;设置初值子程序 CLR TR0 ;关计数器 MOV R4,#1 LCALL GETWORD ;读
6、秒数 CJNE A,#0FFH,INVALID ;判断输入合法性 MOV A,B ADD A,#156 JC INVALID ;判断输入秒值100 MOV A,B CJNE R7,#01H,T1 ;若为状态1,保存输入值 MOV 20H,A MOV R3,20H LCALL DISPLAY T1: CJNE R7,#02H,T2 ;若为状态2,保存输入值 MOV 21H,A MOV R3,21H LCALL DISPLAYT2: CJNE R7,#03H,T3 ;若为状态3,保存输入值 MOV 20H,A MOV R3,20H LCALL DISPLAYT3: CJNE R7,#00H,T4
7、;若为状态4,保存输入值 MOV 21H,A MOV R3,21H LCALL DISPLAYT4: SETB TR0RETINVALID: LCALL CLEAR_T ;时间清零 ;-GETWORD: ;读数子程序 WKEY1: LCALL GETKEY ;读键盘 CJNE A,#0FFH,WKEY1;无键输入,则再读 MOV A,B ADD A,#0C6H JC ERROR1 ;判断输入是否大于 MOV A,B SUBB A,#30H JC ERROR1 ;判断输入是否小于 MOV R5,A LCALL DISLED ;显示输入的字符 MOV B,#10 MUL AB PUSH ACC ;
8、保存输入的值 WKEY2: LCALL GETKEY ;读键盘 CJNE A,#0FFH,WKEY2;无键输入则再读 MOV A,B ADD A,#0C6H ;判断输入是否大于 JC ERROR2 MOV A,B SUBB A,#30H ;判断输入是否小于 JC ERROR2 DEC R4 MOV R5,A LCALL DISLED ;显示输入的字符 MOV B,A POP ACC ADD A,B MOV B,A ;把得到的值存在B MOV A,#0FFH ;置合法输入标志 AJMP KEYOKERROR2: POP ACCERROR1: MOV A,#0 ;置非法输入标志KEYOK: RET
9、 ;-;定时器的中断服务程序COUNTER: ;INT_T0中断服务子程序 PUSH ACC ;保护现场 PUSH PSW CLRTR0 MOVTL0,#056H ;重新设置初值MOVTH0,#4CHLCALL DISPLAY ;1s时间到,显示当前倒计时的时间DJNZ R2,RETURN1MOV R2,#20HCJNE R0,#59H,SECOND;判断秒=59 MOV R0,#99H CJNE R1,#59H,MINUTE;判断分=59 MOV R1,#99H CJNE R6,#23H,HOUR ;判断时=23 MOV R6,#99HHOUR: MOV A,R6 ADD A,#1 ;时加1
10、 DA A MOV R6,AMINUTE: MOV A,R1 ADD A,#1 ;分加1 DA A MOV R1,ASECOND: MOV A,R0 ADD A,#1 ;秒加1 DA A MOV R0,A CJNE R6,#5H,TURN LJMP TURNTURN: LCALL DISPLAY1 MOV A,R7 ;显示交通灯的状态SUBB A,#02HJNC L3 CJNE R7,#00H,L2 ;通过标志位来判断交通灯当前的状态 DJNZ R3,RETURN CJNE R6,#5H,SH MOV 20H,#10 MOV 21H,#3 SH: JC SH1MOV 20H,#10MOV 21
11、H,#3CJNE R6,#7H,SH1MOV 20H,#5MOV 21H,#2SH1: JC SH2MOV 20H,#5MOV 21H,#2SH2: MOV R3,20H MOV DPTR,#8300H ;南北绿灯,东西红灯 MOV A,#96H MOVX DPTR,A MOV R7,#01H ;设置交通灯状态标志为下一个状态 SJMP RETURNRETURN1:LJMP RETURNL2: DJNZ R3,RETURN MOV R3,21H MOV DPTR,#8300H ;南北黄灯,东西红灯 MOV A,#06H MOVX DPTR,A MOV R7,#02H SJMP RETURN L
12、3: CJNE R7,#02H,L4 DJNZ R3,RETURN MOV R3,20H MOV DPTR,#8300H ;南北红灯,东西绿灯 MOV A,#69H MOVX DPTR,A MOV R7,#03H SJMP RETURN L4: DJNZ R3,RETURN MOV R3,21H MOV DPTR,#8300H ;南北红灯,东西黄灯 MOV A,#09H MOVX DPTR,A MOV R7,#00H RETURN: SETB TR0 POP PSW ;恢复现场 POP ACC RETI;-EMERGENCY: PUSH PSW ;保护现场 PUSH ACC MOV DPTR,
13、#8300H MOV A,#0FH ;南北,东西都亮红灯 MOVX DPTR,A MOV R3,#10 LCALL DISPLAY SETB TR0 ;启动定时器 POP ACC ;恢复现场 POP PSW RETI;-INIT8279: ;8279初始化子程序 PUSH DPH ;保存现场 PUSH DPL PUSH ACC LCALL DELAY ;延时 MOV DPTR ,#Z8279 MOV A,#LEDMOD ;置工作方式 MOVX DPTR,A MOV A,#LEDFEQ ;置键盘扫描速率 MOVX DPTR,A MOV A,#LEDCLS ;清除LED 显示 MOVX DPTR,
14、A POP ACC ;恢复现场 POP DPL POP DPH RET;-GETKEY: ;读取键盘子程序 ;输入: 无; 输出: B: 读到的键码A: 按键的标志 PUSH DPH ;保存现场 PUSH DPL PUSH PSW MOV DPTR,#Z8279 MOVX A,DPTR ;读状态 ANL A,#07H ;屏蔽D7-D3 JNZ GETVAL ;判断是否有键输入 MOV A,#0H ;置标志(无键输入) SJMP RECOVERGETVAL: MOV A,#READKB ;读FIFO RAM 命令 MOVX DPTR,A MOV DPTR,#D8279 MOVX A,DPTR ;
15、读键 ANL A,#3FH ;屏蔽SHIFT 和CTRL 键 MOV DPTR,#KEYCODE;键码表起始地址 MOVC A,A+DPTR ;查表 MOV B,A ;置返回键值 MOV A,#0FFH ;置标志(有键输入)RECOVER: POP PSW ;恢复现场 POP DPL POP DPH RET;-DISLED: ;显示字符子程序 ;输入: R4,位置R5,值 PUSH DPH ;保存现场 PUSH DPL PUSH ACC MOV A,#LEDWR0 ;置显示起始地址 ADD A,R4 ;加位置偏移量 MOV DPTR,#Z8279 MOVX DPTR,A ;设定显示位置 MOV
16、 DPTR,#LEDSEG ;置显示常数表起始位置 MOV A,R5 MOVC A,A+DPTR ;查表 MOV DPTR,#D8279 MOVX DPTR,A ;显示数据 POP ACC ;恢复现场 POP DPL POP DPH RET;-DELAY: ;延时子程序 PUSH 0 ;保存现场 PUSH 1 MOV 0,#0HDELAY1: MOV 1,#0H DJNZ 1,$ DJNZ 0,DELAY1 POP 1 ;恢复现场 POP 0 RET;-DISPLAY1: MOV A,R6 ANL A,#0FH ADD A,#10H MOV R5,A MOV R4,#6 LCALL DISLE
17、D ;显示小时低位 MOV A,R6 SWAP A ANL A,#0FH MOV R5,A MOV R4,#7 LCALL DISLED ;显示小时高位 MOV A,R1 ANL A,#0FH ADD A,#10H MOV R5,A MOV R4,#4 LCALL DISLED ;显示分钟低位 MOV A,R1 SWAP A ANL A,#0FH MOV R5,A MOV R4,#5 LCALL DISLED ;显示分钟高位 MOV A,R0 ANL A,#0FH ADD A,#10H MOV R5,A MOV R4,#2 LCALL DISLED ;显示秒低位 MOV A,R0 SWAP A
18、 ANL A,#0FH MOV R5,A MOV R4,#3 LCALL DISLED ;显示秒高位 RETDISPLAY: MOV A,R3 MOV B,#10 DIV AB MOV R5,B MOV R4,#0 LCALL DISLED ;显示秒低位 MOV R5,A MOV R4,#1 LCALL DISLED ;显示秒高位 RET;- ;LED显示常数表LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;0.,1.,2.,3.,4.,5.,6.,7. DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;8.,9.,A.,B.,C.,D.,E.,F. DB 6DH,02H,08H,00H,59H,0FH,76H ;U,-,_, ,I,O,P, ;键盘键码表KEYCODE: DB 30H,31H,32H,33H,34H,35H,36H,37H ;0,1,2,3,4,5,6,7 DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;8,9,A,B,C,D,E,F END