《汇编实现交通灯控制模拟程序设计(共16页).doc》由会员分享,可在线阅读,更多相关《汇编实现交通灯控制模拟程序设计(共16页).doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上使用方法:使用win-masm运行后,首先输入个任意的两位数表示红灯亮的时间如05或99,然后输入个其他任意字符来作为分隔,接着输入个任意的小于红灯的两位数表示红灯亮的时间如03或98等等来表示黄灯亮的时间,绿灯亮的时间为红灯的时间减去黄灯的时间。输入后开始工作。 当输入9时进入手动控制状态,接着可分别输入1,2,3,4,5,6,来点亮各方向的灯,输入a,b,c,d,e,f分别灭各方向灯。输入7时返回自动控制状态。当输入0时,则进入夜间状态,黄灯开始闪烁。当输入8时进入紧急状态,个方向红灯亮起。后两个状态没有做返回到自动控制的功能。STACK SEGMENT STAC
2、KDW 64 DUP(0)STACK ENDS DATA SEGMENTSTRING0 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$;显示时间的格式STR
3、SHOW 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;
4、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 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AXMOV BYTE PTR SAVE_RED_NB,04H;红色MOV BYTE PTR SAVE_YELLOW_NB,07H;白色MOV BYT
5、E PTR SAVE_BLUE_NB,07HMOV BYTE PTR SAVE_RED_DX,07HMOV BYTE PTR SAVE_YELLOW_DX,0EH;黄色MOV BYTE PTR SAVE_BLUE_DX,07HMOV 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 STRING3CALL SHOWM
6、OV SI,OFFSET STRING0 MOV CX,3 ROAD2:CALL SHOW ;设置南北方向的道路LOOP ROAD2MOV SI,OFFSET STRTIMECALL SHOWMOV SI,OFFSET STRSHOWCALL SHOWMOV SI,OFFSET STRREDCALL SHOWMOV SI,OFFSET STRBLUECALL SHOWCALL NORTH_RED ;设置北边的红灯CALL NORTH_YELLOW;设置北边的黄灯CALL NORTH_BLUE;设置北边的绿灯CALL WEST_BLUE;设置西边的绿灯CALL WEST_YELLOW;设置西边的
7、黄灯CALL WEST_RED;设置西边的红灯CALL EAST_RED;设置东边的红灯CALL EAST_YELLOW;设置东边黄灯CALL EAST_BLUE;设置东边的绿灯CALL SOUTH_BLUE;设置南边绿灯CALL SOUTH_YELLOW;设置南边的黄灯CALL SOUTH_RED;设置南边的红灯MOV DH,16MOV DL,46MOV AH,02H;设置光标位置INT 10HMOV AH,00H;从键盘读入字符INT 16H MOV AH,09 ;按当前指定属性显示MOV BH,0 MOV BL,SAVE_RED_NB;红色MOV CX,01 ;字符重复一次INT 10H
8、MOV BYTE PTR SAVE+1,AL;输入红灯亮时间十位放在高地址 MOV CX,0FFFFH DELAY:LOOP DELAYMOV DH,16MOV DL,47MOV AH,2;设置光标位置INT 10HMOV AH,00HINT 16H MOV AH,09 MOV BH,0 MOV BL,SAVE_RED_NB;红色MOV CX,01INT 10HMOV BYTE PTR SAVE,AL;输入红灯点亮时间的个位放在低地址MOV CX,0FFFFH DELAY1:LOOP DELAY1MOV DH,16MOV DL,48MOV AH,2INT 10HMOV AH,00HINT 16
9、H MOV AH,09 MOV BH,0 MOV BL,SAVE_RED_NB;红色MOV CX,01 INT 10HMOV BYTE PTR SAVE+2,AL;在红黄亮灯时间中间可以输入字符加以区分 MOV CX,0FFFFH DELAY2:LOOP DELAY2MOV DH,16MOV DL,49MOV AH,2INT 10HMOV AH,00HINT 16H MOV AH,09 MOV BH,0 MOV BL,SAVE_RED_NB;红色MOV CX,01 ;字符重复一次INT 10HMOV BYTE PTR SAVE+4,AL;输入黄灯点亮时间的十位放在高地址MOV CX,0FFFF
10、H DELAY3:LOOP DELAY3MOV DH,16MOV DL,50MOV AH,2INT 10HMOV AH,00HINT 16H MOV AH,09 MOV BH,0 MOV BL,SAVE_RED_NB;红色MOV CX,01 ;字符重复一次INT 10HMOV BYTE PTR SAVE+3,AL;输入黄灯点亮时间的个位放在低地址MOV AL,SAVEMOV BYTE PTR RED,AL;将输入红灯点亮的时间送入红灯亮的时间 MOV AL,SAVE+1MOV BYTE PTR RED+1,ALMOV AL,SAVE+3MOV BYTE PTRYELLOW,AL;将黄灯点亮的时
11、间送入红灯亮的时间MOV AL,SAVE+4MOV BYTE PTR YELLOW+1,ALMOV BYTE PTR SAVE+3,30H;将输入黄灯点亮时间清零MOV BYTE PTR SAVE+4,30HA1:MOV DI,OFFSET RED;红灯亮的时间送DIMOV SI,OFFSET SAVECOUNT:MOV AH,01H;读取键盘状态INT 16HJNZ CONTRL ;如果有键盘输入,进入手动控制AUTO:MOV DH,14;如果没有键盘输入,进入自动状态MOV DL,38MOV AH,2INT 10H ;置光标位置MOV AH,09 ;在当前光标处按指定属性显示MOV AL,
12、DI+1;将红灯点亮时间高位送AL并显示MOV BH,0 MOV BL,09H ;设置颜色MOV CX,01 INT 10HMOV DH,14;时间的位置MOV DL,39MOV AH,2INT 10H MOV AL,DI;将红灯点亮时间低位送AL并显示MOV AH,09 INT 10HMOV AH,01H ;隐藏光标MOV CX,2000HINT 10HPUSH AXPUSH BXPUSH DXPUSH CXMOV AH,00HINT 1AHADDDL,18;18是一秒跳的次数MOVBL,DLLOP: MOVAH,00H;读取当前DL中的值INT1AHCMPDL,BLJNZLOP;小于一秒,
13、继续计数INC WORD PTRSI+3;每过一秒,黄灯亮的时间加1MOVCX,WORD PTRSI+3CMPWORD PTRYELLOW,CX;将当前黄灯时间与设定黄灯时间比较JZBIANLV;若相等,绿灯变绿BACK1:DECBYTE PTRDI;倒计时减一CMP BYTE PTRDI, 30H ;红灯时间的个位和0比较JBCARRY_RED;小于0,转到借位POP CXPOP DXPOP BXPOP AXJMP COUNT;读取键盘状态BIANLV:TEST BYTE PTRCOLOUR_CHANGE,BJZ NB_BLUE;为0,表示南北绿灯亮MOV BYTE PTR SAVE_BLU
14、E_DX,0AH;为1时,东西方向绿灯亮MOV BYTE PTR SAVE_BLUE_NB,07HMOV BYTE PTR SAVE_YELLOW_DX,07HMOV BYTE PTR SAVE_YELLOW_NB,07HNEW_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
15、;设置南边的黄灯JMP BACK1NB_BLUE:MOV BYTE PTR SAVE_BLUE_NB,0AH;南北方向的绿灯置为绿色MOV BYTE PTR SAVE_BLUE_DX,07HMOV BYTE PTR SAVE_YELLOW_NB,07HMOV BYTE PTR SAVE_YELLOW_DX,07HJMP NEW_BLUECARRY_RED: MOV BYTE PTRDI,39H;红灯亮的时间个位置9SUB BYTE PTRDI+1,1;红灯亮的时间十位减1CMP BYTE PTRDI+1,30H;十位和零作比较JB RESTART;红灯倒计时结束,重新计时POP CXPOP D
16、XPOP BXPOP AXJMP COUNTRESTART:MOV CL,SI;红灯的低位送CLMOV BYTE PTRDI,CLMOV CL,SI+1MOV BYTE PTRDI+1,CLMOV BYTE PTRSI+3,30HMOV BYTE PTRSI+4,30HMOV BYTE PTR SAVE_BLUE_NB,07HMOV BYTE PTR SAVE_BLUE_DX,07HXOR BYTE PTRCOLOUR_CHANGE,B ;对COLOUR_CHANGE最低位取反TEST BYTE PTRCOLOUR_CHANGE,BJNZ NB_RED;为1,南北红灯亮MOV BYTE PTR
17、 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 NORT
18、H_BLUE;设置北边的绿灯CALL WEST_BLUE;设置西边的绿灯CALL EAST_BLUE;设置东边的绿灯CALL SOUTH_BLUE;设置南边的绿灯POP CXPOP DXPOP BXPOP AX JMP COUNTNB_RED: MOV BYTE PTR SAVE_RED_NB,04H ;南北方向红灯亮MOV BYTE PTR SAVE_RED_DX,07H ;东西方向红灯灭MOV BYTE PTR SAVE_YELLOW_DX,0EH;东西方向黄灯亮JMP NEW_REDCONTRL: CMP AL,39H;判断输入的是否为9,是则进入手动控制JZ HAND_CONTRLCM
19、P AL,30H;判断是否为0,是则进入夜间状态JZ NIGHTCMP AL,38H;判断是否为8,是则进入紧急状态JZ UNFAIRJMP AUTOHAND_CONTRL:MOV CX,0FFFFHDELAYTIME:LOOP DELAYTIMEMOV CX,0FFFFHDELAYTIME1:LOOP DELAYTIME1MOV CX,0FFFFHDELAYTIME2:LOOP DELAYTIME2MOV AH,00H;从键盘上读入字符INT 16H CMP AL,37HJZ AUTO ;输入字符7时,跳转到自动模式CMP AL,31H;输入字符1时,东西方向红灯亮JZ DX_RLCMP A
20、L,61H;输入小写a时,东西方向红灯灭JZ DX_RMCMP AL,32H;输入字符2时,东西方向黄灯亮JZ DX_YLCMP AL,62H;输入小写b时,东西方向黄灯灭JZ DX_YMCMP AL,33H;输入字符3时,东西方向绿灯亮JZ DX_BLCMP AL,63H;输入小写c时,东西方向绿灯灭JZ DX_BMCMP AL,34H;输入字符4时,南北方向红灯亮JZ NB_RLCMP AL,64H;输入小写d时,南北方向红灯灭JZ NB_RMCMP AL,35H;输入字符5时,南北方向黄灯亮JZ NB_YLCMP AL,65H;输入小写e时,南北方向黄灯灭JZ NB_YMCMP AL,3
21、6H;输入字符6时,南北方向绿灯亮JZ NB_BLCMP AL,66H;输入小写f时,南北方向绿灯灭JZ NB_BMMOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_CONTRLDX_RL:MOV BYTE PTR SAVE_RED_DX,04H ;东西方向红灯亮JMP SHOW_DX_REDDX_RM:MOV BYTE PTR SAVE_RED_DX,07H ;东西方向红灯灭SHOW_DX_RED:CALL WEST_RED;设置西边的红灯CALL EAST_RED;设置东边的红灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJM
22、P HAND_CONTRLDX_YL: MOV BYTE PTR SAVE_YELLOW_DX,0EHJMP SHOW_DX_YELLOWDX_YM:MOV BYTE PTR SAVE_YELLOW_DX,07HSHOW_DX_YELLOW:CALL WEST_YELLOW;设置西边的黄灯CALL EAST_YELLOW;设置东边的黄灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_CONTRLDX_BL: MOV BYTE PTR SAVE_BLUE_DX,0AHJMP SHOW_DX_BLUEDX_BM: MOV BYTE PTR SAVE_BLUE
23、_DX,07HSHOW_DX_BLUE:CALL WEST_BLUE;设置西边的绿灯CALL EAST_BLUE;设置东边的绿灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_CONTRLNB_RL: MOV BYTE PTR SAVE_RED_NB,04HJMP SHOW_NB_REDNB_RM: MOV BYTE PTR SAVE_RED_NB,07HSHOW_NB_RED:CALL NORTH_RED;设置北边的红灯CALL SOUTH_RED;设置南边的红灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_C
24、ONTRLNB_YL: MOV BYTE PTR SAVE_YELLOW_NB,0EHJMP SHOW_NB_YELLOWNB_YM:MOV BYTE PTR SAVE_YELLOW_NB,07HSHOW_NB_YELLOW:CALL NORTH_YELLOW;设置北边的黄灯CALL SOUTH_YELLOW;设置南边的黄灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_CONTRLNB_BL: MOV BYTE PTR SAVE_BLUE_NB,0AHJMP SHOW_NB_BLUENB_BM:MOV BYTE PTR SAVE_BLUE_NB,07H
25、SHOW_NB_BLUE:CALL NORTH_BLUE;设置北边的绿灯CALL SOUTH_BLUE;设置南边的绿灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP HAND_CONTRLNIGHT: MOV BYTE PTR SAVE_BLUE_NB,07H;将所有灯熄灭MOV BYTE PTR SAVE_BLUE_DX,07HMOV BYTE PTR SAVE_YELLOW_DX,07HMOV BYTE PTR SAVE_YELLOW_NB,07HMOV BYTE PTR SAVE_RED_NB,07HMOV BYTE PTR SAVE_RED_DX,07H
26、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 COLOU
27、R_CHANGE,B ;对COLOUR_CHANGE最低位取反TEST BYTE PTR COLOUR_CHANGE,BJZ LIANGMOV BYTE PTR SAVE_YELLOW_DX,07HMOV BYTE PTR SAVE_YELLOW_NB,07HYANSHI:MOV CX,0FFFFHDELAYTIME5:LOOP DELAYTIME5MOV CX,0FFFFHDELAYTIME6:LOOP DELAYTIME6MOV CX,0FFFFHDELAYTIME7:LOOP DELAYTIME7MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP SHANSUO
28、LIANG: MOV BYTE PTR SAVE_YELLOW_DX,0EHMOV BYTE PTR SAVE_YELLOW_NB,0EHJMP YANSHIUNFAIR:DELAY8:LOOP DELAY8MOV CX,0FFFFHMOV AX,03H ;检查鼠标左键是否按下INT 33HTEST BX,00001B;不为零表示按下了鼠标左键JNZ AUTOMOV BYTE PTR SAVE_RED_NB,04H;南北方向红灯亮MOV BYTE PTR SAVE_RED_DX,04H;东西方向红灯亮 MOV BYTE PTR SAVE_BLUE_NB,07HMOV BYTE PTR SAVE
29、_BLUE_DX,07HMOV BYTE PTR SAVE_YELLOW_DX,07HMOV BYTE PTR SAVE_YELLOW_NB,07HCALL 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;设置西边的黄灯C
30、ALL EAST_YELLOW;设置东边的黄灯CALL SOUTH_YELLOW;设置南边的黄灯MOV AH,01H ;隐藏光标MOV CX,2000HINT 10HJMP UNFAIR MOV AH,4CH ;不带返回码结束 INT 21HSOUTH_RED PROCMOV DH,10;设置南边的红灯MOV DL,37MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_RED_NBMOV CX,01 INT 10HRETSOUTH_RED ENDPSOUTH_YELLOW PROCMOV DH,10;设置南边的黄灯MO
31、V DL,35MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 ;显示页MOV BL,SAVE_YELLOW_NBMOV CX,01 ;字符重复一次INT 10HRETSOUTH_YELLOW ENDPSOUTH_BLUE PROCMOV DH,10;设置南边的绿灯MOV DL,33MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_BLUE_NBMOV CX,01 INT 10HRETSOUTH_BLUE ENDPEAST_BLUE PROCMOV DH,9; 设置东
32、边的绿灯MOV DL,44MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_BLUE_DXMOV CX,01 INT 10HRETEAST_BLUE ENDPEAST_YELLOW PROCMOV DH,8;设置东边的黄灯MOV DL,44MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_YELLOW_DXMOV CX,01 ;字符重复一次INT 10HRETEAST_YELLOW ENDPEAST_RED PROCMOV DH,7;设置东边的
33、红灯MOV DL,44MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_RED_DXMOV CX,01INT 10HRETEAST_RED ENDPWEST_RED PROCMOV DH,7;设置西边的红灯MOV DL,31MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_RED_DXMOV CX,01INT 10HRETWEST_RED ENDPWEST_YELLOW PROCMOV DH,6;设置西边的黄灯MOV DL,31MOV AH,2
34、INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_YELLOW_DX MOV CX,01 INT 10HRETWEST_YELLOW ENDPWEST_BLUE PROCMOV DH,5;设置西边的绿灯MOV DL,31MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_BLUE_DX MOV CX,01 ;字符重复一次INT 10HRETWEST_BLUE ENDPNORTH_BLUE PROCMOV DH,4;设置北边的绿灯MOV DL,42MOV AH,2
35、INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_BLUE_NB MOV CX,01 INT 10HRETNORTH_BLUE ENDPNORTH_YELLOW PROCMOV DH,4;设置北边的黄灯MOV DL,40MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_YELLOW_NB MOV CX,01 INT 10HRETNORTH_YELLOW ENDPNORTH_RED PROCMOV DH,4;DH行DL列,设置北边的红灯MOV DL,38MOV AH,2INT 10H ;置光标位置MOV AH,09 MOV AL,2AHMOV BH,0 MOV BL,SAVE_RED_NB MOV CX,01 ;字符重复一次INT 10HRETNORTH_RED ENDPSHOW PROC MOV DX,SI MOV AH,9 INT 21H RETSHOW ENDPCODE ENDS END START专心-专注-专业