你的编程的思路太乱。
刚刚看了开头一点,你看看我红色文字的部分,仅就你说的设置问题,其余的没看。
DQ EQU P1.7 ;DS18B20控制口 //最好“EQU”改为“BIT”,防止出错,还一目了然。
LED1 EQU P2.5
LED2 EQU P2.6
LED EQU P3
FLAG EQU 30H //你这样定义的是字节,不是“位”可你下面的程序显示,你应该是“位”。
//内部数据存储器20H~2FH单元是可“位操作”空间,你可以使用位地址,
//也可以使用“FLAG BIT 2AH.1” 这样的地址和定义方法。
GEWEI EQU 29H //由于上面所说之原因,所以一般尽量少用20H~2FH,留给位操作用。
SHI EQU 28H
XIAOSHU EQU 27H
TEMP_TL EQU 20H ;低温限值
TEMP_TH EQU 21H ;高温限值
TEMPH EQU 22H ;温度高字节
TEMPL EQU 23H ;温度低字节
TEMP EQU 24H
GREEN EQU P2.0
BLUE EQU P2.1
K1 EQU P1.1
K2 EQU P1.2
K3 EQU P1.3
k4 EQU P1.4
;===============================================
MAIN:
MOV TEMP_TH,#25
MOV TEMP_TL,#01
CLR K1 //可以使用一句“MOV P1, #00”替代这5句,简洁,节省空间
CLR K2
CLR K3
CLR K4
CLR P1.5
CLR DQ
CLR GREEN
CLR BLUE
ACALL WR_THL ;写入高温限值和低温限值寄存器
ACALL WR_PROM
ACALL RE_PROM ;从EEPROM中返回高温限值和低温限值
ACALL RESET ;初始化1820
JB FLAG,LOOP
ACALL ERROR ;报错
LOOP:
ACALL READ_T ;1820读取温度
ACALL TURN ;转换
ACALL DISP_TEMP ;数码管显示实时温度
ACALL KEYSCAN ;键盘设定高温限值和低温限值
ACALL WR_THL
ACALL WR_PROM
ACALL TEMP_COMP
JMP LOOP
;=============启动1820读取温度====================
READ_T:
SETB DQ
ACALL RESET
JB FLAG,READ_T1
RET
READ_T1:
MOV A,#0CCH
ACALL WR_1820
MOV A,#44H
ACALL WR_1820
ACALL RESET
MOV A,#0CCH
ACALL WR_1820
MOV A,#0BEH
ACALL WR_1820
ACALL READ_1820
RET
;=========把高温和低温限值写入寄存器=================
WR_THL:
JB FLAG,WR_HL //上电重启时,FLAG=0,所以一直不会跳转,另外,用按键设置温度上下限时,也要考虑这一点,是否应该按你的要求先允许写,写完后关闭(你是否想FLAG=0转移,应该用JNB)
RET
WR_HL: ACALL RESET
MOV A,#0CCH
ACALL WR_1820
MOV A,#4EH
ACALL WR_1820
MOV A,TEMP_TH
ACALL WR_1820
MOV A,TEMP_TL
ACALL WR_1820 //写完以后设置“FLAG”,禁止再写(按键设置时先解除)
RET
;==========把高温和低温限值写入EEPROM=================
WR_PROM:ACALL RESET
MOV A,#0CCH
ACALL WR_1820
MOV A,#48H
ACALL WR_1820
RET
;========把EEPROM的值返回到高温和低温限值寄存器========
RE_PROM:
ACALL RESET
MOV A,#0CCH
ACALL WR_1820
MOV A,#0B8H
ACALL WR_1820
RET
;===========初始化1820==================================
RESET:
SETB DQ
NOP
CLR DQ
MOV R5,#250
DJNZ R5,$
SETB DQ
NOP
MOV R5,#25H
RESET1: JNB DQ,FLAG1
DJNZ R5,RESET1
JMP NDQ
FLAG1: SETB FLAG
MOV R5,#100
DJNZ R5,$
SETB DQ
MOV R5,#100
DJNZ R5,$
JMP RETU
NDQ:
CLR FLAG
ACALL ERROR
RETU:
SETB DQ
RET
;=============1820写字节========================
WR_1820:
MOV R6,#8
CLR C
WR1:
CLR DQ
MOV R5,#7
DJNZ R5,$
RRC A
MOV DQ,C
MOV R5,#25
DJNZ R5,$
SETB DQ
NOP
NOP
DJNZ R6,WR1
SETB DQ
RET
;==============读取1820数据======================
READ_1820:
MOV R2,#4
MOV R1,#TEMPL
RE1:
MOV R6,#8
RE2:
SETB DQ
NOP
CLR DQ
CLR C
NOP
NOP
SETB DQ
MOV R5,#9
DJNZ R5,$
MOV C,DQ
MOV R5,#24
DJNZ R5,$
RRC A
DJNZ R6,RE2
MOV @R1,A
DEC R1
DJNZ R2,RE1
RET
;===========转换数据=============================
TURN:
MOV XIAOSHU,TEMPL ;保存TEMPL值,后面用于取低4位转换小数部分
MOV A,TEMPL
MOV C,16 ;22H的位寻址
RRC A
MOV C,17
RRC A
MOV C,18
RRC A
MOV C,19
RRC A
MOV TEMP,A
MOV A,XIAOSHU
ANL A,#00001111B
MOV XIAOSHU,A
RET
;========键盘扫描=============================
KEYSCAN:
JB K1, SET_H ;按下K1,设定高限值
KEYSCAN1:
JB K4, SET_L ;按下K4,设定低限值
RETUN:
ACALL WR_THL ;把高温限值和低温限值写入RAM
ACALL WR_PROM ;限值复制到EEPROM中
RET
;------------调高限值----------------------
SET_H:
MOV 60H,P1
ACALL DELAY20
KEY:
JNB K1,RETUN
MOV A,P1
CJNE A,60H,KEY1
JMP KEY
KEY1:
XRL A,60H
JB ACC.2,KEYHH
JB ACC.3,KEYHL
JB ACC.1,RETUN
KEYHH:
INC TEMP_TH ;按下K2,值加1
CPL P3.0
JMP SET_H
KEYHL:
DEC TEMP_TH ;按下K3,值减1
CPL P3.1
JMP SET_H
;-------------调低温限值------------------------------
SET_L:
MOV 61H,P1
ACALL DELAY20
KEY2:
JNB K4,RETUN
MOV A,P1
CJNE A,61H,KEY3
JMP KEY2
KEY3:
XRL A,61H
JB ACC.2,KEYLH
JB ACC.3,KEYLL
JB ACC.4,RETUN
KEYLH:
INC TEMP_TL ;按下K2,值加1
CPL P3.2
JMP SET_L
KEYLL:
DEC TEMP_TL ;按下K3,值减1
CPL P3.3
JMP SET_L
;==============温度比较======================================
TEMP_COMP:
CLR C
MOV A,TEMP_TH
SUBB A,TEMP
JC LEDBLUE
MOV A,TEMP
SUBB A,TEMP_TL
JC LEDGREEN
RET
LEDBLUE:
SETB BLUE
RET
LEDGREEN:
SETB GREEN
RET
;===============报错============================
ERROR:
SETB P1.5
RET
;=================数码显示======================
DISP_TEMP:
MOV LED,#0C8H
MOV A,TEMP
MOV B,#10
DIV AB
MOV SHI,A
MOV GEWEI,B
MOV DPTR,#SHUTAB
MOV A,SHI
MOVC A,@A+DPTR
SETB P2.6
MOV LED,A
ACALL DELAY20
CLR P2.6
MOV A,GEWEI
MOVC A,@A+DPTR
SETB P2.7
MOV LED,A
ACALL DELAY20
CLR P2.7
RET
SHUTAB: DB 0F9H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DELAY20:
MOV R5,#50
DLY:
MOV R6,#100
DJNZ R6,$
DJNZ R5,DLY
RET
END |