北京交通大学
机械与电子控制工程学院
DJNZ R2,RD2 MOV @R1,A INC R1 DJNZ R4,RD1 RET ;键扫描程序
KEY: JNB KEY1,KKKEY2 ;判断key1键是否按下,未按下则查看key2键是否按下
JB KEY1,$ ;等待key1键释放
MOV A,30H ;将温度最低限值送入累加器 ADD A,#01H ;给累加器值加一
CJNE A,#100,NEXT1 ;将累加器值与100相比,不相等执行next1
MOV A,#00H ;如果相等,将累加器重置为0 NEXT1: CLR C ;清楚进位标志
CJNE A,31H,DPLAY1 ;将累加器内容与温度最高限相比,不相等执行dplay1
SJMP RETURN
DPLAY1: JC DPLAY3 ;判断进位标志,为1即累加器内容小于最高限温度值,则dplay3
MOV A,30H ;否则,将最低限温度值仍给a DPLAY3: MOV 30H,A SJMP RETURN
KKKEY2: JNB KEY2,KKKEY3 ;判断key2键是否按下,未按下则查看key3键是否按下
JB KEY2,$ ;等待key2键释放
MOV A,30H ;将温度最低限值送入累加器 JZ NEXT3 ;判断累加器内容是否为0,为0执行next3,即保持原值
CLR C ;累加器内容不为0,进位标志清零 SUBB A,#01H ;将累加器内容减一
MOV 30H,A ;将减一所得数送回最低限温度单元 SJMP RETURN ;
NEXT3: MOV 30H,#00 ;累加器内容为0,则让最低限温度单元内容继续保持0
25 北京交通大学
机械与电子控制工程学院
SJMP RETURN ;
KKKEY3: JNB KEY3,KKKEY4 ;判断key3键是否按下,未按下则查看key4键是否按下
JB KEY3,$ ;等待key3键释放
MOV A,31H ;将温度最高限值送入累加器 ADD A,#01H ;给累加器值加一
CJNE A,#100,NEXT2 ;将累加器内容与100相比,不相等执行next2
MOV A,#99 ;如果相等,将99送给累加器
NEXT2: MOV 31H,A ;将累加器内容送给最高限温度单元
SJMP RETURN ;
KKKEY4: JNB KEY4,RETURN ;判断key4键是否按下,未按下则返回
JB KEY4,$ ;等待key4键释放
MOV A,31H ;将温度最高限值送入累加器
JZ RETURN ;判断累加器内容是否为0,如果为0,则返回,保持原值不变
CLR C ;累加器内容不为0,则将进位标志清零 SUBB A,#01H ;将累加器内容减一
CLR C ;再清除进位标志,准备比较累加器内容与最低限温度单元内容的大小关系
CJNE A,30H,DPLAY2 ;将减一所得数与最低限温度单元内容比较,不相等执行dplay2
MOV A,31H ;如果相等,则将最高限温度值保持 SJMP RETURN ;
DPLAY2: JC RETURN ;判断进位标志,进位标志为1,即保持原值
MOV 31H,A ;进位标志为0,即累加器内容(最高温度限)大于最低限温度值,则将累加器内容送给
SJMP RETURN ; RETURN: RET ;显示子程序
DISPLAY:MOV A,30H ;将30H(最低限温度)内容送入累加器
MOV B,#10 ; DIV AB ;
MOV 6CH,A ;将十位数(最低限温度高位)存入6CH单元
26 北京交通大学
机械与电子控制工程学院
MOV 6DH,B ;个位数(最低限温度低位)存入6DH单元 MOV A,31H ;将30H(最低限温度)内容送入累加器 MOV B,#10 ; DIV AB ;
MOV 6EH,A ;将十位数(最高限温度高位)存入6CH单元 MOV 6FH,B ;个位数(最高限温度低位)存入6DH单元 MOV R0,#6CH ;将要显示内容首地址赋给R0
MOV
LD0:
R2,#01H ;将控制最左一位亮的数赋给R2
MOV A,R2 ;
MOV DPTR,#0103H ;赋C口地址
MOVX @DPTR,A ;将累加器(控制某位亮)内容送到C口 MOV DPTR,#DTAB ;将查表程序首地址给dptr MOV A,@R0 ;将要显示的内容送给累加器 MOVC A,@A+DPTR ;进行地址修正 MOV DPTR,#0102H ;赋B口地址
MOVX @DPTR,A ;将要显示的内容送到B口实现显示 MOV R7,#02H ;延时子程序准备
ACALL INC MOV JB RL MOV AJMP
;显示错误子程序
DISPLAY2: MOV 79H,#79H ;将error对应的字形码存入6个单元
MOV 7AH,#31H ; MOV 7BH,#31H ; MOV 7CH,#3FH ; MOV 7DH,#31H ; MOV 7EH,#00H ; MOV R0,#79H ; MOV
R2,#01H ;
MOV A,R2 ;
27 DL ;调用延时子程序
R0 ;将R0增一,准备显示下一个内容 A,R2 ;
ACC.5,LD1 ;判断一边是否显示完,则返回 A ;如果没显示完,修正显示位继续显示 R2,A ; LD0 ;
LD1: RET ;
北京交通大学
机械与电子控制工程学院
LD2: MOV
MOVX
DPTR,#0103H ; @DPTR,A ;
MOV A,@R0 ; MOV DPTR,#0102H ; MOVX @DPTR,A ; MOV R7,#02H ;
ACALL INC MOV JB RL MOV AJMP
DL ; R0 ; A,R2 ; ACC.5,LD3 ; A ; R2,A ; LD2 ;
LD3: RET ; ;检测当前温度是否超出范围程序
CHECK: CLR C ;将进位标志清零
MOV A,22H ;把当前温度值送入累加器 CJNE A,30H,CHECK1 ;将当前温度与最低限温度比较 ;
GOON: CLR P1.7 ;当前温度大于或者相等最低限温度,将二极管(绿灯)熄灭
CLR C ;清零进位标志 CJNE A,31H,CHECK2 ;再与最高限温度比较
CLR P1.6 ;当前温度与最高限温度相等,将二极管(黄灯)熄灭or蜂鸣器关掉
SJMP BACK ;
CHECK2: JC PREBACK ;判断进位标志,如果为1,即当前温度小于最高限温度,将二极管(黄灯)熄灭or蜂鸣器关掉
SETB P1.6 ;不为1,即当前温度大于最高限温度,则启动蜂鸣器or打开黄色发光二极管
SJMP BACK ;
CHECK1: JNC GOON ;判断进位标志,如果为0,即当前温度大于最低限温度,转到goon。
SETB P1.7 ;进位标志为1,即当前温度小于最低限温度,即打开绿色发光二极管
28 北京交通大学
机械与电子控制工程学院
SJMP BACK ;
PREBACK: CLR P1.6 ;即当前温度小于最高限温度,将二极管(黄灯)熄灭or蜂鸣器关掉
BACK: RET ; ;查表程序 DTAB: DB
DB DB DB
;延时子程序 DL: MOV DL6 : DJNZ
DJNZ
R6,#0FFH ; R6,DL6 ; R7,DL ; 3FH,06H,5BH,4FH,66H,6DH ;0,1,2,3,4,5 7DH,07H,7FH,6FH,77H,7CH ;6,7,8,9, 39H,5EH,79H,71H,73H,21H ; 31H,6EH,40H,3EH,00H,00H ;
RET ; END ;
29