本帖最后由 51黑黑黑 于 2016-3-3 00:58 編輯
(一) 數(shù)字溫度傳感器DSl8B20介紹
以下為 DS1820 的詳細(xì)特性 l 獨(dú)特的單線接口僅需一個(gè)端口引腳進(jìn)行通訊 l 簡(jiǎn)單的多點(diǎn)分布應(yīng)用 l 無需外部器件 l 可通過數(shù)據(jù)線供電 l 零待機(jī)功耗 l 測(cè)溫范圍-55~+125℃,以0.5℃遞增。華氏器件-67~+2570F,以0.90F 遞增 l 溫度以 9 位數(shù)字量讀出 l 溫度數(shù)字量轉(zhuǎn)換時(shí)間 200ms(典型值) l 用戶可定義的非易失性溫度報(bào)警設(shè)置 l 報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件 l 應(yīng)用包括溫度控制、工業(yè)系統(tǒng)、消費(fèi)品、溫度計(jì)或任何熱感測(cè)系統(tǒng)
由上表可見DS18B20適用電壓為3V~5V,有更寬的電壓適用范圍,DS18B20可以程序設(shè)定9~12 位的分辨率,精度為±0.5°C。可選更小的封裝方式。用戶設(shè)的分辨率和報(bào)警溫度可以存儲(chǔ)在EEPROM 中,掉電后依然保存。DS18B20的性能是新一代產(chǎn)品中最好的。 DS1822與DS18B20 軟件兼容,是DS18B20的簡(jiǎn)化版本。省略了存儲(chǔ)用戶定義報(bào)警溫度、分辨率參數(shù)的EEPROM,精度降低為±2°C,適用于對(duì)性能要求不高,成本控制嚴(yán)格的應(yīng)用,是經(jīng)濟(jì)型產(chǎn)品。 每只D51820都可以設(shè)置成兩種供電方式即數(shù)據(jù)總線供電方式和外部供電方式,采取數(shù)據(jù)總線供電方式可以節(jié)省一根導(dǎo)線但完成溫度測(cè)量的時(shí)間較長(zhǎng)。采取外部供電方式則多用一根導(dǎo)線但測(cè)量速度較快。 每只DSl8B20包括一個(gè)唯一的64位長(zhǎng)的序號(hào),該序號(hào)值存放在DSl8B20內(nèi)部的ROM(只讀存貯器)中。開始8位是產(chǎn)品類型編碼,接著的48位是每個(gè)器件唯一的序號(hào),最后8位是前面56位的CRC(循環(huán)冗余校驗(yàn))碼。因?yàn)槊恳粋(gè)DSl8B20在出廠時(shí)已經(jīng)給定了唯一的序號(hào),因此在同一條單線總線上可以連接多個(gè)DSl8B20。 DSl8B20的存儲(chǔ)器由9個(gè)字節(jié)組成,存儲(chǔ)器結(jié)構(gòu)示于下圖。存儲(chǔ)器有一個(gè)暫存SRAM和一個(gè)存儲(chǔ)高低報(bào)警觸發(fā)值TH和TL的非易失性電可擦除EEPROM組成。注意當(dāng)報(bào)警功能不使用時(shí),TH和TL寄存器可以被當(dāng)作普通寄存器使用。 DSl8B20的引腳如下圖l所示: (二)DSl8B20工作過程及時(shí)序
主機(jī)控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個(gè)步驟:初始化、ROM操作指令、存儲(chǔ)器操作指令。必須先啟動(dòng)DS18B20開始轉(zhuǎn)換,再讀出溫度轉(zhuǎn)換值。 1、初始化
單總線上的所有處理均從初始化開始。
2、ROM操作命令
總線主機(jī)檢測(cè)到DSl8B20的存在便可以發(fā)出ROM操作命令。

3、存儲(chǔ)器操作命令

4、時(shí)序
1)復(fù)位:對(duì)DS18B20操作之前,首先要將它復(fù)位。復(fù)位時(shí)序?yàn)椋?/font>
(1)主機(jī)將信號(hào)線置為低電平,時(shí)間為400~960μS。
(2)主機(jī)將信號(hào)線置為高電平,時(shí)間為15~60μS。
(3)DS18B20發(fā)出60~240μS 的低電平作為應(yīng)答信號(hào)。主機(jī)收到此信號(hào)后,才能對(duì)DS18B20作其它操作。

2)寫操作:主機(jī)將信號(hào)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。從信號(hào)線的下降沿開始,在15~60μS的時(shí)間內(nèi),DS18B20對(duì)信號(hào)線檢測(cè),如信號(hào)線為高電平,則寫1,如信號(hào)線為O,則寫0,從而完成了一個(gè)寫周期。在開始另一個(gè)寫周期前,必須有1μ S以上的 高電平恢復(fù)期。

3)讀操作:主機(jī)將信號(hào)線從高電平拉低至低電平1μ S以上,再使數(shù)據(jù)線升為高電平,產(chǎn)生讀起始信號(hào)。從主機(jī)將信號(hào)線從高電平拉低至低電平起15~60μS的時(shí)間內(nèi),DS18B20將數(shù)據(jù)放到信號(hào)線上,供主機(jī)讀取。從而完成了一個(gè)讀周期。在開始另一個(gè)讀周期前,必須有1μ S以上的高電平恢復(fù)期。

(三)溫度與數(shù)據(jù)關(guān)系
DS18B20在出廠時(shí)配置為12位溫度數(shù)據(jù),讀取溫度時(shí)共讀取16位,16位數(shù)字?jǐn)[放是從低位到高位,存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,二進(jìn)制數(shù)中的前面5位是符號(hào)位,如果測(cè)得的溫度大于0,這5位為0,此時(shí)把溫度高字節(jié)的低3位與溫度低字節(jié)的高4位合并成一個(gè)字節(jié)再轉(zhuǎn)成十進(jìn)制數(shù)是溫度的整數(shù)部分。溫度低字節(jié)的低4位乘以0.0625或除以16所測(cè)的溫度的小數(shù)部分。如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1,然后再把溫度高字節(jié)的低3位與溫度低字節(jié)的高4位合并成一個(gè)字節(jié)再轉(zhuǎn)成十進(jìn)制數(shù)就是溫度的整數(shù)部分。溫度低字節(jié)的低4位乘以0.0625或除以16所測(cè)的溫度的小數(shù)部分。 (四)DS18B20中的低溫觸發(fā)器TL、高溫觸發(fā)器TH,用于設(shè)置低溫、高溫的報(bào)警數(shù)值。DS18B20完成一個(gè)周期的溫度測(cè)量后,將測(cè)得的溫度值和TL、TH相比較,如果小于TL,或大于TH,則表示溫度越限,將該器件內(nèi)的告警標(biāo)志位置位,并對(duì)主機(jī)發(fā)出的告警搜索命令作出響應(yīng)。需要修改上、下限溫度值時(shí),只需使用一個(gè)功能命令即可對(duì)TL、TH寫入,十分方便。 (五)具體操作舉例: 現(xiàn)在我們要做的是讓DS18B20進(jìn)行一次溫度的轉(zhuǎn)換,那具體的操作就是: 1、主機(jī)先作個(gè)復(fù)位操作, 2、主機(jī)再寫跳過ROM的操作(CCH)命令, 3、然后主機(jī)接著寫個(gè)轉(zhuǎn)換溫度的操作命令,后面釋放總線至少一秒,讓DS18B20完成轉(zhuǎn)換的操作。在這里要注意的是每個(gè)命令字節(jié)在寫的時(shí)候都是低字節(jié)先寫,例如CCH的二進(jìn)制為11001100,在寫到總線上時(shí)要從低位開始寫,寫的順序是“零、零、壹、壹、零、零、壹、壹”。整個(gè)操作的總線狀態(tài)如下圖。 
讀取RAM內(nèi)的溫度數(shù)據(jù)。同樣,這個(gè)操作也要接照三個(gè)步驟。 1、主機(jī)發(fā)出復(fù)位操作并接收DS18B20的應(yīng)答(存在)脈沖。 2、主機(jī)發(fā)出跳過對(duì)ROM操作的命令(CCH)。 3、主機(jī)發(fā)出讀取RAM的命令(BEH),隨后主機(jī)依次讀取DS18B20發(fā)出的從第0一第8,共九個(gè)字節(jié)的數(shù)據(jù)。如果只想讀取溫度數(shù)據(jù),那在讀完第0和第1個(gè)數(shù)據(jù)后就不再理會(huì)后面DS18B20發(fā)出的數(shù)據(jù)即可。同樣讀取數(shù)據(jù)也是低位在前的。整個(gè)操作的總線狀態(tài)如下圖: (六)單片機(jī)程序代碼 ;采用stc11f04e單片機(jī),晶振3.6864MHZ,通訊速率9600,30H,32H存放溫度值的高字節(jié),31H,33H存放溫度值的低字節(jié)
;34H用于保存溫度的小數(shù)部分;35H用于保存整數(shù)部分;36H用于保存溫度;38H39H用于保存小數(shù)部分,20H.1保存正負(fù)溫度標(biāo)志
ORG 0000H
AJMP MAIN;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
RETI
ORG 000BH;中斷陷阱
;LJMP CT
RETI
ORG 0013H;中斷陷阱
RETI
ORG 0023H
;LJMP S
TPH DATA30H ;存放溫度值的高字節(jié)
TPL DATA31H ;存放溫度值的低字節(jié)
XS EQU 34H;用于保存溫度的小數(shù)部分
ZS EQU 35H;用于保存整數(shù)部分
P1M0 DATA 92H
P1M1 DATA 91H
DQ EQU P3.5;DS18B20的數(shù)據(jù)口位
WDT_CONTR EQU 0C1H
AUX EQU 0A2H ;P3.0RXD-P3.1TXD TO P1.6RXD-P1.7TXD
FLAG_1 EQU 20H.1 ;接收到下行串口發(fā)來數(shù)據(jù)標(biāo)志p1.6
MAIN: MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FFH;預(yù)置初值(按照波特率9600BPS預(yù)置初值) 24M=9600=F3 3.6864=FF=9600, 1200=f8
MOV TL1,#0FFH;預(yù)置初值(按照波特率9600BPS預(yù)置初值) 13.56=9600倍頻=F9
MOV TH0,#88H ;8800=12t,7000=stc1t
MOV TL0, #00H
ORL IE, #92H ;EA=1,ES=1;ET0=1
SETBPS ;串口中斷優(yōu)先
SETBTR1 ;啟動(dòng)定時(shí)器1
MOVP1M0,#01000000b ; P1M0=0 P1M1=0雙向口 P1M0=1 P1M1=0輸入口 P1M0=0 P1M1=1推挽輸出20ma
MOV P1M1,#10000000b
MOV WDT_CONTR ,#27H;;;;;;看門狗設(shè)置使能
CPL P3.2
QL: MOV A,#00H
MOV R2,#58 ;清數(shù)據(jù)區(qū);;
MOV R0,#20H
QRAM: MOV @R0, A
INC R0
DJNZ R2, QRAM
; MOV WDT_CONTR ,#17H;喂狗
QW: CALL DELAY1
CALL DELAY1
CALL DELAY1
CALL DELAY1
;JNB FLAG_1,QQ
LCALL DS18B20
CALL FZJ
CLR FLAG_1
QQ: CPL P3.2
CALL DELAY1
CALL DELAY1
CALLDELAY1
CALL DELAY1
AJMP QL
DS18B20: ;CLR EA;
CALLDS18B20_Reset ;設(shè)備復(fù)位
MOVA,#0CCH ;跳過ROM命令
CALL DS18B20_WriteByte ;送出命令
MOVA,#044H ;開始轉(zhuǎn)換 溫度轉(zhuǎn)換 44H啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換
CALL DS18B20_WriteByte ;送出命令
DELAY: ; MOV WDT_CONTR ,#17H;喂狗
JNBDQ,DELAY ;等待轉(zhuǎn)換完成
CALLDS18B20_Reset ;設(shè)備復(fù)位
MOVA,#0CCH ;跳過ROM命令
CALL DS18B20_WriteByte ;送出命令
MOVA,#0BEH ;讀暫存存儲(chǔ)器讀暫存器BEH讀暫存器9個(gè)字節(jié)內(nèi)容
CALLDS18B20_WriteByte ;送出命令
CALL DS18B20_ReadByte ;讀溫度低字節(jié)
MOVTPL,A ;存儲(chǔ)數(shù)據(jù)
CALL DS18B20_ReadByte ;讀溫度高字節(jié)
MOVTPH,A ;存儲(chǔ)數(shù)據(jù)
MOV A,TPH;30H
RLC A
MOV20H.1,c ;保存正負(fù)溫度標(biāo)志
JNCZH ;最高位是0為零上溫度轉(zhuǎn)ZH
;最高位是1為零下溫度取反加1
MOVA,TPH;30H ;例如溫度是-54.875度,源碼=11001001 001XXXXX 例如溫度72.75,30h=48h,31h=40h,加在一起是01001000(=30H)010xxxxx=(31H)
CPLA ;00110110=(30H)
MOV32H,A ;高位取反
MOVA,TPL;31H ;低位取反110XXXXX
CPLA ;110XXXXXX=(31H)
MOV33H,A ;保存高2位到(32h)=01H,最后轉(zhuǎn)換成242H=578d,578*0.125=72.75
MOVA,#01H ;10110111=B7
ADD A,33H
MOV 33H,A
CLR A
ADDCA,32H ;例如溫度是-54.875度=-439*.125,補(bǔ)碼649h,-649h=1110 0100 1001
MOV32H,A ;結(jié)果是32h=01,33h=b7,合并成1b7h取反=00110110110,加1=00110110111為正碼1b7h=439,39*.125=54.875
AJMP LS
ZH: MOV A,TPH;30H
MOV32H,A ;保存高2位到(32h)=02H,最后轉(zhuǎn)換成242H=578d,578*0.125=72.75
MOV A,TPL
MOV33H,A ;保存到33h=01000010=42H
LS: MOV A,TPL
ANL A,#0FH ;存放溫度的低字節(jié)的低四位決定小數(shù)部分
MOV XS,A ;獲得小數(shù)部分34H
MOV A,TPL
ANL A,#0F0H
SWAP A
MOVZS,A ;35H存放溫度的低字節(jié)的高四位
MOV A,TPH ;獲取存放溫度的高字節(jié)的低三位
ANL A,#07H
SWAPA
ORLA,ZS ;存放溫度的低字節(jié)的高四位合并存放溫度的高字節(jié)的低三位決定整數(shù)部分
MOV ZS,A
MOV B,#100;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOV A,#10 ;余數(shù)繼續(xù)分離十位和個(gè)位
XCH A,B
DIV AB
SWAP A
ORL A,B ;十位和個(gè)位拼裝成BCD碼
MOV 36H,A
MOV A,XS
MOV R0,#37H
MOVR2,#4
D0: MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV A,B
DJNZ R2,D0
MOV R0,#37H
MOV A,@R0
INC R0
SWAP A
ORL A,@R0
MOV 37H,A
INC R0
MOV A,@R0
INC R0
SWAP A
ORL A,@R0
MOV 38H,A
MOV 39H,#0AAH
RET ;20H.1保存正負(fù)溫度標(biāo)志
;**************************************
;延時(shí)X微秒(STC11f04e@3.6864M)
;不同的工作環(huán)境,需要調(diào)整此函數(shù)
;入口參數(shù):R7
;出口參數(shù):無DS18B20在出廠時(shí)以配置為12位,讀取溫度時(shí)共讀取16位,所以把溫度高字節(jié)的低3位與溫度低字節(jié)的高4位合并成一個(gè)字節(jié)再轉(zhuǎn)成十進(jìn)制數(shù)是溫度的整數(shù)部分。
;溫度低字節(jié)的低4位乘以0.0625或除以16所測(cè)的溫度的小數(shù)部分。
;還需要判斷正負(fù)。前5個(gè)數(shù)字為符號(hào)位,當(dāng)前5位為1時(shí),讀取的溫度為負(fù)數(shù);當(dāng)前5位為0時(shí),讀取的溫度為正數(shù)。
;**************************************
DelayXus: ;6 此延時(shí)函數(shù)是使用1T的指令周期進(jìn)行計(jì)算,與傳統(tǒng)的12T的MCU不同
NOP ;1
DJNZR7,DelayXus ;4
RET ;4
;DelayXus1: MOVR6,#255 ;6 此延時(shí)函數(shù)是使用1T的指令周期進(jìn)行計(jì)算,與傳統(tǒng)的12T的MCU不同 6.7584=22/3.255
;DelayXus2: CALL DelayXus
; DJNZR6,DelayXus2 ;4
; RET ;4
;**************************************
;復(fù)位DS18B20,并檢測(cè)設(shè)備是否存在
;入口參數(shù):無
;出口參數(shù):無
;**************************************
DS18B20_Reset:MOV WDT_CONTR,#37H;喂狗
CLRDQ ;送出低電平復(fù)位信號(hào)
MOVR7,#240 ;延時(shí)至少480us
CALL DelayXus
MOV R7,#240
CALL DelayXus
SETBDQ ;釋放數(shù)據(jù)線
MOVR7,#60 ;等待60us
CALL DelayXus
MOV C,DQ ;檢測(cè)存在脈沖
MOVR7,#240 ;等待設(shè)備釋放數(shù)據(jù)線
CALL DelayXus
MOV R7,#180
CALL DelayXus
JCDS18B20_Reset ;如果設(shè)備不存在,則繼續(xù)等待
RET
;**************************************
;從DS18B20讀1字節(jié)數(shù)據(jù)
;入口參數(shù):無
;出口參數(shù):ACC
;**************************************
DS18B20_ReadByte:
CLR A
PUSH 0
MOV0,#8 ;8位計(jì)數(shù)器
ReadNext:
CLRDQ ;開始時(shí)間片
MOVR7,#1 ;延時(shí)等待
CALL DelayXus
SETBDQ ;準(zhǔn)備接收
MOV R7,#1
CALL DelayXus
MOVC,DQ ;讀取數(shù)據(jù)
RRC A
MOVR7,#60 ;等待時(shí)間片結(jié)束
CALL DelayXus
DJNZ 0,ReadNext
POP 0
RET
;**************************************
;向DS18B20寫1字節(jié)數(shù)據(jù)
;入口參數(shù):ACC
;出口參數(shù):無
;**************************************
DS18B20_WriteByte:
PUSH 0
MOV0,#8 ;8位計(jì)數(shù)器
WriteNext:
CLRDQ ;開始時(shí)間片
MOVR7,#1 ;延時(shí)等待
CALL DelayXus
RRCA ;輸出數(shù)據(jù)
MOV DQ,C
MOVR7,#60 ;等待時(shí)間片結(jié)束
CALL DelayXus
SETBDQ ;準(zhǔn)備送出下一位數(shù)據(jù)
MOV R7,#1
CALL DelayXus
DJNZ 0,WriteNext
POP 0
RET
FZJ: MOVR0,#30H ;向主機(jī)發(fā)送35h單元開始的8個(gè)定時(shí)器時(shí)鐘數(shù)據(jù)子程序 1B60000000600000
FZJ0: MOV R2,#0AH
FZJ1: CLR EA
ANLAUX,#07FH ;p3.0p3.1當(dāng)串口
FZL1: MOV A, @R0
MOV SBUF, A
JNB TI, $
CLR TI
INC R0
DJNZ R2,FZL1
SETB EA
RET
DELAY2: MOV R5, #0FFH
DEL: MOV WDT_CONTR ,#17H;喂狗
DJNZ R5, DEL
RET
DELAY1: MOV R6, #0FFH
DELA: ACALL DELAY2
DJNZ R6, DELA
RET
END
帶溫度顯示的LED電子表
下面的例子是利用18B20制作一個(gè)簡(jiǎn)單的帶溫度顯示的LED電子表,電路原理圖和顯示結(jié)果如下圖所示,晶體振蕩器采用7.3128Mhz,如果用其它頻率的晶體,需要改變延遲子程序DelayXus,其它程序結(jié)構(gòu)不變,利用單片機(jī)的定時(shí)器0定時(shí)功能構(gòu)成電子表,每天有9秒的誤差,可以通過調(diào)整達(dá)到每月誤差不到1秒,因?yàn)楸緳C(jī)非常省電,可以長(zhǎng)期帶電運(yùn)行,如遇停電,需要重新調(diào)整時(shí)鐘,有2個(gè)按鍵分別調(diào)整時(shí)和分,調(diào)整比較方便,所以就不加時(shí)鐘模塊了,實(shí)驗(yàn)證明與魚缸溫度計(jì)比較18B20數(shù)字溫度計(jì)還是比較準(zhǔn)確的。下面給出了源程序代碼,因?yàn)樽⑨尩谋容^詳細(xì),很容易看的懂。程序主要由初始化模塊、定時(shí)器模塊、溫度采集模塊組成。內(nèi)存使用情況是2FH,2EH溫度整數(shù)位顯示區(qū),2DH,2CH是溫度小數(shù)位顯示區(qū),36H,35H是小時(shí)顯示區(qū),34H,33H分鐘顯示區(qū),每隔5秒鐘左右交替顯示時(shí)鐘和溫度。25H單元是10毫秒存儲(chǔ)區(qū),夠100毫秒30H加1,31H是秒個(gè)位存儲(chǔ),32H是秒十位存儲(chǔ)。P1.4是米字型數(shù)碼管控制端,當(dāng)p1.4=0為低電平(反相后為高)時(shí),p1.6=1,(反相后為低)中間橫條顯示,P1.6 是米字型數(shù)碼管共陰極com選通控制端,P1.7數(shù)碼管小數(shù)點(diǎn)選通控制。


