欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)DS18B20智能溫度控制器設(shè)計(jì)-匯編語言源程序帶詳細(xì)注釋 [打印本頁]

作者: jfidovid    時(shí)間: 2019-9-13 14:32
標(biāo)題: 單片機(jī)DS18B20智能溫度控制器設(shè)計(jì)-匯編語言源程序帶詳細(xì)注釋

以前做了一個(gè)設(shè)計(jì),抽到的題目是智能溫度控制器,要求是匯編語言實(shí)現(xiàn),
并且要在開發(fā)板上進(jìn)行實(shí)物驗(yàn)證。
(本代碼已在實(shí)驗(yàn)室驗(yàn)證,一定可行)
具體程序代碼、內(nèi)容、要求等都在word里面。
該系統(tǒng)在超過設(shè)定的溫度上限或者低于其下限的時(shí)候會(huì)亮燈報(bào)警。
此設(shè)計(jì)為原創(chuàng)設(shè)計(jì)。
仿真圖如圖所示。
希望大家多多鼓勵(lì)。謝謝。

設(shè)計(jì)任務(wù): 采用DS18B20溫度傳感器和AT89S52單片機(jī)及顯示電路完成環(huán)境溫度的實(shí)時(shí)顯示。
⒈ 數(shù)字溫度計(jì)的總體方案設(shè)計(jì)
⑴系統(tǒng)總體結(jié)構(gòu)
數(shù)字溫度計(jì)的系統(tǒng)框圖。
⑵芯片選擇
⑶DS18B20主要性能指標(biāo)
⒉硬件電路設(shè)計(jì)
⑴AT89S52單片機(jī)最小系統(tǒng)
⑵DS18B20與AT89S52單片機(jī)接口電路設(shè)計(jì)
⑶顯示電路與AT89S52單片機(jī)接口電路設(shè)計(jì)
⒊軟件設(shè)計(jì)
⑴主程序框圖
⑵DS18B20溫度采集程序框圖
⑶顯示程序框圖
⒋調(diào)試與測(cè)試結(jié)果分析
⑴實(shí)驗(yàn)系統(tǒng)連線圖
⑵程序調(diào)試
⑶實(shí)驗(yàn)結(jié)果分析
⒌程序清單和系統(tǒng)原理圖


附錄:?jiǎn)纹瑱C(jī)程序及設(shè)計(jì)電路(有比較詳細(xì)的中文注釋)
DQ     BIT        P1.0               ;DS18B20數(shù)據(jù)位   
FLAG1  BIT        00H                   ;DS18B20是否存在的標(biāo)志位        
SIGN      BIT        01H                   ;符號(hào)位      
MSB       EQU        30H               ;轉(zhuǎn)換數(shù)據(jù)高位字節(jié)   
LSB    EQU        31H                   ;轉(zhuǎn)換數(shù)據(jù)低位字節(jié)
INTEG    EQU        32H               ;轉(zhuǎn)換數(shù)據(jù)整數(shù)部分   
DECIM    EQU        33H               ;轉(zhuǎn)換數(shù)據(jù)小數(shù)部分
SEG_S    EQU        34H               ;符號(hào)位段碼
SEG_I3    EQU        35H               ;整數(shù)部分的百位段碼
SEG_I2    EQU        36H               ;整數(shù)部分的十位段碼
SEG_I1    EQU        37H               ;整數(shù)部分的個(gè)位段碼
SEG_D1    EQU        38H               ;小數(shù)部分的段碼
            ORG    0000H
MAIN:        CLR P1.1               ;正常運(yùn)行指示燈亮
            LCALL    INIT_1820      ;DS18B20初始化
            LCALL    GET_TEMPER  ;讀取轉(zhuǎn)換數(shù)據(jù)
            LCALL   COMPARE       ;判斷是否超出設(shè)定溫度范圍
            LCALL    DATA_PROC    ;數(shù)據(jù)處理
            LCALL    SEG_GEN       ;生成顯示碼
            LCALL    DISPLAY       ;數(shù)碼顯示
            SJMP    MAIN
