久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機+DS18B20溫控保溫匯編程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年10月30日   【字體:
;DS18B20和AT89C2051制作的熱水器程序!兩位數碼管顯示溫度,設定溫度時數碼管成閃爍狀態,延時幾秒后跳轉到被測溫度;DS18B20的正電源就是紅線接+5伏,蘭線接地,黃線接P3.2,紅線和黃線之間接一個4.7K的上拉電阻
;這是關于DS18B20的讀寫程序,數據腳P3.2,晶振12MHz
;溫度傳感器18B20匯編程序,采用器件默認的12位轉化,最大轉化時間750微秒
;可以將檢測到的溫度直接顯示到AT89C2051的p1口輸數碼管段碼到兩位一體數碼管上
;顯示溫度00到99度,很準確哦~~無需校正!
;p3.1驅動加熱管裝置,讓溫度保溫在0-99度內
;p3.0保溫指示燈,p3.4是溫度設定按鍵加1度;p3.5是溫度設定按鍵減1度,p3.7是數碼管高位位碼,p3.3是數碼管低位位碼
;程序16進制的溫度值放在29h里,我用可調節0度到99度的16進制值(#08H/#0EH)與之比較
;1至40度的16進制為:01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH     1-10度
;                   0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H     11-20度
;                   15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH     21-30度
;                   1FH 2OH 21H 22H 23H 24H 25H 26H 27H 28H     31-40度
;                   29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 31H 32H     41-50度
;                   33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH     51-60度
;                   3CH 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H     61-70度
;                   46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH     71-80度
;                   51H 52H 53H 54H 55H 56H 57H 58H 59H 5AH     81-90度
;                   5BH 5CH 5DH 5EH 5FH 60H 61H 62H 63H 64H     91-100度
;=========================================================================================
;單片機內存分配申明!
       TEMPER_L EQU 29H          ;用于保存讀出溫度的低8位
       TEMPER_H EQU 28H          ;用于保存讀出溫度的高8位(特別是可位尋址,程序中用的著哦)
       TIAO_H   EQU 27H       ;用于保存設定溫度的數據(最低溫度的設定,高溫度為低溫度加2度)
       FLAG1 EQU 38H             ;是否檢測到DS18B20標志位
       a_bit equ 20h             ;數碼管個位數存放內存位置
       b_bit equ 21h             ;數碼管十位數存放內存位置
       SL   EQU  22H            ;設定溫度時數碼管個位數存放內存位置
       SH   EQU  23H             ;設定溫度時數碼管十位數存放內存位置
       sdwd  equ 24h            ;設定溫度壓縮BCD碼位
      DS18B20 BIT P3.2        ;定義DS18B20的數據腳為P3.2端口
       ORG 0000H
       MOV sdwd,#25H         ;;;;設定初始溫度37度,上電后內部設定溫度
  MAIN:LCALL INIT_1820           ;調用復位DS18B20子程序
MAIN1:LCALL GET_TEMPER          ;調用讀溫度子程序
;進行溫度顯示,這里我是用兩位數碼管來顯示溫度,顯示范圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節,這個字節就是實際測量獲得的溫度
;這個轉化溫度的方法可是我想出來的哦~~非常簡潔無需乘于0.0625系數
       MOV A,29H
       MOV C,40H                 ;將28H中的最低位移入C
       RRC A
       MOV C,41H
       RRC A
       MOV C,42H
       RRC A
       MOV C,43H
       RRC A
       MOV 29H,A
       LCALL DISPLAY             ;調用數碼管顯示子程序
;這里是后加的,做為控制在0-99度內恒溫的程序!p3.1驅動加熱管裝置
      setb p3.4
      setb p3.5
      jnb p3.4,DD1             ;按下后轉加1程序
      jnb p3.5,DD2             ;按下后轉減1程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT:     CLR C                    ;比較轉換值與設定值
       MOV 26H,sdwd              ;把低溫度設定保存到26H單元后減2度,作為低度的數據
       DEC 26H
        MOV A,29H
        CJNE A,26H,LOOP1        ;下限設定溫度度,不相等跳LOOP1
        SJMP HOTTING             ;與下限值相等跳HOTTING,加熱
  LOOP1:JC  HOTTING              ;溫度小于下限值跳HOTTING,加熱
        MOV A,29H                ;溫度大于下限值,與上限值比較
        CLR C
     mov  27h,sdwd
     inc 27h
        CJNE A,27h,LOOP2        ;上限設定溫度度,不相等跳LOOP2
        SJMP STOPHOT             ;相等跳STOPHOT,停止加熱 
  LOOP2:JNC STOPHOT              ;溫度大于上限值跳STOPHOT,停止加熱
        SJMP KEEP                ;溫度小于上限且大于下限值跳KEEP,保溫
HOTTING:CLR P3.1                 ;小,加熱器驅動
        setb p3.0                ;關閉保溫燈
   KEEP:SJMP MAIN              ;返回,保持原態,保溫
STOPHOT:SETB P3.1                ;關閉加熱器
        clr p3.0                ;點亮保溫燈
        AJMP MAIN                ;反回主程序
;;;;;;;;;;;;;;;;;;;;;按鍵處理;;;;;;;;;;;;
;;;;;加限設定溫度度;;;;;;;;;;
DD1:LCALL  displa             ;調用數碼管閃爍設定顯示子程序
    mov r5,#30
    JNB P3.4,DD1
    mov a,sdwd               ;把設定溫度送累加器判斷
cjne a,#62h,ty1               ;比較設定溫度是否到99度,不是則加
  ajmp dh2
ty1: INC sdwd
dh2:jnb p3.4,DD1
      jnb p3.5,DD2             ;按下后轉減1程序
     LCALL  displa             ;調用數碼管閃爍設定顯示子程序
    djnz r5,dh2
   LJMP  TT
;;;減限設定溫度度;;;;;;;;;;;;
DD2:LCALL  displa             ;調用數碼管閃爍設定顯示子程序
    mov r5,#30
    JNB P3.5,DD2
    mov a,sdwd               ;把設定溫度送累加器判斷
cjne a,#01h,ty               ;比較設定溫度是否到0度,不是則減
  ajmp dh1
ty: DEC sdwd
dh1:jnb p3.5,DD2
      jnb p3.4,DD1             ;按下后轉加1程序
    LCALL  displa             ;調用數碼管閃爍設定顯示子程序
    djnz r5,dh1
   LJMP  TT
;=========================================================================================
; DS18B20復位初始化程序
INIT_1820:SETB DS18B20
          NOP
          CLR DS18B20
          MOV R0,#06BH          ;主機發出延時537微秒的復位低脈沖
          MOV R1,#03H
     TSR1:DJNZ R0,TSR1
          MOV R0,#6BH
          DJNZ R1,TSR1
          SETB DS18B20             ;然后拉高數據線
          NOP
          NOP
          NOP
          MOV R0,#25H
     TSR2:JNB DS18B20,TSR3         ;等待DS18B20回應
          DJNZ R0,TSR2
          LJMP TSR4             ;延時
     TSR3:SETB FLAG1            ;置標志位,表示DS1820存在
          LJMP TSR5
     TSR4:CLR FLAG1             ;清標志位,表示DS1820不存在
          LJMP TSR7
     TSR5:MOV R0,#06BH
     TSR6:DJNZ R0,TSR6          ;時序要求延時一段時間
     TSR7:SETB DS18B20
          RET
;=========================================================================================
; 讀出轉換后的溫度值
GET_TEMPER:SETB DS18B20            ;定時入口
           LCALL INIT_1820      ;先復位DS18B20
           JB FLAG1,TSS2
           RET                  ;判斷DS1820是否存在?若DS18B20不存在則返回
      TSS2:MOV A,#0CCH          ;跳過ROM匹配
           LCALL WRITE_1820
           MOV A,#44H           ;發出溫度轉換命令
           LCALL WRITE_1820
           LCALL DISPLAY        ;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒.
           LCALL INIT_1820      ;準備讀溫度前先復位
           MOV A,#0CCH          ;跳過ROM匹配
           LCALL WRITE_1820
           MOV A,#0BEH          ;發出讀溫度命令
           LCALL WRITE_1820
           LCALL READ_18200     ;將讀出的溫度數據保存到35H/36H
           RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:MOV R2,#8            ;一共8位數據
           CLR C
       WR1:CLR DS18B20
           MOV R3,#6
           DJNZ R3,$
           RRC A
           MOV DS18B20,C
           MOV R3,#23
           DJNZ R3,$
           SETB DS18B20
           NOP
           DJNZ R2,WR1
           SETB DS18B20
           RET
; 讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
READ_18200:MOV R4,#2          ;將溫度高位和低位從DS18B20中讀出
           MOV R1,#29H        ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
      RE00:MOV R2,#8
      RE01:CLR C
           SETB DS18B20
           NOP
           NOP
           CLR DS18B20
           NOP
           NOP
           NOP
           SETB DS18B20
           MOV R3,#09
      RE10:DJNZ R3,RE10
           MOV C,DS18B20
           MOV R3,#23
      RE20:DJNZ R3,RE20
           RRC A
           DJNZ R2,RE01
           MOV @R1,A
           DEC R1
           DJNZ R4,RE00
           RET
;=========================================================================================
;;;;;;;;;;;;;;;顯示子程序;;;;;;;;;;;;;;;;;;
display:mov a,29H            ;將29H中的十六進制數轉換成10進制
        mov b,#10            ;10進制/10=10進制
        div ab
        mov b_bit,a          ;十位在a
        mov a_bit,b          ;個位在b
        mov dptr,#numtab     ;指定查表啟始地址
        mov r1,#250          ;顯示250次
  dplop:mov a,a_bit          ;取個位數
        MOVC A,@A+DPTR       ;查個位數的7段代碼
        mov p1,a             ;送出個位的7段代碼
        clr p3.3             ;開個位顯示
        acall d1ms           ;顯示1ms
        setb p3.3
        mov a,b_bit          ;取十位數
        MOVC A,@A+DPTR       ;查十位數的7段代碼
        mov p1,a             ;送出十位的7段代碼
        clr p3.7            ;開十位顯示
        acall d1ms           ;顯示1ms
        setb p3.7
        djnz r1,dplop        ;250次沒完循環
        RET
;;;===============================================================
;;;;;;;閃爍設定顯示子程序=====================
displa:   MOV A,sdwd
        mov b,#10            ;10進制/10=10進制
        div ab
        mov SL,a          ;十位在a
        mov SH,b          ;個位在b
        mov r1,#250          ;顯示250次
dpl2:  mov a,SL          ;取設定溫度個位數
        mov dptr,#numtab     ;指定查表啟始地址
        MOVC A,@A+DPTR       ;查個位數的7段代碼
        mov p1,a             ;送出個位的7段代碼
        clr p3.7            ;開個位顯示
        acall d1ms           ;顯示1ms
        setb p3.7
        mov a,SH          ;取設定溫度十位數
        MOVC A,@A+DPTR       ;查十位數的7段代碼
        mov p1,a             ;送出十位的7段代碼
        clr p3.3           ;開十位顯示
        acall d1ms           ;顯示1ms
        setb p3.3
        djnz r1,dpl2        ;250次沒完循環
        acall D1s           ;顯示1ms
        RET
;;=========================================================================================
;1MS延時(按12MHZ算)
   D1MS:MOV R7,#80
        DJNZ R7,$
        RET
;;1S延時(按12MHZ算)
  D1s:MOV R7,#255
     l1:nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        DJNZ R7,l1
        RET
;=========================================================================================
numtab:         DB        0EEH;0
        DB        048H;1
        DB        0D6H;2
        DB        0DCH;3
        DB        078H;4
        DB        0BCH;5
        DB        0BEH;6
        DB        0C8H;7
        DB        0FEH;8
        DB        0FCH;9

END
關閉窗口

相關文章

主站蜘蛛池模板: 亚洲高清在线观看 | 国产日韩欧美在线 | 精品久久ai电影 | 在线啊v| 精品国产一区二区三区免费 | 最近中文字幕免费 | 人人操日日干 | 久久中文字幕一区 | 在线免费视频一区 | 午夜精品一区二区三区免费视频 | 欧美二级 | 欧州一区二区三区 | 久久这里有精品 | 999热视频| 中文在线一区二区 | 亚洲激情av| 在线观看www视频 | 欧美色性 | 天天操夜夜爽 | 日韩精品免费一区二区在线观看 | 国产福利在线播放麻豆 | 日韩精品一区二区三区 | 精品欧美乱码久久久久久 | 欧美日韩美女 | 色婷婷综合网 | 久久综合久久自在自线精品自 | 91精品观看 | 国产精品中文 | 黄色网络在线观看 | 羞羞视频网站免费观看 | 欧美三级三级三级爽爽爽 | 欧美国产日韩在线观看 | 在线观看国产精品一区二区 | 成人a免费 | 亚洲一区精品在线 | 日韩国产一区二区三区 | 日本在线看片 | 99精品久久| 亚洲一区二区三区四区五区中文 | 欧美激情在线一区二区三区 | 日韩无 |