|
你的編程的思路太亂。
剛剛看了開頭一點(diǎn),你看看我紅色文字的部分,僅就你說(shuō)的設(shè)置問(wèn)題,其余的沒(méi)看。
DQ EQU P1.7 ;DS18B20控制口 //最好“EQU”改為“BIT”,防止出錯(cuò),還一目了然。
LED1 EQU P2.5
LED2 EQU P2.6
LED EQU P3
FLAG EQU 30H //你這樣定義的是字節(jié),不是“位”可你下面的程序顯示,你應(yīng)該是“位”。
//內(nèi)部數(shù)據(jù)存儲(chǔ)器20H~2FH單元是可“位操作”空間,你可以使用位地址,
//也可以使用“FLAG BIT 2AH.1” 這樣的地址和定義方法。
GEWEI EQU 29H //由于上面所說(shuō)之原因,所以一般盡量少用20H~2FH,留給位操作用。
SHI EQU 28H
XIAOSHU EQU 27H
TEMP_TL EQU 20H ;低溫限值
TEMP_TH EQU 21H ;高溫限值
TEMPH EQU 22H ;溫度高字節(jié)
TEMPL EQU 23H ;溫度低字節(jié)
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句,簡(jiǎn)潔,節(jié)省空間
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 ;報(bào)錯(cuò)
LOOP:
ACALL READ_T ;1820讀取溫度
ACALL TURN ;轉(zhuǎn)換
ACALL DISP_TEMP ;數(shù)碼管顯示實(shí)時(shí)溫度
ACALL KEYSCAN ;鍵盤設(shè)定高溫限值和低溫限值
ACALL WR_THL
ACALL WR_PROM
ACALL TEMP_COMP
JMP LOOP
;=============啟動(dòng)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 //上電重啟時(shí),F(xiàn)LAG=0,所以一直不會(huì)跳轉(zhuǎn),另外,用按鍵設(shè)置溫度上下限時(shí),也要考慮這一點(diǎn),是否應(yīng)該按你的要求先允許寫,寫完后關(guān)閉(你是否想FLAG=0轉(zhuǎn)移,應(yīng)該用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 //寫完以后設(shè)置“FLAG”,禁止再寫(按鍵設(shè)置時(shí)先解除)
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寫字節(jié)========================
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數(shù)據(jù)======================
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
;===========轉(zhuǎn)換數(shù)據(jù)=============================
TURN:
MOV XIAOSHU,TEMPL ;保存TEMPL值,后面用于取低4位轉(zhuǎn)換小數(shù)部分
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,設(shè)定高限值
KEYSCAN1:
JB K4, SET_L ;按下K4,設(shè)定低限值
RETUN:
ACALL WR_THL ;把高溫限值和低溫限值寫入RAM
ACALL WR_PROM ;限值復(fù)制到EEPROM中
RET
;------------調(diào)高限值----------------------
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
;-------------調(diào)低溫限值------------------------------
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
;===============報(bào)錯(cuò)============================
ERROR:
SETB P1.5
RET
;=================數(shù)碼顯示======================
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 |
|