;DS18B20復(fù)位初始化子程序(單總線)
INIT_1820:  SETB     DQ
            NOP
            CLR        DQ               ;主機(jī)發(fā)出延時(shí)復(fù)位低脈沖
            MOV     R1,#3
TSR1:        MOV     R0,#107
            DJNZ     R0,$
            DJNZ     R1,TSR1        ;延時(shí)651微秒
            SETB     DQ               ;拉高數(shù)據(jù)線
            NOP
            NOP
            NOP                   ;延時(shí)3微秒
            MOV     R0,#25H
TSR2:       JNB     DQ,TSR3       ;等待DS18B20回應(yīng)
            DJNZ     R0,TSR2           ;延時(shí)并檢測(cè)應(yīng)答信號(hào),148微秒
            LJMP     TSR4         
TSR3:       SETB     FLAG1            ;置標(biāo)志位,表示DS1820存在
            LJMP     TSR5
TSR4:        CLR     FLAG1            ;清標(biāo)志位,表示DS1820不存在
            LJMP     TSR6
TSR5:        MOV     R0,#117
            DJNZ     R0,$             ;時(shí)序要求延時(shí)一段時(shí)間,234微秒
TSR6:        SETB     DQ
            RET                    
;讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB     DQ   
LCALL     INIT_1820        ;先復(fù)位DS18B20
JB     FLAG1,TSS2         
RET                      ;判斷DS1820是否存在
TSS2:       MOV     A,#0CCH         ;跳過ROM匹配
LCALL     WRITE_1820
MOV     A,#44H           ;發(fā)出溫度轉(zhuǎn)換命令   
LCALL     WRITE_1820
LCALL     DELAY             ;等待AD轉(zhuǎn)換結(jié)束,12位轉(zhuǎn)換需750微秒
LCALL     INIT_1820        ;準(zhǔn)備讀溫度前先復(fù)位
MOV     A,#0CCH         ;跳過ROM匹配
LCALL     WRITE_1820
MOV     A,#0BEH         ;發(fā)出讀溫度命令
LCALL     WRITE_1820
LCALL     READ_18200      ;將讀出的溫度數(shù)據(jù)保存到35H/36H
RET            
;寫DS18B20的子程序(有具體的時(shí)序要求)
WRITE_1820:MOV     R2,#8              ;一共8位數(shù)據(jù)
            CLR     C
WR1:        CLR     DQ
            MOV     R3,#6
            DJNZ     R3,$
            RRC     A
            MOV     DQ,C
            MOV     R3,#23
            DJNZ     R3,$
            SETB     DQ
            NOP                       ;兩個(gè)寫周期至少需要1微秒的恢復(fù)時(shí)間
            DJNZ     R2,WR1
            SETB     DQ
            RET        
; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_18200:MOV     R4,#2                ;將溫度高位和低位從DS18B20中讀出
MOV     R1,#31H            ;低位存入31H,高位存入30H
RE00:       MOV     R2,#8               ;數(shù)據(jù)一共有8位
RE01:        CLR     C
            SETB     DQ
            NOP
            NOP
            CLR     DQ
            NOP
            NOP
            NOP
            SETB     DQ
            MOV     R3,#9
RE10:       DJNZ     R3,RE10
            MOV     C,DQ
            MOV     R3,#23
            DJNZ     R3,$
            RRC     A
            DJNZ     R2,RE01
            MOV     @R1,A
            DEC     R1
            DJNZ     R4,RE00
            RET
