📄 zhuchengxu.asm
字号:
/************************************************************************************/
;COPYRIGHT BELONG TO 贵鹏斐(用查询方法)(动态显示必须让程序不断循环)
/*存在问题:1.按键设置上下限的时候,减法只能从9减到0
; 2.蜂鸣器,红灯,绿灯没加限流电阻,上电时红灯微亮,蜂鸣器微鸣
; 3.上电时DB18B20显示初始温度85,引起误操作,再一次上电恢复正常*/
; 信电学院
; 2008.9.16
/************************************************************************************/
/***实现功能:通过按键设置温度上下限范围,并用数码管显示温度,越限红灯亮,蜂鸣器响***/
P0MDOUT DATA 0A4H ; Port 0 Output Mode Configuration
P1MDOUT DATA 0A5H ; Port 1 Output Mode Configuration
P2MDOUT DATA 0A6H ; Port 2 Output Mode Configuration
P3MDOUT DATA 0A7H ; Port 3 Output Mode Configuration
XBR1 DATA 0E2H ; Port I/O Crossbar Control 1
PCA0MD DATA 0D9H ; PCA Mode
OSCICN DATA 0B2H ; Internal Oscillator Control
DQ EQU P3.2
;============================================================================================
ORG 0000H
LJMP MAIN
;==================主程序初始化==============================================================
ORG 00B3H
MAIN:
MOV SP,#60H
MOV P0MDOUT, #0FFh ;P2口默认为漏极开路,用于按键,P2.0为+P2.1为-P2.7为确定
MOV P1MDOUT, #0FFh ;P1口输出段码
MOV P3MDOUT, #0FFh ;P3口输出位码,P3.0,P3.1,对应2个数码管,P3.3对应红灯(上限),
;P3.4对应绿灯(下限),P3.5对应蜂鸣器
MOV XBR1, #0C0h
MOV OSCICN, #081h
ANL PCA0MD, #0BFh
MOV PCA0MD, #000h
MOV R0, #00H ;段码(个位数)
MOV R4, #00H ;存十六进制温度
MOV R2, #00H ;计按键数
MOV R3, #02H ;确定键按下的次数为2
MOV R1, #70H ;上限温度值放在71H,下限放在70H
MOV R5, #00H ;段码(十位数)
MOV 70H,#00H
MOV 71H,#00H
MOV DPTR,#TABLE ;显示2个0
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
MOV A,#0FCH
/**************************按键设置上下限******************************************************/
MOV P3,A
M1:
LCALL DISPLAY
JNB P2.0,JIAFA ;P2.0为0,数码管加1
JNB P2.1,JIANFA ;P2.1为0,数码管减1
JB P2.7,M1
JNB P2.7,$ ;等待确定键(P2.7)松开,先存下限数值于80H,后存上限数值于81H
MOV A,R2
MOV @R1,A
INC R1
DJNZ R3,M1
SJMP M2
JIAFA:
JNB P2.0,$
INC R2 ;等待按键(P2.0)松开
INC R0
LCALL DISPLAY
SJMP M1
JIANFA:
JNB P2.1,$
DEC R2 ;等待按键(P2.1)松开
DEC R0
LCALL DISPLAY
SJMP M1
/*****************************开始温度转换*********************************************/
M2:
LCALL GET_TEMP ;调用温度转换子程序
LCALL ZHUANHUAN ;温度转换成十六进制,总温度值存在R4中,个位存在R0,十位存在R5中
LCALL DISPLAY ;调用数码管显示子程序
CLR C
DEC R1 ;清标志位
MOV A,R4
SUBB A,@R1
JNC ALARM_UP ;上限报警
DEC R1
CLR C
MOV A,R4
SUBB A,@R1
JC ALARM_DOWN ;下限报警
SJMP M3
ALARM_DOWN:
CLR P3.4 ;绿灯亮
CLR P3.5 ;蜂鸣器响
SJMP M3
ALARM_UP:
CLR P3.3 ;红灯亮
CLR P3.5 ;蜂鸣器响
SJMP M4
M3:
LCALL DELAY750MS ;两次转换需间隔750MS,并且在延时里还要调用显示子程序
INC R1
M4:
INC R1
SJMP M2
;===========================================================================================
/***温度转换子程序**********************************************************************/
GET_TEMP:
;CLR PSW.4
;SETB PSW.3 ;设置工作寄存器当前所在的区域,1区
CLR EA ;使用 ds1820 一定要禁止任何中断产生
lcall DS18B20_INIT ;调用初始化子程序
MOV A,#0CCH
LCALL write ;送入跳过 ROM 命令
MOV A, #44H
LCALL write ;送入温度转换命令
lcall DS18B20_INIT ;温度转换完全再次初始化ds18b20
MOV A,#0CCH
LCALL write ;送入跳过 ROM 命令
MOV A,#0BEH
LCALL write ;送入读温度暂存器命令
LCALL read
MOV R7,A ;读出温度值低字节存入 R7
LCALL read
MOV R6,A ;读出谩度值高字节存入 R6
SETB EA
RET
DS18B20_INIT: ;初始化子程序
CLR EA ;使用ds18b20一定要禁止任何中断的产生
SETB DQ
nop
nop
L0:CLR DQ ;总线为低复位电平
call delay500us ;总线复位电平保持500us
setb DQ ;释放总线
mov R2,#50
L1:djnz R2,L1 ;延时25us
clr C ;清存在标志
orl C,DQ
jc L0 ;存在?不存在则从来
mov R3,#80
L5:orl C,DQ
jc L3
nop
djnz R3,L5
sjmp L0
L3:mov R2,#240
L2:nop
djnz R2,L2
ret
;==========================================================
delay500us:
mov r6,#200
lpr6:
nop
nop
djnz r6,lpr6
ret
;==========================================================
write: ;向DS18B20写操作命令子程序
CLR EA
MOV R3,#8 ;写入DS18B20的bit数,一个字节8个bit
WR1: SETB DQ
MOV R4,#8
RRC A ;把一个字节分成8个位循环移给C
CLR DQ ;开始写入ds18b20要求处于复位低电平
WRR2:nop
djnz R4,WRR2
MOV DQ,C ;写入一个位
MOV R4,#40
WR3:nop
DJNZ R4,WR3
DJNZ R3,WR1 ;写入下一位
SETB DQ
ret
read:
CLR EA
MOV R3,#8 ;连续读8个BIT
RE1:CLR DQ ;读前总线保持为低
NOP
NOP
SETB DQ ;开始读,总线释放
MOV R4,#4
RE2:NOP
DJNZ R4,RE2
MOV C,DQ ;从ds18b20总线读一个位
RRC A ;把读到的位循环位移给A
MOV R4,#45
RE3:NOP
DJNZ R4,RE3
DJNZ R3,RE1 ;读下一位
SETB DQ
ret
;==============================================================================================
/********数码显示子程序***********************************************************************/
DISPLAY:
CJNE R0,#0AH,D0
INC R5
MOV R0,#00H
D0:
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0 ;显示个位数
SETB P3.1
LCALL DELAY2MS
MOV P1,#00H ;全部熄灭
MOV DPTR,#TABLE
MOV A,R5
MOVC A,@A+DPTR
MOV P1,A
CLR P3.1 ;显示十位数
SETB P3.0
LCALL DELAY2MS
MOV P1,#00H
CJNE R5,#0AH,D1
MOV R5,#00H
D1:
RET
;=========延时2毫秒===================================================================
DELAY2MS:
MOV A,R2
MOV B,R3
PUSH ACC
PUSH B
MOV R3,#4
D2: MOV R2,#250
DJNZ R2,$
DJNZ R3,D2
POP B
MOV R3,B
POP ACC
MOV R2,A
RET
;=========延时750毫秒=================================================================
DELAY750MS:
MOV A,R4
PUSH ACC
LCALL DISPLAY
MOV R2,#75
D4: MOV R3,#20
D3: MOV R4,#250
DJNZ R4,$
DJNZ R3,D3
LCALL DISPLAY
DJNZ R2,D4
POP ACC
MOV R4,A
RET
;=====================================================================================
ZHUANHUAN:
MOV A,R6
ANL A,#0FH ;屏蔽R6的高4位,只保留低四位
SWAP A
MOV B,A
MOV A,R7
ANL A,#0F0H ;屏蔽R7的低四位即去掉小数部分
SWAP A
ORL A,B ;十六进制温度存在A中
MOV R4,A ;十六进制温度存在R4中
MOV B,#0AH
DIV AB ;十位数在A中,个位在B中
MOV R0,B
MOV R5,A
RET
;============================================================================================
TABLE: DB 3FH,03H,6DH,67H,53H,76H,7EH,23H,7FH,73H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -