附录1: 主程序:
ORG 000H JMP START
START: Curtemp EQU 10H ;Curtemp存储地址
Pretemp EQU 11H ;Pretemp存储地址
MOV TMOD, #53H
LCALL InitDS12887 ;初始化DS12887时钟芯片 SETB EA ;开CPU中断 LCALL ReadTempandTime ;读温度时间设定值 LCALL ReadWaterandPosition;读水位高度 CLR C ;C清零 SUB Curtemp,pretemp JC Offheat Heatcontinue:
LCALL FUZZY ;预算提前加热时间 LCALL DELAY LCALL Heat SJMP $ OffHeat:CLR P2.1 RETI
Heat: SETB P2.1 LCALL DELAY CLR C LCALL ReadTemp MOV A, Curtemp ADD A, #2H SUB A, Pretemp JNC KeepTemp JMP Heatcontinue LCALL KeeptempCON RETI InitDS12887:
SETB P2。1
第 31 页
MOV DPTR, #0BH ;初始化DS12887B寄存器 MOV A, #22H ;置DS12887 24小时模式 MOVX @DPTR, A ;允许报警中断禁止其它中断 MOV DPTR, #0AH ;初始化DS12887 A寄存器 MOVX A, #20H ;时钟频率52.628KHZ,禁止SQW MOV DPTR, #00H ;初始化时钟 MOV A, #00H
MOVX @DPTR, A ;秒 MOV DPTR, #02H ;分 MOV @DPTR, A
MOV DPTR, #04H ;时 MOV A, #12H MOV @DPTR, A RETI ReadTempandTime:
LCALL ReadTemp LCALL ReadTime RETI ORG 0013H JMP KeyBoardINT KeyBoardINT:
LED显示子程序:
DISI:
SETB P1.7 ;灭显示 MOV R0, #SBCD
MOV A, @R0 ;取出要显示的数 ADD A, #2DH ;加上偏移量 MOVC A , @A+PC ;查表取出段选码 MOV SBUF, A ;送出显示 DL1:
JNB TI, DL1 ;输出完否?
第 32 页
CLR TI ;完,清中断标志 INC R0 MOV A, @R0 ADD A, #21H MOVC A, @A + PC
ANL A, #OEFH ;个位加小数点 MOV SBUF, A DL2:
JNB TI, DL2 CLR TI INC R0 MOV A, @R0 ADD A, #13H MOVC A, @A+PC MOV SBUF, A DL3:
JNB TI, DL3 CLR TI MOV A, #0FFH MOV SBUF, A DL4:
JNB TI, DL4 CLR TI
CLR P1.7 ;亮显示 RET
SEGTAB:
DB 11H,0D7H,32H DB 92H,0D4H,98H DB 18H,0D3H,10H,0D0H
键盘输入主程序:
MOV P1, #0FH ;键盘初始化,P1.0~P1.3置输入方式,
P1.4~P1.7为0状态
第 33 页
MOV IE, #84H ;开CPU中断,开INT1中断 SJMP $ ;中断等待
中断服务程序:
ORG 0013 ;INT1中断入口地址
LJMP IO51K16 ;从中断入口转移键盘处理程序IO51K16
IO51K16: CALL D10MS ;延时10秒
LCALL KEYIN ;调键输入检查子程序 JNZ LKOUT ;有键输入,转查键号 RETI ;无键输入,中断返回
LKOUT: MOV R2, #0EFH ;首列扫描字写如R2
MOV R4, #00H ;首列偏移值如R4
CONU: MOV P1, R2 ;列扫描字写入列线中
MOV A, P1 ;读入P1口状态到A中
JB ACC.0,LONE ;检查第0行是否为0状态,不为0表示按下
键不在此行,转下行
MOV A, #00H ;第0行为0状态,表明按下键在此行,首列
号如A
AJMP LKP ;转求键号
LONE: JB ACC1.1, LTWO ;检查第1行有无键按下
MOV A, #04H ;有键按下,该行首列号入A AJMP LKP ;转求键号
LTWO: JB ACC.2, LTHR MOV A, #08H AJMP LKP
LTHR: JB ACC.3, NEXT ;该列所有行都无键按下,转NEXT MOV A, #0CH ;有键按下,该行首列号入A中 LKP: ADD A, R4 ;求键号,键号位首列号加列偏移值 PUSH A ;键号入栈保护 WKFE: LACLL KEYIN ;等待键释放
JNZ WKFE ;键未释放转WKFE等待 POP A ;键释放,键号如A
LJMP KJMP ;转键操作转处理 NEXT: INC R4 ;转查下一列,列偏移值加1 MOV A, R2
第 34 页
JNB ACC.7, KND ;最后一列查完?查完中断返回 RL A ;未查完,列扫描字左移1位 MOV R2, A ;扫描字如R2继续查找 LJMP CONU KND: RETI
KEYIN: MOV P1, #0FH ;查完有无键按下,A不为0,有键按下 MOV A, P1 CPL A ANL A, #0FH
RET
KJMP:
SUB A,#OFH JC W riteTemp ADD A, #0FH CLR C SUB A, #0EH
JC StoreTemporTime ADD A, #0EH CLR C SUB A, #ODH JC Waterpoistion ADD A, #ODH CLR C SUB A, #0CH JC Vtemp ADD A, 0CH CLR C SUB A, #OBH JC StoreTime RETI ORG 0003H JMP Heat RET
第 35 页
附录2:
第 36 页