;數(shù)據(jù)處理子程序,判斷正負(fù),并分離轉(zhuǎn)換值的整數(shù)和小數(shù)部分
;符號(hào)位為SIGN,0為正,1為負(fù)
;整數(shù)部分存放在INTEG(32H)中,小數(shù)部分存放在DECIM(33H)中
;先判斷轉(zhuǎn)換數(shù)據(jù)的正負(fù)
DATA_PROC:    CLR    C             ;清零進(jìn)位位
            CLR    SIGN        ;清零符號(hào)位
            MOV    A,MSB     ;將DS18B20轉(zhuǎn)換數(shù)據(jù)的高位字節(jié)給8位累加器
            RLC    A             ;將累加器A帶進(jìn)位的左移,把MSB的最高位給C
            JC    NEG         ;判斷符號(hào)位,C=1說明為負(fù)數(shù),跳轉(zhuǎn)到NEG   
            LJMP    PROC    ;C=0說明為正數(shù),跳轉(zhuǎn)到PROC
;下面對(duì)負(fù)數(shù)進(jìn)行取補(bǔ)碼
NEG:        CLR    C             ;清零進(jìn)位位
            SETB    SIGN    ;將符號(hào)位置1,表示負(fù)數(shù)
            MOV    A,LSB     ;將DS18B20轉(zhuǎn)換數(shù)據(jù)的低位字節(jié)給8位累加器
            CPL    A             ;累加器A的8位取反
            ADD    A,#1         ;取反后加1
            MOV    LSB,A     ;再將取反后的補(bǔ)碼給LSB
            MOV    A,MSB     ;同理將MSB進(jìn)行取補(bǔ)碼
            CPL    A
            ADDC    A,#0     ;此處應(yīng)注意LSB是否向MSB進(jìn)位
            MOV    MSB,A
;下面分離轉(zhuǎn)換值的整數(shù)和小數(shù)部分
;DS18B20為轉(zhuǎn)換數(shù)據(jù)為16位,其中,高字節(jié)的高5位為溫度符號(hào)位,
;高字節(jié)的低3位+低字節(jié)的高4位為溫度的整數(shù)部分,低字節(jié)的低4位為溫度的小數(shù)部分
PROC:       MOV    A,LSB              
            ANL    A,#0FH     ;保留低字節(jié)的低4位
            MOV    DECIM,A ;將小數(shù)部分存儲(chǔ)在DECIM   
            MOV    A,MSB   
            SWAP    A         ;累加器A中高低4位互換
            ANL    A,#0F0H     ;保留高字節(jié)的低4位
            MOV    INTEG,A
            MOV    A,LSB
            SWAP    A
            ANL    A,#0FH      ;保留低字節(jié)的高4位
            MOV    R0,INTEG
            ORL    A,R0      ;高字節(jié)的低4位加上低字節(jié)的高4位
            MOV    INTEG,A      ;得到的整數(shù)部分存儲(chǔ)在INTEG   
            RET
;下面對(duì)設(shè)置溫度上限與下限,超過范圍將點(diǎn)亮報(bào)警燈
COMPARE:  PUSH ACC
            CLR C
            MOV A, #28         ;設(shè)置溫度上限
            SUBB A,INTEG   ;溫度上限減去整數(shù)部分
            JC Z1               ;若超過溫度上限,則跳轉(zhuǎn)到Z1
               MOV A,#26         ;設(shè)置溫度下限
            SUBB A,INTEG   ;溫度下限減去整數(shù)部分
            JNC Z1             ;若低于溫度下限,則跳轉(zhuǎn)到Z1
            CLR C           
            SETB P1.2         ;若在上下限之間,則不點(diǎn)亮報(bào)警燈
            POP ACC
            RET
Z1:         CLR C           
            CLR P1.2         ;點(diǎn)亮報(bào)警燈
            POP ACC
            RET
;生成顯示碼子程序
;符號(hào)位段碼存放在SEG_S中,整數(shù)段碼存放在SEG_I3到SEG_I1中
;小數(shù)部分段碼存放在SEG_D1中
SEG_GEN:    MOV    DPTR,#TABLE     ;將0到9的數(shù)碼段的段首地址給DPTR
            JB    SIGN,S_NEG             ;判斷符號(hào)位,若為負(fù)數(shù),跳轉(zhuǎn)至S_NEG
            MOV    SEG_S,#0FFH     ;若為正數(shù),則符號(hào)位數(shù)碼段都不亮
            SJMP    S_INT
