📄 trafficlight.lst
字号:
A51 MACRO ASSEMBLER TRAFFICLIGHT 06/23/2007 09:47:05 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN trafficlight.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE trafficlight.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;-----------------------------------
2 ; 交通灯控制器实例
3 ;功能:使用6只LED模拟交通灯控制器
4 ;-----------------------------------
0090 5 SOUTH_RED EQU P1.0
0091 6 SOUTH_YELLOW EQU P1.1
0092 7 SOUTH_GREEN EQU P1.2
0093 8 EAST_RED EQU P1.3
0094 9 EAST_YELLOW EQU P1.4
0095 10 EAST_GREEN EQU P1.5
0000 11 SECOND_FLAG BIT 00H
0030 12 TIME_COUNT0 DATA 30H
0031 13 TIME_COUNT1 DATA 31H
0032 14 STATUS_FLAG DATA 32H
0033 15 SECOND_COUNT DATA 33H
16
0000 17 ORG 0000H ;伪指令,指定程序从0000H开始存放
0000 020100 18 LJMP MAIN ;跳转指令,程序跳转到MAIN处
000B 19 ORG 000BH ;伪指令,指定程序从T0入口地址000BH开始存放
000B 0201B4 20 LJMP T0_INT ;跳转指令,程序跳转到T0_INT处
21
0100 22 ORG 0100H
0100 23 MAIN:
0100 758160 24 MOV SP,#60H ;给堆栈指针赋初值
0103 120199 25 LCALL INIT ;调用状态初始化子程序
0106 1201C3 26 LCALL T0_INIT ;调用定时器中断初始化子程序
0109 27 LOOP:
0109 3000FD 28 JNB SECOND_FLAG,LOOP ;根据SECOND_FLAG值判断0.5秒是否到
010C 120113 29 LCALL STATUS_CHANGE ;每0.5秒调用交通灯状态转换子程序
010F C200 30 CLR SECOND_FLAG ;清零SECOND_FLAG
0111 80F6 31 SJMP LOOP ;跳转,程序继续
32
0113 33 STATUS_CHANGE:
34 ;---------------------------------
35 ; 交通灯状态转换子程序
36 ;---------------------------------
0113 E532 37 MOV A,STATUS_FLAG ;根据STATUS_FLAG值进行散转
0115 2532 38 ADD A,STATUS_FLAG
0117 90011B 39 MOV DPTR,#STATUS_PROC_TABLE
011A 73 40 JMP @A+DPTR
011B 41 STATUS_PROC_TABLE:
011B 2127 42 AJMP STATUS1
011D 2131 43 AJMP STATUS2
011F 214A 44 AJMP STATUS3
0121 2160 45 AJMP STATUS4
0123 216A 46 AJMP STATUS5
0125 2183 47 AJMP STATUS6
48
0127 49 STATUS1:
50 ;---------------------------------
51 ; 散转子程序1
52 ;状态1:南北绿灯,东西红灯,持续20秒
53 ;然后转到状态2
54 ;---------------------------------
0127 D53306 55 DJNZ SECOND_COUNT,STATUS1_EXIT
012A 753306 56 MOV SECOND_COUNT,#6 ;20秒定时到,转换到状态2
012D 753201 57 MOV STATUS_FLAG,#01H
0130 58 STATUS1_EXIT:
A51 MACRO ASSEMBLER TRAFFICLIGHT 06/23/2007 09:47:05 PAGE 2
0130 22 59 RET
60
0131 61 STATUS2:
62 ;---------------------------------
63 ; 散转子程序2
64 ;状态2:南北绿灯闪,东西红灯,持续3秒
65 ;然后转到状态3
66 ;---------------------------------
0131 D53313 67 DJNZ SECOND_COUNT,STATUS2_EXIT
0134 753304 68 MOV SECOND_COUNT,#4 ;3秒定时到,转换到状态3
0137 753202 69 MOV STATUS_FLAG,#02H
013A D290 70 SETB SOUTH_RED ;南北红灯灭
013C C291 71 CLR SOUTH_YELLOW ;南北黄灯亮
013E D292 72 SETB SOUTH_GREEN ;南北绿灯灭
0140 C293 73 CLR EAST_RED ;东西红灯亮
0142 D294 74 SETB EAST_YELLOW ;东西黄灯灭
0144 D295 75 SETB EAST_GREEN ;东西绿灯灭
0146 22 76 RET
0147 77 STATUS2_EXIT:
0147 B292 78 CPL SOUTH_GREEN ;南北绿灯闪
0149 22 79 RET
80
014A 81 STATUS3:
82 ;---------------------------------
83 ; 散转子程序3
84 ;状态3:南北黄灯,东西红灯 ,持续2秒
85 ;然后转到状态4
86 ;---------------------------------
014A D53312 87 DJNZ SECOND_COUNT,STATUS3_EXIT
014D 753328 88 MOV SECOND_COUNT,#40 ;2秒定时到,转换到状态4
0150 753203 89 MOV STATUS_FLAG,#03H
0153 C290 90 CLR SOUTH_RED ;南北红灯亮
0155 D291 91 SETB SOUTH_YELLOW ;南北黄灯灭
0157 D292 92 SETB SOUTH_GREEN ;南北绿灯灭
0159 D293 93 SETB EAST_RED ;东西红灯灭
015B D294 94 SETB EAST_YELLOW ;东西黄灯灭
015D C295 95 CLR EAST_GREEN ;东西绿灯亮
015F 96 STATUS3_EXIT:
015F 22 97 RET
98
0160 99 STATUS4:
100 ;---------------------------------
101 ; 散转子程序4
102 ;状态4:南北红灯,东西绿灯,持续20秒
103 ;然后转到状态5
104 ;---------------------------------
0160 D53306 105 DJNZ SECOND_COUNT,STATUS4_EXIT
0163 753306 106 MOV SECOND_COUNT,#6 ;20秒定时到,转换到状态5
0166 753204 107 MOV STATUS_FLAG,#04H
0169 108 STATUS4_EXIT:
0169 22 109 RET
110
016A 111 STATUS5:
112 ;---------------------------------
113 ; 散转子程序5
114 ;状态5:南北红灯,东西绿灯闪,持续3秒
115 ;然后转到状态6
116 ;---------------------------------
016A D53313 117 DJNZ SECOND_COUNT,STATUS5_EXIT
016D 753304 118 MOV SECOND_COUNT,#4 ;3秒定时到,转换到状态6
0170 753205 119 MOV STATUS_FLAG,#05H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -