急求!!!单片机系统设计
发布网友
发布时间:2023-05-07 17:54
我来回答
共2个回答
热心网友
时间:2024-12-04 01:55
使用方法:使用win-masm运行后,首先输入个任意的两位数表示红灯亮的时间如05或99,然后输入个其他任意字符来作为分隔,接着输入个任意的小于红灯的两位数表示红灯亮的时间如03或98等等来表示黄灯亮的时间,绿灯亮的时间为红灯的时间减去黄灯的时间。输入后开始工作。
当输入9时进入手动控制状态,接着可分别输入1,2,3,4,5,6,来点亮各方向的灯,输入a,b,c,d,e,f分别灭各方向灯。输入7时返回自动控制状态。
当输入0时,则进入夜间状态,黄灯开始闪烁。
当输入8时进入紧急状态,个方向红灯亮起。
后两个状态没有做返回到自动控制的功能。
STACK SEGMENT STACK
DW 64 DUP(0)
STACK ENDS
DATA SEGMENT
STRING0 DB 13,10,3 DUP(9,20H),6 DUP(20H),'+',12 DUP(20H),'+$'
STRING1 DB 13,10,3 DUP(9,20H),'======= *** =======$' ;上面一行
STRING2 DB 13,10,3 DUP(9,20H),6 DUP(20H),'*',12 DUP(20H),'*$';一个制表等于7个空格
STRING3 DB 13,10,3 DUP(9,20H),'======= * * * *** =======$' ;下面一行
STRTIME DB 13,10,4 DUP(9,20H),'TIME: S$';显示时间的格式
STRSHOW DB 13,10,2 DUP(9,20H),'SHOW TIME:$'
STRRED DB 13,10,2 DUP(9,20H),'RED LIGHT(S),YELLOW LIGHT(S):$'
STRBLUE DB 13,10,2 DUP(9,20H),'BLUE LIGHT(S)=RED LIGHT(S)-YELLOW LIGHT(S)$'
RED DB 35H,30H ;红灯亮的时间
BLUE DB 33H,30H ;绿灯亮的时间
YELLOW DB 32H,30H ;黄灯亮的时间
SAVE DB 35H,30H,?,32H,30H ;初始红,黄两种灯亮的时间
COLOUR_CHANGE DB 01H;COLOUR_CHANGE为1时,表示南北红灯亮。为0表示东西
SAVE_RED_NB DB ? ;南北方向
SAVE_YELLOW_NB DB ?
SAVE_BLUE_NB DB ?
SAVE_RED_DX DB ? ;东西方向
SAVE_YELLOW_DX DB ?
SAVE_BLUE_DX DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV BYTE PTR SAVE_RED_NB,04H;红色
MOV BYTE PTR SAVE_YELLOW_NB,07H;白色•
MOV BYTE PTR SAVE_BLUE_NB,07H
MOV BYTE PTR SAVE_RED_DX,07H
MOV BYTE PTR SAVE_YELLOW_DX,0EH;*
MOV BYTE PTR SAVE_BLUE_DX,07H
MOV SI,OFFSET STRING0
MOV CX,3
ROAD1:CALL SHOW ;设置南北方向的道路
LOOP ROAD1
MOV SI,OFFSET STRING1
CALL SHOW
MOV SI,OFFSET STRING2
MOV CX,5
NEXT:CALL SHOW
LOOP NEXT
MOV SI,OFFSET STRING3
CALL SHOW
MOV SI,OFFSET STRING0
MOV CX,3
ROAD2:CALL SHOW ;设置南北方向的道路
LOOP ROAD2
MOV SI,OFFSET STRTIME
CALL SHOW
MOV SI,OFFSET STRSHOW
CALL SHOW
MOV SI,OFFSET STRRED
CALL SHOW
MOV SI,OFFSET STRBLUE
CALL SHOW
CALL NORTH_RED ;设置北边的红灯
CALL NORTH_YELLOW;设置北边的黄灯
CALL NORTH_BLUE;设置北边的绿灯
CALL WEST_BLUE;设置西边的绿灯
CALL WEST_YELLOW;设置西边的黄灯
CALL WEST_RED;设置西边的红灯
CALL EAST_RED;设置东边的红灯
CALL EAST_YELLOW;设置东边黄灯
CALL EAST_BLUE;设置东边的绿灯
CALL SOUTH_BLUE;设置南边绿灯
CALL SOUTH_YELLOW;设置南边的黄灯
CALL SOUTH_RED;设置南边的红灯
MOV DH,16
MOV DL,46
MOV AH,02H;设置光标位置
INT 10H
MOV AH,00H;从键盘读入字符
INT 16H
MOV AH,09 ;按当前指定属性显示
MOV BH,0
MOV BL,SAVE_RED_NB;红色
MOV CX,01 ;字符重复一次
INT 10H
MOV BYTE PTR [SAVE+1],AL;输入红灯亮时间十位放在高地址
MOV CX,0FFFFH
DELAY:LOOP DELAY
MOV DH,16
MOV DL,47
MOV AH,2;设置光标位置
INT 10H
MOV AH,00H
INT 16H
MOV AH,09
MOV BH,0
MOV BL,SAVE_RED_NB;红色
MOV CX,01
INT 10H
MOV BYTE PTR [SAVE],AL;输入红灯点亮时间的个位放在低地址
MOV CX,0FFFFH
DELAY1:LOOP DELAY1
MOV DH,16
MOV DL,48
MOV AH,2
INT 10H
MOV AH,00H
INT 16H
MOV AH,09
MOV BH,0
MOV BL,SAVE_RED_NB;红色
MOV CX,01
INT 10H
MOV BYTE PTR [SAVE+2],AL;在红黄亮灯时间中间可以输入字符加以区分
MOV CX,0FFFFH
DELAY2:LOOP DELAY2
MOV DH,16
MOV DL,49
MOV AH,2
INT 10H
MOV AH,00H
INT 16H
MOV AH,09
MOV BH,0
MOV BL,SAVE_RED_NB;红色
MOV CX,01 ;字符重复一次
INT 10H
MOV BYTE PTR [SAVE+4],AL;输入黄灯点亮时间的十位放在高地址
MOV CX,0FFFFH
DELAY3:LOOP DELAY3
MOV DH,16
MOV DL,50
MOV AH,2
INT 10H
MOV AH,00H
INT 16H
MOV AH,09
MOV BH,0
MOV BL,SAVE_RED_NB;红色
MOV CX,01 ;字符重复一次
INT 10H
MOV BYTE PTR [SAVE+3],AL;输入黄灯点亮时间的个位放在低地址
MOV AL,[SAVE]
MOV BYTE PTR [RED],AL;将输入红灯点亮的时间送入红灯亮的时间
MOV AL,[SAVE+1]
MOV BYTE PTR [RED+1],AL
MOV AL,[SAVE+3]
MOV BYTE PTR[YELLOW],AL;将黄灯点亮的时间送入红灯亮的时间
MOV AL,[SAVE+4]
MOV BYTE PTR [YELLOW+1],AL
MOV BYTE PTR [SAVE+3],30H;将输入黄灯点亮时间清零
MOV BYTE PTR [SAVE+4],30H
A1:MOV DI,OFFSET RED;红灯亮的时间送DI
MOV SI,OFFSET SAVE
COUNT:MOV AH,01H;读取键盘状态
INT 16H
JNZ CONTRL ;如果有键盘输入,进入手动控制
AUTO:MOV DH,14;如果没有键盘输入,进入自动状态
MOV DL,38
MOV AH,2
INT 10H ;置光标位置
MOV AH,09 ;在当前光标处按指定属性显示
MOV AL,[DI+1];将红灯点亮时间高位送AL并显示
MOV BH,0
MOV BL,09H ;设置颜色
MOV CX,01
INT 10H
MOV DH,14;时间的位置
MOV DL,39
MOV AH,2
INT 10H
MOV AL,[DI];将红灯点亮时间低位送AL并显示
MOV AH,09
INT 10H
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
PUSH AX
PUSH BX
PUSH DX
PUSH CX
MOV AH,00H
INT 1AH
ADDDL,18;18是一秒跳的次数
MOVBL,DL
LOP: MOVAH,00H;读取当前DL中的值
INT1AH
CMPDL,BL
JNZLOP;小于一秒,继续计数
INC WORD PTR[SI+3];每过一秒,黄灯亮的时间加1
MOVCX,WORD PTR[SI+3]
CMPWORD PTR[YELLOW],CX;将当前黄灯时间与设定黄灯时间比较
JZBIANLV;若相等,绿灯变绿
BACK1:DECBYTE PTR[DI];倒计时减一
CMP BYTE PTR[DI], 30H ;红灯时间的个位和0比较
JBCARRY_RED;小于0,转到借位
POP CX
POP DX
POP BX
POP AX
JMP COUNT;读取键盘状态
BIANLV:
TEST BYTE PTR[COLOUR_CHANGE],00000001B
JZ NB_BLUE;为0,表示南北绿灯亮
MOV BYTE PTR [SAVE_BLUE_DX],0AH;为1时,东西方向绿灯亮
MOV BYTE PTR [SAVE_BLUE_NB],07H
MOV BYTE PTR [SAVE_YELLOW_DX],07H
MOV BYTE PTR [SAVE_YELLOW_NB],07H
NEW_BLUE:CALL NORTH_BLUE;设置北边的绿灯
CALL WEST_BLUE;设置西北的绿灯
CALL EAST_BLUE;设置东边的绿灯
CALL SOUTH_BLUE;设置南边的绿灯
CALL NORTH_YELLOW;设置北边的黄灯
CALL WEST_YELLOW;设置西边的黄灯
CALL EAST_YELLOW;设置东边的黄灯
CALL SOUTH_YELLOW;设置南边的黄灯
JMP BACK1
NB_BLUE:MOV BYTE PTR [SAVE_BLUE_NB],0AH;南北方向的绿灯置为绿色
MOV BYTE PTR [SAVE_BLUE_DX],07H
MOV BYTE PTR [SAVE_YELLOW_NB],07H
MOV BYTE PTR [SAVE_YELLOW_DX],07H
JMP NEW_BLUE
CARRY_RED: MOV BYTE PTR[DI],39H;红灯亮的时间个位置9
SUB BYTE PTR[DI+1],1;红灯亮的时间十位减1
CMP BYTE PTR[DI+1],30H;十位和零作比较
JB RESTART;红灯倒计时结束,重新计时
POP CX
POP DX
POP BX
POP AX
JMP COUNT
RESTART:MOV CL,[SI];红灯的低位送CL
MOV BYTE PTR[DI],CL
MOV CL,[SI+1]
MOV BYTE PTR[DI+1],CL
MOV BYTE PTR[SI+3],30H
MOV BYTE PTR[SI+4],30H
MOV BYTE PTR [SAVE_BLUE_NB],07H
MOV BYTE PTR [SAVE_BLUE_DX],07H
XOR BYTE PTR[COLOUR_CHANGE],00000001B ;对COLOUR_CHANGE最低位取反
TEST BYTE PTR[COLOUR_CHANGE],00000001B
JNZ NB_RED;为1,南北红灯亮
MOV BYTE PTR [SAVE_RED_NB],07H ;南北方向红灯灭
MOV BYTE PTR [SAVE_RED_DX],04H ;东西方向红灯亮
MOV BYTE PTR [SAVE_YELLOW_NB],0EH;南北方向黄灯亮
NEW_RED:CALL NORTH_RED;设置北边红灯
CALL WEST_RED;设置西边的红灯
CALL EAST_RED;设置东边红灯
CALL SOUTH_RED;设置南边的红灯
CALL NORTH_YELLOW;设置北边的黄灯
CALL WEST_YELLOW;设置西边的黄灯
CALL EAST_YELLOW;设置东边的黄灯
CALL SOUTH_YELLOW;设置南边的黄灯
CALL NORTH_BLUE;设置北边的绿灯
CALL WEST_BLUE;设置西边的绿灯
CALL EAST_BLUE;设置东边的绿灯
CALL SOUTH_BLUE;设置南边的绿灯
POP CX
POP DX
POP BX
POP AX
JMP COUNT
NB_RED: MOV BYTE PTR [SAVE_RED_NB],04H ;南北方向红灯亮
MOV BYTE PTR [SAVE_RED_DX],07H ;东西方向红灯灭
MOV BYTE PTR [SAVE_YELLOW_DX],0EH;东西方向黄灯亮
JMP NEW_RED
CONTRL:
CMP AL,39H;判断输入的是否为9,是则进入手动控制
JZ HAND_CONTRL
CMP AL,30H;判断是否为0,是则进入夜间状态
JZ NIGHT
CMP AL,38H;判断是否为8,是则进入紧急状态
JZ UNFAIR
JMP AUTO
HAND_CONTRL:
MOV CX,0FFFFH
DELAYTIME:LOOP DELAYTIME
MOV CX,0FFFFH
DELAYTIME1:LOOP DELAYTIME1
MOV CX,0FFFFH
DELAYTIME2:LOOP DELAYTIME2
MOV AH,00H;从键盘上读入字符
INT 16H
CMP AL,37H
JZ AUTO ;输入字符7时,跳转到自动模式
CMP AL,31H;输入字符1时,东西方向红灯亮
JZ DX_RL
CMP AL,61H;输入小写a时,东西方向红灯灭
JZ DX_RM
CMP AL,32H;输入字符2时,东西方向黄灯亮
JZ DX_YL
CMP AL,62H;输入小写b时,东西方向黄灯灭
JZ DX_YM
CMP AL,33H;输入字符3时,东西方向绿灯亮
JZ DX_BL
CMP AL,63H;输入小写c时,东西方向绿灯灭
JZ DX_BM
CMP AL,34H;输入字符4时,南北方向红灯亮
JZ NB_RL
CMP AL,64H;输入小写d时,南北方向红灯灭
JZ NB_RM
CMP AL,35H;输入字符5时,南北方向黄灯亮
JZ NB_YL
CMP AL,65H;输入小写e时,南北方向黄灯灭
JZ NB_YM
CMP AL,36H;输入字符6时,南北方向绿灯亮
JZ NB_BL
CMP AL,66H;输入小写f时,南北方向绿灯灭
JZ NB_BM
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
DX_RL:MOV BYTE PTR SAVE_RED_DX,04H ;东西方向红灯亮
JMP SHOW_DX_RED
DX_RM:MOV BYTE PTR SAVE_RED_DX,07H ;东西方向红灯灭
SHOW_DX_RED:CALL WEST_RED;设置西边的红灯
CALL EAST_RED;设置东边的红灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
DX_YL: MOV BYTE PTR SAVE_YELLOW_DX,0EH
JMP SHOW_DX_YELLOW
DX_YM:MOV BYTE PTR SAVE_YELLOW_DX,07H
SHOW_DX_YELLOW:CALL WEST_YELLOW;设置西边的黄灯
CALL EAST_YELLOW;设置东边的黄灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
DX_BL: MOV BYTE PTR SAVE_BLUE_DX,0AH
JMP SHOW_DX_BLUE
DX_BM: MOV BYTE PTR SAVE_BLUE_DX,07H
SHOW_DX_BLUE:CALL WEST_BLUE;设置西边的绿灯
CALL EAST_BLUE;设置东边的绿灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
NB_RL: MOV BYTE PTR SAVE_RED_NB,04H
JMP SHOW_NB_RED
NB_RM: MOV BYTE PTR SAVE_RED_NB,07H
SHOW_NB_RED:CALL NORTH_RED;设置北边的红灯
CALL SOUTH_RED;设置南边的红灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
NB_YL: MOV BYTE PTR SAVE_YELLOW_NB,0EH
JMP SHOW_NB_YELLOW
NB_YM:MOV BYTE PTR SAVE_YELLOW_NB,07H
SHOW_NB_YELLOW:CALL NORTH_YELLOW;设置北边的黄灯
CALL SOUTH_YELLOW;设置南边的黄灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
NB_BL: MOV BYTE PTR SAVE_BLUE_NB,0AH
JMP SHOW_NB_BLUE
NB_BM:MOV BYTE PTR SAVE_BLUE_NB,07H
SHOW_NB_BLUE:CALL NORTH_BLUE;设置北边的绿灯
CALL SOUTH_BLUE;设置南边的绿灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP HAND_CONTRL
NIGHT: MOV BYTE PTR SAVE_BLUE_NB,07H;将所有灯熄灭
MOV BYTE PTR SAVE_BLUE_DX,07H
MOV BYTE PTR SAVE_YELLOW_DX,07H
MOV BYTE PTR SAVE_YELLOW_NB,07H
MOV BYTE PTR SAVE_RED_NB,07H
MOV BYTE PTR SAVE_RED_DX,07H
CALL NORTH_RED;设置北边的红灯
CALL NORTH_BLUE;设置北边的绿灯
CALL WEST_BLUE;设置西边的绿灯
CALL WEST_RED;设置西边的红灯
CALL EAST_RED;设置东边的红灯
CALL EAST_BLUE;设置东边的绿灯
CALL SOUTH_BLUE;设置南边的绿灯
CALL SOUTH_RED;设置南边的红灯
SHANSUO:
CALL NORTH_YELLOW;设置北边的黄灯
CALL WEST_YELLOW;设置西边的黄灯
CALL EAST_YELLOW;设置东边的黄灯
CALL SOUTH_YELLOW;设置南边的黄灯
XOR BYTE PTR COLOUR_CHANGE,00000001B ;对COLOUR_CHANGE最低位取反
TEST BYTE PTR COLOUR_CHANGE,00000001B
JZ LIANG
MOV BYTE PTR SAVE_YELLOW_DX,07H
MOV BYTE PTR SAVE_YELLOW_NB,07H
YANSHI:
MOV CX,0FFFFH
DELAYTIME5:LOOP DELAYTIME5
MOV CX,0FFFFH
DELAYTIME6:LOOP DELAYTIME6
MOV CX,0FFFFH
DELAYTIME7:LOOP DELAYTIME7
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP SHANSUO
LIANG:
MOV BYTE PTR SAVE_YELLOW_DX,0EH
MOV BYTE PTR SAVE_YELLOW_NB,0EH
JMP YANSHI
UNFAIR:
DELAY8:LOOP DELAY8
MOV CX,0FFFFH
MOV AX,03H ;检查鼠标左键是否按下
INT 33H
TEST BX,0000000000000001B;不为零表示按下了鼠标左键
JNZ AUTO
MOV BYTE PTR SAVE_RED_NB,04H;南北方向红灯亮
MOV BYTE PTR SAVE_RED_DX,04H;东西方向红灯亮
MOV BYTE PTR SAVE_BLUE_NB,07H
MOV BYTE PTR SAVE_BLUE_DX,07H
MOV BYTE PTR SAVE_YELLOW_DX,07H
MOV BYTE PTR SAVE_YELLOW_NB,07H
CALL NORTH_RED;设置北边的红灯
CALL NORTH_BLUE;设置北边的绿灯
CALL WEST_BLUE;设置西边的绿灯
CALL WEST_RED;设置西边的红灯
CALL EAST_RED;设置东边的红灯
CALL EAST_BLUE;设置东边的绿灯
CALL SOUTH_BLUE;设置南边的绿灯
CALL SOUTH_RED;设置南边的红灯
CALL NORTH_YELLOW;设置北边的黄灯
CALL WEST_YELLOW;设置西边的黄灯
CALL EAST_YELLOW;设置东边的黄灯
CALL SOUTH_YELLOW;设置南边的黄灯
MOV AH,01H ;隐藏光标
MOV CX,2000H
INT 10H
JMP UNFAIR
MOV AH,4CH ;不带返回码结束
INT 21H
SOUTH_RED PROC
MOV DH,10;设置南边的红灯
MOV DL,37
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_RED_NB
MOV CX,01
INT 10H
RET
SOUTH_RED ENDP
SOUTH_YELLOW PROC
MOV DH,10;设置南边的黄灯
MOV DL,35
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0 ;显示页
MOV BL,SAVE_YELLOW_NB
MOV CX,01 ;字符重复一次
INT 10H
RET
SOUTH_YELLOW ENDP
SOUTH_BLUE PROC
MOV DH,10;设置南边的绿灯
MOV DL,33
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_BLUE_NB
MOV CX,01
INT 10H
RET
SOUTH_BLUE ENDP
EAST_BLUE PROC
MOV DH,9; 设置东边的绿灯
MOV DL,44
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_BLUE_DX
MOV CX,01
INT 10H
RET
EAST_BLUE ENDP
EAST_YELLOW PROC
MOV DH,8;设置东边的黄灯
MOV DL,44
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_YELLOW_DX
MOV CX,01 ;字符重复一次
INT 10H
RET
EAST_YELLOW ENDP
EAST_RED PROC
MOV DH,7;设置东边的红灯
MOV DL,44
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_RED_DX
MOV CX,01
INT 10H
RET
EAST_RED ENDP
WEST_RED PROC
MOV DH,7;设置西边的红灯
MOV DL,31
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_RED_DX
MOV CX,01
INT 10H
RET
WEST_RED ENDP
WEST_YELLOW PROC
MOV DH,6;设置西边的黄灯
MOV DL,31
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_YELLOW_DX
MOV CX,01
INT 10H
RET
WEST_YELLOW ENDP
WEST_BLUE PROC
MOV DH,5;设置西边的绿灯
MOV DL,31
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_BLUE_DX
MOV CX,01 ;字符重复一次
INT 10H
RET
WEST_BLUE ENDP
NORTH_BLUE PROC
MOV DH,4;设置北边的绿灯
MOV DL,42
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_BLUE_NB
MOV CX,01
INT 10H
RET
NORTH_BLUE ENDP
NORTH_YELLOW PROC
MOV DH,4;设置北边的黄灯
MOV DL,40
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_YELLOW_NB
MOV CX,01
INT 10H
RET
NORTH_YELLOW ENDP
NORTH_RED PROC
MOV DH,4;DH行DL列,设置北边的红灯
MOV DL,38
MOV AH,2
INT 10H ;置光标位置
MOV AH,09
MOV AL,2AH
MOV BH,0
MOV BL,SAVE_RED_NB
MOV CX,01 ;字符重复一次
INT 10H
RET
NORTH_RED ENDP
SHOW PROC
MOV DX,SI
MOV AH,9
INT 21H
RET
SHOW ENDP
CODE ENDS
END START
我们电子工程就是这么过的,满分呦
热心网友
时间:2024-12-04 01:55
几个LED?什么叫依次显示0,1,2,3,4,5,?
...调试了好久没弄出来,抱歉..