S_NEG:        MOV    SEG_S,#0BFH     ;若為負(fù)數(shù),則符號(hào)位數(shù)碼段顯示“-”
S_INT:        MOV    A,INTEG
            MOV    B,#100
            DIV    AB                   ;A除以B,商放在A中,商即為整數(shù)部分的百位數(shù)
            MOVC    A,@A+DPTR     ;將百位數(shù)的段碼給A
            MOV    SEG_I3,A        ;得到百位數(shù)段碼,存儲(chǔ)在SEG_I3
;下面同理得到十位數(shù)的段碼
            MOV    A,B
            MOV    B,#10
            DIV    AB
            MOVC    A,@A+DPTR
            MOV    SEG_I2,A   
            MOV    A,B
            MOVC A,@A+DPTR
            ANL  A,#7FH             ;加上小數(shù)點(diǎn)
            MOV    SEG_I1,A      ;得到十位數(shù)的段碼
;下面通過散轉(zhuǎn)程序得到小數(shù)的段碼
            MOV    DPTR,#SWITCH
            MOV    A,DECIM
            MOV    B,DECIM         
            ADD    A,B              ;AJMP指令占用2個(gè)字節(jié)
            JMP    @A+DPTR          ;間接轉(zhuǎn)移指令,根據(jù)小數(shù)值查表,求段碼
SWITCH:    AJMP    K0
            AJMP    K1
            AJMP    K2
            AJMP    K3
            AJMP    K4
            AJMP    K5
            AJMP    K6
            AJMP    K7
            AJMP    K8
            AJMP    K9
            AJMP    K10
            AJMP    K11
            AJMP    K12
            AJMP    K13
            AJMP    K14
            AJMP    K15
K0:            MOV    SEG_D1,#0C0H
            AJMP    RETURN            
K1:            MOV    SEG_D1,#0F9H
            AJMP    RETURN
K2:            MOV    SEG_D1,#0F9H
            AJMP    RETURN        
K3:            MOV    SEG_D1,#0A4H
            AJMP    RETURN
K4:            MOV    SEG_D1,#0B0H
            AJMP    RETURN            
K5:            MOV    SEG_D1,#0B0H
            AJMP    RETURN
K6:            MOV    SEG_D1,#99H
            AJMP    RETURN            
K7:            MOV    SEG_D1,#99H
            AJMP    RETURN
K8:            MOV    SEG_D1,#92H
            AJMP    RETURN            
K9:            MOV    SEG_D1,#82H
            AJMP    RETURN
K10:        MOV    SEG_D1,#82H
             AJMP    RETURN            
K11:            MOV    SEG_D1,#0F8H
            AJMP    RETURN
K12:        MOV    SEG_D1,#80H
            AJMP    RETURN            
K13:        MOV    SEG_D1,#80H
            AJMP    RETURN
K14:        MOV    SEG_D1,#90H
            AJMP    RETURN            
K15:        MOV    SEG_D1,#90H
            AJMP    RETURN
RETURN:        JNB    SIGN,RETURN1  ;若為正數(shù)則跳轉(zhuǎn)至RETURN1
            MOV    SEG_I3,#0BFH  ;若為負(fù)數(shù),則百位數(shù)將顯示“-”   
RETURN1:      RET
;顯示子程序,首位為符號(hào)位,三位整數(shù),1位小數(shù)
DISPLAY:    MOV     SP,#80H
            MOV     P2,#0FFH
            MOV     DPTR,#0FF23H   ;指向8255的控制字寄存器
            MOV     A,#81H         ;設(shè)置8255的PA、PB為輸出,PC為輸入
            MOVX    @DPTR,A        ;寫8255控制字寄存器
XS1:        MOV     DPTR,#0FF21H   ;指向8255的PB口(七段碼)
            MOV     A,SEG_I3          ;百位的七段碼
            MOVX    @DPTR,A        ;通過8255的PB口送出七段碼
            MOV     DPTR,#0FF20H   ;位選地址(PA)
            MOV     A,#0DFH        ;左邊第1個(gè)數(shù)碼管的位選
            MOVX    @DPTR,A           ;點(diǎn)亮選擇左邊第一個(gè)數(shù)碼管
            CALL    DELAY            ;調(diào)用延時(shí)子程序
;下面相同原理進(jìn)行位選數(shù)碼管
XS2:        MOV     DPTR,#0FF21H   
            MOV     A,SEG_I2       ;十位的七段碼
            MOVX    @DPTR,A        
            MOV     DPTR,#0FF20H
            MOV     A,#0EFH        ;左邊第2個(gè)數(shù)碼管的位選
            MOVX    @DPTR,A        
            CALL    DELAY
XS3:        MOV     DPTR,#0FF21H   
            MOV     A,SEG_I1       ;個(gè)位的七段碼
            MOVX    @DPTR,A         
            MOV     DPTR,#0FF20H
            MOV     A,#0F7H        ;左邊第3個(gè)數(shù)碼管的位選   
            MOVX    @DPTR,A         
            CALL    DELAY
XS4:        MOV     DPTR,#0FF21H     
            MOV     A,SEG_D1       ;小數(shù)的七段碼  
            MOVX    @DPTR,A         
            MOV     DPTR,#0FF20H
            MOV     A,#0FBH        ;左邊第4個(gè)數(shù)碼管的位選  
            MOVX    @DPTR,A           
            CALL    DELAY
XS5:        MOV     DPTR,#0FF21H      
            MOV     A,#9CH         ;"℃"的小圓圈的七段碼   
            MOVX    @DPTR,A           
            MOV     DPTR,#0FF20H
            MOV     A,#0FDH        ;左邊第5個(gè)數(shù)碼管的位選   
            MOVX    @DPTR,A         
            CALL    DELAY
XS6:        MOV     DPTR,#0FF21H      
            MOV     A,#0C6H        ;"℃"的“C“的七段碼   
            MOVX    @DPTR,A            
            MOV     DPTR,#0FF20H
            MOV     A,#0FEH        ;左邊第6個(gè)數(shù)碼管的位選
            MOVX    @DPTR,A         
            CALL    DELAY
;延時(shí)子程序
DELAY:
            MOV R1,#5        
D2:         MOV R2,#120      
            DJNZ R2,$
            DJNZ R1,D2
            RET
;0到9數(shù)字的數(shù)碼段段碼
TABLE:         DB 0C0H,0F9H,0A4H,0B0H,99H   
            DB 92H,82H,0F8H,80H,90H
END

完整的Word格式文檔51黑下載地址:
課設(shè)報(bào)告.doc (68.5 KB, 下載次數(shù): 117)




作者: tieq1952    時(shí)間: 2019-9-14 13:21
謝謝分享!!
作者: zrl1021    時(shí)間: 2019-9-19 08:55
請(qǐng)問有仿真圖和PCB圖嘛
作者: whhxkj    時(shí)間: 2019-10-6 09:00
學(xué)習(xí)下,謝謝分享
作者: lxy9408    時(shí)間: 2019-11-19 19:27
謝謝分享
作者: jfidovid    時(shí)間: 2020-2-23 11:00
zrl1021 發(fā)表于 2019-9-19 08:55
請(qǐng)問有仿真圖和PCB圖嘛

仿真圖用的是proteus8.0(破解版軟件)仿的,由于軟件有些問題,仿真圖的LED顯示那塊顯示不出來,所以只放了一張proteus的仿真截圖僅供參考。另:支持正版....
作者: zhuangj2001    時(shí)間: 2020-2-23 12:01
收到,謝謝了。。。。。。。。。。。。。。。。。。。。。!
作者: 1472580啊啊啊    時(shí)間: 2021-2-26 18:08
為啥數(shù)碼管會(huì)不顯示????
作者: QSXZS    時(shí)間: 2024-12-10 22:33
這個(gè)led燈為啥也不亮啊啊啊





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1