亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6647|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

DS18B20數(shù)字溫度傳感器應(yīng)用-帶溫度顯示的LED電子表

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-24 18:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 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初始化
單總線上的所有處理均從初始化開始。
2ROM操作命令
總線主機(jī)檢測(cè)到DSl8B20的存在便可以發(fā)出ROM操作命令。


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


4時(shí)序

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

2)寫操作:主機(jī)將信號(hào)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。從信號(hào)線的下降沿開始,在1560μ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)線從高電平拉低至低電平起1560μ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,30H32H存放溫度值的高字節(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.2INT0入口地址
                      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.SM0SM1SM2REN,TB8RB8TI,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=1ES=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=578d578*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=0133h=b7,合并成1b7h取反=00110110110,加1=00110110111為正碼1b7h=43939*.125=54.875
                      AJMP LS

ZH:                   MOV A,TPH;30H
                      MOV32H,A       ;保存高2位到(32h)=02H,最后轉(zhuǎn)換成242H=578d578*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)的12TMCU不同
   NOP                    ;1
   DJNZR7,DelayXus       ;4
   RET                    ;4
;DelayXus1: MOVR6,#255                 ;6 此延時(shí)函數(shù)是使用1T的指令周期進(jìn)行計(jì)算,與傳統(tǒng)的12TMCU不同 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

;**************************************
;DS18B201字節(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

;**************************************
;DS18B201字節(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毫秒30H131H是秒個(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.SM0SM1SM2REN,TB8RB8TI,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  ,方式116位定時(shí)
            MOV TL0, #3EH
          ORL IE, #92H  ;EA=1ES=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                    ;允許AT89C51TIME0中斷
       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,LT1 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  ,方式116位定時(shí)E832=10MS   E63E
     MOV  TL0,#08H    ;0FFC慢,1000E810  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=578d578*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=0133h=b7,合并成1b7h 取反=00110110110,加1=00110110111為正碼1b7h=43939*.125=54.875
                      AJMP LS

ZH:                   MOV A,TPH;30H
                      MOV2AH,A       ;保存高2位到(32h)=02H ,最后轉(zhuǎn)換成242H=578d578*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

;**************************************
;DS18B201字節(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

;**************************************
;DS18B201字節(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
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:108998 發(fā)表于 2016-3-15 14:08 | 只看該作者
謝謝樓主分享  學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:497598 發(fā)表于 2019-6-23 19:08 | 只看該作者
有沒有c語(yǔ)言的啊😂
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表