;程序源代碼如下:
ORG0000H
AJMP L00 ;電子表程序20151215通過 ORG 000BH ; AJMP CT RETI
ORG 001BH
RETI
ORG 0023H
TPH DATA28H ;存放溫度值的高字節(jié)
TPL DATA29H ;存放溫度值的低字節(jié)
XS EQU26H ;用于保存溫度的小數(shù)部分
ZS EQU27H ;用于保存整數(shù)部分
XT EQUP3.6 ;MC14513選通
DQ EQUP3.7 ;DS18B20的數(shù)據(jù)口位
FLAG1 EQU 20H.0
ORG 0030H;初始化子程序
L00: MOV SP,#68H ;設(shè)堆棧指針
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FFH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)
MOV TL1,#0FFH;預(yù)置初值(按照波特率9600BPS預(yù)置初值)
MOV TH0,#0E6H ;7.3128= 11F4H ,方式1,16位定時(shí)
MOV TL0, #3EH
ORL IE, #92H ;EA=1,ES=1;ET0=1
SETBPS ;串口中斷優(yōu)先
QL0: MOV A,#00H
MOV R0,#10H
MOV R2,#60H ;10-ABH清零
CLEAR: MOV @R0,A
INC R0
DJNZ R2,CLEAR
MOV 36H,#01H
MOV 35H,#02H
MOV 34H,#03H
MOV 33H,#00H
CLR FLAG1
;顯示子程序和時(shí)鐘調(diào)整子程序
DIS:SETB EA ;開AT89C51中斷
SETB ET0 ;允許AT89C51的TIME0中斷
SETB TR0 ;T0開始計(jì)數(shù)
MOVA,31H ;31H十秒加1?30h是每秒加1
XRL A,#09h
JNZ DIS0
CALL DS18B20;
DIS0: JNB P3.5,DIS4 ;為低再看秒十位單元是否為0
CLR TR0 ;校驗(yàn)表程序,調(diào)整分
MOVA,30H ;31H十秒加1?30h是每秒加1
JNZDIS6 ;秒位=0,自動(dòng)小時(shí)加1
JB FLAG1,DIS6
DIS5: MOV R0,#35H ;校驗(yàn)表程序,調(diào)整小時(shí)
SETB FLAG1
ACALL GIA2
MOV R0, #36H
MOV A, @R0
DEC R0
SWAP A
ADD A, @R0
MOV 2DH, A
CJNE A, #24H, DIS6
CLR A
MOV 35H, A
MOV 36H, A
AJMP DIS6
DIS4: JNBP3.1 ,DIS6
CLR TR0 ;校驗(yàn)表程序調(diào)整分
MOVA,30H ;31H十秒加1?30h是每秒加1
JNZDIS6 ;秒位=0,自動(dòng)小時(shí)加1
MOV 31H, #00H
MOV 32H, #00H
DIS7: MOV R0, #33H
JBFLAG1,DIS6 ;
SETB FLAG1
ACALL GIA2
MOV R0, #34H
MOV A, @R0
DEC R0
SWAP A
ADD A, @R0
MOV 2DH, A
CJNE A, #60H, DIS6
CLR A
MOV 33H, A
MOV 34H, A
DIS6: MOV R2,#01H ;R2是位選信號(hào)01-04移位 顯示子程序顯示33h-36h單元數(shù)值
MOV A,31H
SUBBA,#05H ;6789秒顯示時(shí)間,012345秒顯示溫度
JC DIS9
MOV R1,#33H ;顯示時(shí)間的起始地址33h-36h
AJMP DIS8
DIS9: MOV R1,#2CH ;顯示溫度的起始地址2ch-2fh
DIS8: SETB TR0
DIS1: MOVA,@R1
MOVP0,A ;送數(shù)據(jù)
SETB XT ;控制MC14513LE ,當(dāng)BI,LT為1 ,LE上升沿鎖存輸出,高電平時(shí)不變
MOVA,R2 ;
MOV P1,A ;P0.0-P0.3控制4段數(shù)碼管共陰極導(dǎo)通,為1反相后為0,數(shù)碼管導(dǎo)通
INC R1
MOV A,R2
RL A
MOV R2,A
MOV A,R2 ;第2位小數(shù)點(diǎn)閃動(dòng)
JNB 0E3H,DIS3 ;第2位小數(shù)點(diǎn)閃動(dòng)E3
MOV A,30H
JNZ DIS3
CPLP1.7 ;每秒小數(shù)點(diǎn)閃動(dòng)一次,(CPLP1.7)
DIS10: MOV C,20H.7
SETBp1.6 ;SETBP1.6;經(jīng)2003反相后變成低電平,米字型數(shù)碼管選通
JC DIS2
SETBP1.4 ;十字不亮
AJMP DIS3
DIS2: CLRp1.4 ;豎線不亮,其它一秒一閃
DIS3: LCALLDELAY ;位掃描
CLRXT ;
JB 0E4H, J6
AJMP DIS1
J6: AJMP DIS
;定時(shí)器中斷子程序
CT: MOV TH0,#0E8H ;7.3128= 11F4H ,方式1,16位定時(shí)E832=10MS E63E)
MOV TL0,#08H ;0FFC慢,1000快E810快 E7F0慢 E807慢
PUSH 0D0H
PUSH 0E0H
PUSH 82H
PUSH 83H
MOV A,25H ;
INC A
MOV 25H, A
CJNE A, #0AH,DONE ;0fff=0a,e63e=64
MOV 25H, #00H
MOV A,30H ;
INC A
MOV 30H, A
CJNE A, #0AH,DONE ;
MOV 30H, #00H
MOV A, 31H;5H
INC A ;秒個(gè)位加1
CLRFLAG1 ;31H十秒加1?30h是每秒加1
MOV 31H,A ;5
CJNE A, #0AH, DONE
; CPLFLAG2 ;31H十秒加1?30h是每秒加1
MOV 31H, #00H ;5
MOV A, 32H;4H
INC A ;秒十位加1
MOV 32H,A ;4
CJNE A, #06H,DONE
MOV 32H, #00H ;4
MOV A, 33H
INC A ;分位加1
MOV 33H, A
CJNE A, #0AH,DONE
MOV 33H, #00H
MOV A, 34H;2H
INC A ;分十位加1
MOV 34H, A ;4
CJNE A, #06H,DONE
MOV 34H, #00H ;4
MOV R0,#35H ;1
ACALL GIA1
MOV R0, #36H
MOV A, @R0
DEC R0
SWAP A
ADD A, @R0
MOV 2DH, A
CJNE A, #24H, DONE
CLR A
MOV 35H, A
MOV 36H, A
MOVA,30H ; 1/10秒單元加7,補(bǔ)償慢9秒
ADD A,#07H
MOV 30H,A
MOVA,31H ;秒單元加9,補(bǔ)償慢9秒
ADD A,#09H
MOV 31H,A
; AJMP X
DONE: NOP
POP 83H
POP 82H
POP 0E0H
POP 0D0H
RETI
GIA1: MOV R1, #04H
GIA2: MOV A, @R0
GIA: INC A
MOV @R0, A
CJNE A, #0AH, GIA3
CLR A
MOV @R0, A
INC R0
DJNZ R1, GIA2
GIA3: RET
ORG 0712H
DELAY: MOV R5, #66H;88H
DEL: NOP
DJNZ R5, DEL
RET
;溫度采集子程序
DS18B20: ;CLR EA;
CALLDS18B20_Reset ;設(shè)備復(fù)位
MOVA,#0CCH ;跳過ROM命令
CALL DS18B20_WriteByte ;送出命令
MOVA,#044H ;開始轉(zhuǎn)換 溫度轉(zhuǎn)換 44H 啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換
CALL DS18B20_WriteByte ;送出命令
JNBDQ,DELAY ;等待轉(zhuǎn)換完成
CALLDS18B20_Reset ;設(shè)備復(fù)位
MOVA,#0CCH ;跳過ROM命令
CALL DS18B20_WriteByte ;送出命令
MOVA,#0BEH ;讀暫存存儲(chǔ)器讀暫存器 BEH 讀暫存器9個(gè)字節(jié)內(nèi)容
CALL DS18B20_WriteByte ;送出命令
CALL DS18B20_ReadByte ;讀溫度低字節(jié)
MOVTPL,A ;存儲(chǔ)數(shù)據(jù)
CALL DS18B20_ReadByte ;讀溫度高字節(jié)
MOVTPH,A ;存儲(chǔ)數(shù)據(jù)
MOV A,TPH;30H
RLC A
MOV20H.7,c ;保存正負(fù)溫度標(biāo)志
JNCZH ;最高位是0為零上溫度轉(zhuǎn)ZH
;最高位是1為零下溫度取反加1
MOVA,TPH;28H ;例如溫度是-54.875度,源碼=1100 1001 001XXXXX 例如溫度72.75,30h=48h,31h=40h,加在一起是01001000(=30H) 010xxxxx=(31H)
CPLA ;00110110=(30H)
MOV2AH,A ;高位取反
MOVA,TPL;29H ;低位取反110XXXXX
CPLA ;110XXXXXX=(31H)
MOV2BH,A ;保存高2位到(32h)=01H ,最后轉(zhuǎn)換成242H=578d,578*0.125=72.75
MOVA,#01H ;10110111=B7
ADD A,2BH
MOV 2BH,A
CLR A
ADDCA,2AH ;例如溫度是-54.875度=-439*.125,補(bǔ)碼649h,-649h=1 110 0100 1001
MOV2AH,A ;結(jié)果是32h=01,33h=b7,合并成1b7h 取反=00110110110,加1=00110110111為正碼1b7h=439,39*.125=54.875
AJMP LS
ZH: MOV A,TPH;30H
MOV2AH,A ;保存高2位到(32h)=02H ,最后轉(zhuǎn)換成242H=578d,578*0.125=72.75
MOV A,TPL
MOV2BH,A ;保存到33h=01000010=42H
LS: MOV A,2BH;TPL
ANL A,#0FH ;存放溫度的低字節(jié)的低四位決定小數(shù)部分
MOV XS,A ;獲得小數(shù)部分34H
MOV A,2BH;TPL
ANL A,#0F0H
SWAP A
MOVZS,A ;35H存放溫度的低字節(jié)的高四位
MOV A,2AH;TPH ;獲取存放溫度的高字節(jié)的低三位
ANL A,#07H
SWAPA
ORLA,ZS ;存放溫度的低字節(jié)的高四位合并存放溫度的高字節(jié)的低三位決定整數(shù)部分
MOV ZS,A
MOV B,#100;分離出百位,存放在R3中
DIV AB
MOV R3,A
MOVA,#10 ;余數(shù)繼續(xù)分離十位和個(gè)位
XCH A,B
DIV AB
; SWAP A
; ORL A,B ;十位和個(gè)位拼裝成BCD碼
MOV 2FH,A
MOV A,B
MOV 2EH,A
MOV A,XS
MOV R0,#37H
MOV R2,#4
D0: MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV A,B
DJNZ R2,D0
MOV 2DH,37H
MOV 2CH,38H
RET ;20H.7保存正負(fù)溫度標(biāo)志
DelayXus: NOP ;6微秒
DJNZR7,DelayXus ;
RET ;
;**************************************
;復(fù)位DS18B20,并檢測(cè)設(shè)備是否存在
;入口參數(shù):無
;出口參數(shù):無
;**************************************
DS18B20_Reset:;MOV WDT_CONTR ,#37H;喂狗
CLRDQ ;送出低電平復(fù)位信號(hào)
MOVR7,#40;240 ;延時(shí)至少480us
CALL DelayXus
MOV R7,#40;240
CALL DelayXus
SETB DQ ;釋放數(shù)據(jù)線
MOVR7,#10;60 ;等待60us
CALL DelayXus
MOVC,DQ ;檢測(cè)存在脈沖
MOVR7,#40;240 ;等待設(shè)備釋放數(shù)據(jù)線
CALL DelayXus
MOVR7,#30;180
CALL DelayXus
JCDS18B20_Reset ;如果設(shè)備不存在,則繼續(xù)等待
RET
;**************************************
;從DS18B20讀1字節(jié)數(shù)據(jù)
;入口參數(shù):無
;出口參數(shù):ACC
;**************************************
DS18B20_ReadByte:
CLR A
PUSH 0
MOV0,#8 ;8位計(jì)數(shù)器
ReadNext:
CLRDQ ;開始時(shí)間片
MOVR7,#1 ;延時(shí)等待
NOP;CALL DelayXus
SETBDQ ;準(zhǔn)備接收
MOV R7,#1
NOP; CALL DelayXus
MOVC,DQ ;讀取數(shù)據(jù)
RRC A
MOVR7,#10;60 ;等待時(shí)間片結(jié)束
CALL DelayXus
DJNZ0,ReadNext
POP 0
RET
;**************************************
;向DS18B20寫1字節(jié)數(shù)據(jù)
;入口參數(shù):ACC
;出口參數(shù):無
;**************************************
DS18B20_WriteByte:
PUSH 0
MOV 0,#8 ;8位計(jì)數(shù)器
WriteNext:
CLRDQ ;開始時(shí)間片
MOVR7,#1 ;延時(shí)等待
NOP;CALL DelayXus
RRCA ;輸出數(shù)據(jù)
MOV DQ,C
MOVR7,#10;60 ;等待時(shí)間片結(jié)束
CALL DelayXus
SETBDQ ;準(zhǔn)備送出下一位數(shù)據(jù)
MOV R7,#1
NOP; CALL DelayXus
DJNZ 0,WriteNext
POP 0
RET
END
|