这是一个比较完整的程序。最近实习要做交通灯,
写了个程序。比较简单,不过初学者可以参考,呵呵
;************************************* ;file name: traffic_light.asm ; ;FOUCTION : 实现交通灯的交替控制及特殊情况(如急救车等)通过时实现绿灯,通过外中断实现 ; ;WRITER : ;Finish Time: 2010.6.8 ;************************************* North_South_Red BIT P1.0 North_South_Yellow BIT P1.1 North_South_Green BIT P1.2 East_West_Red BIT P1.3 East_West_Yellow BIT P1.4 East_West_Green BIT P1.5 Scd EQU 30H ;秒 ORG 0000H JMP START ORG 0003H JMP INIT0 ORG 000BH JMP TIME0 ;************************************* ;NAME: 交通灯交替工作控制程序 ; ;FOUCTION: 红绿黄交替点亮: 红灯亮33秒钟后绿灯亮27秒,然后闪烁3秒,最后黄灯点亮三秒 ,循环 ; ;WRITER : ;TIME : 2010.6.8 ;************************************* TIME0: MOV TH0,#30H MOV TL0,#0B0H INC 31H MOV A,31H N: CJNE A,#20,EXIT ;判断是否到一秒 MOV 31H,#0 INC Scd MOV A,Scd CJNE A,#27,NEXT1 ;判断绿灯是否到27s SETB F0 JMP EXIT NEXT1: MOV A,Scd CJNE A,#30,NEXT2 ;判断绿灯是否亮30s CLR F0 MOV P1,#0EEH JMP EXIT NEXT2: MOV A,Scd CJNE A,#33,NEXT3 MOV P1,#0F3H ;初始化 NEXT3: MOV A,Scd CJNE A,#60,NEXT4 SETB 00H JMP EXIT NEXT4: MOV A,Scd CJNE A,#63,NEXT5 CLR 00H MOV P1,#0F5H JMP EXIT NEXT5: MOV A,Scd CJNE A,#66,EXIT MOV P1,#0DEH MOV Scd,#0 EXIT: RETI ;************************************* ;NAME: 外中断0 ; ;FOUCTION: 东西方向出现特殊情况 ? ; 南北红灯亮,东西绿灯亮,延时10s ;WRITER : ;TIME : 2010.6.8 ;************************************* INIT0: PUSH PSW PUSH ACC CLR EA MOV R2,P1 ;保存数据 MOV P1,#0F6H CALL DELLAY10S MOV P1,R2 ;恢复 SETB EA POP ACC POP PSW RETI ;*******************主程序初始化部分************** START: MOV Scd, #00H MOV 31H, #00H MOV P1, #0FFH CLR 00H CLR F0 MOV TMOD, #01H ;设定定时器1 MOV IE, #83H ;设定中断使能 定时器中断0、外部中断0和1 MOV SP, #60H MOV TH0, #30H MOV TL0, #0B0H SETB TR0 LOOP: JNB F0,N0 CPL East_West_Green ;绿灯闪三秒 CALL DELAY500MS JMP N1 N0: JNB 00H,N1 CPL North_South_Green ;绿灯闪三秒 CALL DELAY500MS N1: JMP LOOP ;************************************ ;Name : DELAY ; ;Fouction: delay 10s ; ;Time : 2010.06.09 ;Writer : ;************************************* DELLAY10S: MOV R4,#0BFH D1: MOV R6,#0BDH D0: MOV R5,#89H DJNZ R5,$ DJNZ R6,D0 DJNZ R4,D1 NOP RET ;************************************ ;Name : DELAY ; ;Fouction: delay 10s ; ;Time : 2010.06.17 ;Writer : ;************************************* DELAY500MS: ;Delay 0.5s MOV 57H,#17H DL1: MOV 56H,#98H DL0: MOV 55H,#46H DJNZ 55H,$ DJNZ 56H,DL0 DJNZ 57H,DL1 RET END