1、1;FILE NAME:GJ01.ASM 智能电源插座程序清单ORG 0000HAJMP MAINORG 0003H ;INT0中断入口 AJMP WINT0ORG 000BH ;T0中断入口 AJMP WT0ORG 30HMAIN:MOV SP,#40H ;栈指针MOV 30H,#0 ;显示缓冲区CLR 00H ;设定/等待 状态标志:CLR 01H ;工作/停止状态标志: CLR 02H ;通/断状态标志CLR 03H ;秒标志 T0定时 1s时置位CLR 04H ;分标志 T0 定时1m时置位CLR 05H ;时标志 T0定时 1h时置位MOV 21H,#0 ;0.5ms定时中断计数器初
2、值MOV 22H,#0 ;100ms定时器初值 MOV 23H,#0 ;1s定时器初值MOV 24H,#0 ;1m定时器初值 MOV 25H,#0 ;1h定时器初值 MOV 26H,#5 ;设定“间开”时间MOV 27H,#2 ;设定“间关”时间MOV 28H,#4 ;设定“延时”时间MOV TH0,#05H ;T0 0.5ms 初值MOV TL0,#05H ;T0 0.5ms 自动装入初值MOV TMOD,#02H ;T0 方式 2设定 SETB EA ;开 CPU中断SETB ET0 ;允许 T0中断 SETB TR0 ;允许 T0计数 SETB IT0 ;INT0触发方式设置SETB E
3、X0 ;INT0请求中断STAR:NOPACALL DMACALL DHMOV A,28H ;28H 为设定的延时时间MOV 30H,A ;30H是显示缓冲区JNB 01H,WEND ;01H=0 转移到循环等待状态2ACALL DSP3 ;调用“时”显示子程序 JB 02H,WON ;02H=1 转“间通”SETB P3.7 ; AJMP STAR ;循环WON: CLR P3.7 ;AJMP STAR ;循环WEND:CLR P3.1 ;点亮 LED2MOV P1,#0FFH ;数码管熄灭JB 00H,STAR ;延时结束后可按 K1再设置AJMP WEND ;循环等待状态DM: JNB
4、04H,MRET ;04H=0 T0 定时器 1min时间未到 CLR 04H ;04H=1 T0 定时器 1min时间到清分标志DJNZ 29H,MRET ;判通断控制时间是否到 未到即转JB 02H,M01 ;判现在状态,若是通状态,即转为断状态设定SETB 02H ;判现在状态,若是断状态,即转为通状态设定MOV A,26HMOV 29H,AAJMP MRETM01:CLR 02HMOV A,27HMOV 29H,AMRET:RETDH: JNB 05H,MRET ;05H=0 T0 定时器 1h时间未到即转DJNZ 28H,MRET ;延时时间是否到未到即转CLR 01H ;01H=0
5、 清延时工作标志CLR TR0 ;延时控制时间到, 关 T0RETDSP1:MOV A,26H ;“间开”显示子程序MOV 30H,A ACALL DSPRETDSP2:MOV A,27H ;“间关”显示子程序MOV 30H,A ACALL DSPRETDSP3:MOV A,28H ;“工作”显示子程序MOV 30H,A ACALL DSPRETDSP: MOV R0,#30H ;30H 为显示数据缓冲器MOV DPTR,#TAB ;笔划段码表指针MOV A,R0MOVC A,A+DPTRMOV P1,AACALL DLRETDL: MOV R7,#02H3DL1: MOV R6,#0FFHD
6、L2: DJNZ R6,DL2DJNZ R7,DL1RET;DELAY: MOV 36H,#64H;DELAY1: MOV 37H,#31H;DELAY2: DJNZ 37H,DELAY2; DJNZ 36H,DELAY1; RETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4DB 92H,82H,0F8H,80H,90H ;5,6,7,8,9DB 88H,83H,0C6H,0A1H,0F3H ;A,b,C,d,E,FWT0:PUSH ACCPUSH PSWINC 21H ;0.5ms 21H中为0.5ms的倍数MOV A,21HCJNE A,#0C8H,T
7、ORETI ;200D=C8H 0.5msX200=100msMOV 21H,#0INC 22H ;100ms 22H中为 100ms 的倍数MOV A,22HCJNE A,#10,TORETI ;100msX10=1s MOV 22H,#0INC 23H ;23H中为 1s 的倍数SETB 03H ;每隔 1秒钟 03H置位,为系统提供秒信号MOV A,23HCJNE A,#60,TORETIMOV 23H,#0INC 24H ;1mSETB 04H ;每隔 1分钟04H 置位,为系统提供分信号MOV A,24H CJNE A,#60,TORETIMOV 24H,#0INC 25H ;1hS
8、ETB 05H ;每隔 1小时05H 置位,为系统提供时信号MOV A,25HCJNE A,#24,TORETIMOV 25H,#0TORETI:POP PSWPOP ACCRETIWINT0: PUSH ACCPUSH PSWSETB 00HCLR EX0 ;关中断CLR TR0 ;关计数器ACALL DL ;调延时子程序SETB 00HPK: JB P3.2,PK3 ;判 K1按下否,未按则转到“待启动状态”(判 K3)CLR P3.0 ;LED1 点亮 SETB P3.1JNB P3.2,$ ;待 K1(P3.2)释放 JB P3.2,PK2O ;判 K1(P3.2)按下否,未按则转到“
9、间开”设定4(判 K2)ACALL PK2F ;K1按下,进入“间关”设定(判 K2),PK1:JB P3.2,PK3 ;判 K1按下否,未按则转到“待启动状态”(判 K3) JNB P3.2,$ ;待 K1释放 ACALL SH ;设定延时时间 PK3:JB P3.4,PK ;判 K3按下否,未按则转到判 K1状态 CLR P3.7 ;K3按下,系统启动SETB P3.0 SETB P3.1 CLR 00HSETB TR0 ;开计数器SETB EX0 ;开中断CLR 00HPOP PSW ;恢复现场 POP ACCRETISH: CLR P3.0 ;点亮 LED1CLR P3.1 ;点亮 L
10、ED2ACALL DLMOV R0,#20HPK2H1:JB P3.3,PK2H2 ;判K2(P3.3)按下否,未按下再读MOV A,28HCJNE A,#9,PK2H3MOV 28,#0PK2H3:INC 28HACALL DSP3JNB P3.3,$ ;等待 K3释放AJMP PK2H1PK2H2:DJNZ R0,PK2H1RETPK2F: SETB P3.0 ;LED1灭CLR P3.1 ;LED2亮ACALL DLMOV R0,#20HPK2F1:JB P3.3,PK2F2 ;判K2(P3.3)按下否,未按下再读INC 27HACALL DSP1JNB P3.3,$ ;等待 K2释放AJMP PK2F1PK2F2:DJNZ R0,PK2F1RETPK2O: ACALL DL ;“间开”时间设定MOV R0,#20H PK2O1:JB P3.3,PK2O2 ;判K2(P3.3)按下否,未按下再读INC 26H ;K2按下,“间开”时间加 1 ACALL DSP1 ; JNB P3.3,$ ;等待 K2释放AJMP PK2O1 ;再读 K2 PK2O2:DJNZ R0,PK2O1AJMP PKEND