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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3211|回復: 2
收起左側

單支18b20測溫—帶詳細注釋的單片機匯編程序

[復制鏈接]
ID:391420 發表于 2018-10-16 11:03 | 顯示全部樓層 |閱讀模式
這時一個由匯編語言編寫的ds18b20測溫程序。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機源程序如下:
  1. TEMP_ZH   EQU   24H                    ;實時溫度值存放單元,用來和報警值進行比較
  2.                 TEMPL   EQU   25H                    ;低溫度值存放單元
  3.                   TEMPH   EQU   26H                    ;高溫度值存放單元
  4.                 TEMP_TH  EQU   27H                    ;高溫報警值存放單元
  5.                   TEMP_TL  EQU   28H                    ;低溫報警值存放單元
  6.                      FLAG   BIT  20H.0                    ;DS18B20是否存在標記
  7.                 DQ   BIT   P1.7                    ;DS18B20數據腳定義
  8.                 TEMPHC  EQU   32H                     ;溫度轉換低8位緩沖區
  9.                 TEMPLC  EQU   33H                     ;溫度轉換高8位緩沖區
  10.                 DISP_BUF  EQU   34H                  ; DISP_BUF為顯示緩沖區小數位,DISP_BUF+1為顯示緩沖區個數位
  11.                                                 ;DISP_BUF+2為顯示緩沖區十位,DISP_BUF +3為顯示緩沖區百位
  12.                 DOT  BIT   P0.7                    ;小數點控制
  13.                 ORG   0000H                     ;主程序入口地址
  14.                  AJMP    MAIN                     ;轉主程序MAIN
  15.                 ORG  0030H                        ;主程序從0030H開始
  16.                 ;以下是主程序
  17. MAIN:                MOV    SP,  #50H                 ;堆棧初始化
  18.                   MOV    P0,  #0FFH                ;P0口置1
  19. START:              LCALL   GET_TEMP                       ;調用讀溫度子程序
  20.                   LCALL   TEMP_PROC                 ;調溫度BCD處理子程序
  21.                   LCALL   BCD_REFUR                  ;調BCD碼溫度值刷新子程序
  22.                  LCALL   DISPLAY                  ;調用數碼管顯示子程序
  23.                  AJMP    START                   ;跳轉到START
  24.                 ;以下是讀出轉換后的溫度值
  25. GET_TEMP:          SETB   DQ                        ;拉高數據線
  26.                    LCALL  RESET_1820                      ;先復位DS18B20(在驅動程序軟件包中)
  27.                    JB   FLAG, GET_NEXT             ;若FLAG=1說明DS18B20存在,跳轉到GET_NEXT
  28.                 AJMP  GET_RET                        ;若FLAG=0,說明DS18B20不存在,跳轉到GET_RET返回
  29. GET_NEXT:            MOV  A,#0CCH                        ;跳過ROM匹配
  30.                    LCALL   WRITE_1820                ;調寫DS18B20子程序(在驅動程序軟件包中)
  31.                    MOV     A,#44H                         ;發出溫度轉換命令
  32.                    LCALL   WRITE_1820                ;調寫DS18B20子程序(在驅動程序軟件包中)
  33.                    LCALL   DISPLAY                        ;調用顯示子程序延時,等待A/D轉換結束,分辨率為12位時需延時750ms
  34.                                                                 ;此語句也可以不加
  35.                    LCALL   RESET_1820              ;準備讀溫度前先復位(在驅動程序軟件包中)
  36.                    MOV   A,#0CCH                        ;跳過ROM匹配
  37.                    LCALL   WRITE_1820                ;調寫DS18B20子程序(在驅動程序軟件包中)
  38.                    MOV    A,#0BEH                        ;發出讀溫度命令
  39.                    LCALL   WRITE_1820                ;調寫DS18B20子程序(在驅動程序軟件包中)
  40.                    LCALL   READ_1820                     ;調讀DS18B20子程序(在驅動程序軟件包中)
  41. GET_RET:            RET
  42.                 ;以下是溫度BCD碼處理子程序
  43. ;以下是溫度BCD碼處理子程序
  44. TEMP_PROC:          MOV  A,TEMPH                       ;判溫度是否零下
  45.                      ANL  A,#80H                        ;取出最高位
  46.                      JZ   TC1                           ;若A為0,說明溫度為零上,轉TC1
  47.                      CLR  C                                ;若A為1,說明溫度為零下,C清0
  48.                      MOV  A,TEMPL                       ;溫度值低位TEMPL送A
  49.                      CPL  A                             ; TEMPL取反
  50.                      ADD  A,#01H                        ; TEMPL取反加1
  51.                     MOV  TEMPL,A                        ;取反加1后再送回TEMPL
  52.                      MOV  A,TEMPH                        ; TEMPH送A
  53.                      CPL  A                                ; TEMPH取反
  54.                      ADDC  A,#00H                        ; TEMPH加上進位位
  55.                      MOV  TEMPH,A                        ;A的值送回TEMPH
  56.                      SJMP  TC2                        ;跳轉到TC2
  57. TC1:                 MOV  TEMPHC,#0AH                     ;將0AH送TEMPHC
  58. TC2:                 MOV  A,TEMPHC                        ; TEMPHC送A
  59.                      SWAP  A                                ;A高低半字節交換
  60.                      MOV  TEMPHC,A                        ;交換后送TEMPHC
  61.                      MOV  A,TEMPL                        ;溫度值低字節TEMPL送A
  62.                      ANL  A,#0FH                      ;取出低4位的小數
  63.                      MOV  DPTR,#DOTTAB                ;小數表DOTTAB地址送DPTR
  64.                      MOVC  A,@A+DPTR                        ;查出小數
  65.                      MOV  TEMPLC,A                   ;小數部分送TEMPLC
  66.                  MOV  A,TEMPL                    ; 溫度值低字節TEMPL送A
  67.                      ANL  A,#0F0H                     ;取出高四位整位部分
  68.                      SWAP  A                                ;高低半字節交換
  69.                      MOV  TEMPL,A                        ;交換后送TEMPL
  70.                      MOV  A,TEMPH                    ;溫度值高字節TEMPH送A
  71.                      ANL  A,#0FH                        ;取出TEMPH低4位
  72.                      SWAP  A                                ;高低半字節交換
  73.                      ORL  A,TEMPL                     ;將TEMPH低4位與TEMPL高4位整數部分重新組合
  74.                      MOV  TEMP_ZH,A                        ;將組合后的值送TEMP_ZH(實際溫度)
  75.                      LCALL  HEX_BCD                        ;調十六進制轉BCD碼子程序
  76.                      MOV  TEMPL,A                        ;轉換后A送TEMPL
  77.                      ANL  A,#0F0H                        ;取高4位
  78.                      SWAP  A                                ;高低4位交換
  79.                      ORL  A,TEMPHC                    ;與TEMPHC進行或運算
  80.                      MOV  TEMPHC,A                        ;送回TEMPHC
  81.                      MOV  A,TEMPL                        ; TEMPL送A
  82.                      ANL  A,#0FH                        ;取出低4位
  83.                      SWAP  A                          ;高低4位交換
  84.                      ORL  A,TEMPLC                        ;與TEMPLC進行或運算
  85.                      MOV  TEMPLC,A                        ;送回TEMPLC
  86.                      MOV  A,R4                        ;R4送A
  87.                      JZ   TC3                        ;若A為0,退出
  88.                      ANL  A,#0FH                        ;若不為0,取出低4位
  89.                      SWAP  A                                ;高低4位交換
  90.                      MOV  R4,A                        ;送R4
  91.                      MOV  A,TEMPHC                    ;TEMPHC送A
  92.                      ANL  A,#0FH                        ;取出低4位
  93.                      ORL  A,R4                        ;與R4進行或運算
  94.                      MOV  TEMPHC,A                        ;送回TEMPHC
  95. TC3:                 RET         
  96.                 ;以下是單字節十六進制轉BCD子程序
  97. HEX_BCD:        MOV  B,#100                            ;B為100
  98.                  DIV   AB                        ; A除以B
  99.                  MOV  R7,A                              ; 百位數送R7
  100.                  MOV  A,#10                            ;A為10
  101.                  XCH   A,B                       ;A、B值交換
  102.                 DIV  AB                                ; A除以B
  103.                  SWAP  A                         ;高低半字節交換
  104.                  ORL  A,B                               ;或運算
  105.                  RET
  106.                 ;以下是小數部分碼表
  107. DOTTAB:              DB   00H,00H,01H,01H,02H,03H,03H,04H
  108.                  DB   05H,05H,06H,06H,07H,08H,08H,09H
  109.                 ;以下是BCD 碼溫度值刷新子程序
  110. BCD_REFUR:         MOV  A,TEMPLC                         ;取低8位溫度值
  111.                  ANL   A,#0FH                           ;取出低4位(小數部分)
  112.                  MOV  DISP_BUF,A                   ;小數部分送顯示緩沖DISP_BUF
  113.                  MOV  A,TEMPLC                         ;取低8位溫度值
  114.                  SWAP  A                                ;高低4位交換
  115.                  ANL  A,#0FH                           ;取A低4位,即取出TEMPLC的高4位(個位部分)
  116.                  MOV  DISP_BUF+1,A                   ;個位部分送DISP_BUF+1
  117.                  MOV  A,TEMPHC                         ;取高8位溫度值
  118.                  ANL  A,#0FH                           ;取低4位(十位部分)
  119.                  MOV DISP_BUF+2,A                   ;十位部分送DISP_BUF+2
  120.                  MOV  A,TEMPHC                         ;取高8位溫度值
  121.                  SWAP  A                                ;送A
  122.                  ANL  A,#0FH                           ;取出低4位,相當于取出TEMPHC的高4位(百位)
  123.                  MOV  DISP_BUF+3,A                   ;百位送DISP_BUF+3
  124.                  MOV  A,TEMPHC                         ; TEMPHC送A
  125.                  ANL  A,#0F0H                          ;取出高4位
  126.                  CJNE  A,#10H,BCD0                  ;百位數是0?
  127.                  SJMP  BCD_RET                          ;退出
  128. BCD0:                 MOV  A, TEMPHC                        ; TEMPHC送A
  129.                  ANL  A, #0FH                          ;取出低4位
  130.                  JNZ  BCD_RET                          ; 十位數是0?
  131.                  MOV  A,TEMPHC                         ; TEMPHC送A
  132.                  SWAP  A                                ;高低4位交換
  133.                  ANL  A,#0FH                           ;取出低4位
  134.                  MOV  DISP_BUF+3,0AH                ; 符號位不顯示
  135.                  MOV  DISP_BUF+2,A                   ;十位數顯示符號
  136. BCD_RET:         RET      
  137.                              
  138.                 ;以下是顯示子程序
  139. DISPLAY:            MOV   DPTR,#TAB                     ; 指定查表啟始地址
  140.                 MOV  R1,#250                         ; 顯示250次
  141. DPLP:              SETB  DOT                                ;小數點位為高,不顯示小數點
  142. ;-----------------------------------------------------------------------------
  143.                    MOV  A,DISP_BUF                   ; 取小位數
  144.                    MOVC  A,@A+DPTR                        ; 查小位數的7段代碼
  145.                    MOV  P0,A                             ; 送出小位的段碼
  146.                    SETB  P2.3;CLR  P2.3                             ; 開小位顯示
  147.                    ACALL  DELAY_1ms                  ; 顯示1ms,延時時間不可過長,否則會出現閃爍現象
  148.                    CLR  P2.3 ;SETB  P2.3                             ;關小數位
  149. ;------------------------------------------------------------------------------
  150.                    MOV   A,DISP_BUF+1                  ;取個位數
  151.                    MOVC   A,@A+DPTR                ; 查個位數的7段代碼
  152.                    MOV   P0,A                             ; 送出個位的段碼
  153.                    CLR   DOT                                ;顯示小數點
  154.                    SETB   P2.2;CLR   P2.2                             ;開個位顯示
  155.                    ACALL  DELAY_1ms                   ; 顯示1ms
  156.                    CLR   P2.2;SETB   P2.2                     ;關個位
  157.                    SETB   DOT                        ;關小數點
  158. ;--------------------------------------------------------------------------
  159.                     MOV   A,DISP_BUF+2                 ;取十位數
  160.                    MOVC  A,@A+DPTR                        ;查十位數的段碼
  161.                    MOV   P0,A                             ; 送出十位的段碼
  162.                    SETB   P2.1;CLR   P2.1                             ; 開十位顯示
  163.                    ACALL  DELAY_1ms                  ; 顯示1ms
  164.                    CLR   P2.1 ;SETB   P2.1                     ;關十位
  165.                    SETB   DOT                                ;關小數點
  166. ;-------------------------------------------------------------------------------;
  167.                    MOV  A,DISP_BUF+3                  ; 取百位數
  168.                    MOVC  A,@A+DPTR                        ; 查百位數的段碼
  169.                    MOV  P0,A                             ; 送出百位的段碼
  170.                   SETB  P2.0;CLR   P2.0                             ; 開百位顯示
  171.                    ACALL  DELAY_1ms                  ; 顯示1ms
  172.                    CLR   P2.0;SETB  P2.0                             ;關百位
  173.                    DJNZ  R1,DPLP                          ; 250次沒完循環
  174.                     RET
  175. ;-------------------------------------------------------------------------------------
  176.                 ;以下是1ms延時子程序
  177. DELAY_1ms:        MOV  R7,#5
  178. LOOP2:                MOV  R6,#100
  179. LOOP1:                DJNZ  R6,LOOP1
  180.                 DJNZ  R7,LOOP2
  181.                 RET       
  182.                 ;以下是數碼管顯示代碼
  183. TAB:            DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H        ;0-9顯示碼
  184.                 DB  0FFH,0BFH                         ;"熄滅"、 "-"顯示碼
  185.                 ;以下是 DS18B20復位初始化子程序
  186. RESET_1820:        SETB  DQ      
  187.                        NOP
  188.                        CLR   DQ      
  189.                        MOV  R1,#3                                ;主機發出延時500us的復位低脈沖
  190.    DLY:         MOV  R0,#107
  191.                        DJNZ R0,$
  192.                        DJNZ R1,DLY
  193.                         SETB  DQ                        ;拉高數據線
  194.                        NOP
  195.                        NOP
  196.                        NOP
  197.                        MOV  R0,#25H        
  198.    RST2:         JNB   DQ , RST3                               ;等待DS18B20回應
  199.                        DJNZ  R0, RST2
  200.                        JMP  RST4         
  201.    RST3:         SETB  FLAG                              ;置標志位,表示DS18B20存在
  202.                        JMP  RST5
  203.    RST4:        CLR   FLAG                                    ;清標志位,表示DS18B20不存在     
  204.                        JMP  RST7
  205.    RST5:         MOV  R0,#117
  206.    RST6:         DJNZ R0, RST6                           ;時序要求延時一段時間
  207.    RST7:        SETB   DQ        
  208.                        RET
  209.                       ;以下是寫DS18B20子程序
  210. WRITE_1820:         MOV  R2,#8                                   ;共8位數據
  211.                        CLR  C
  212.     WR1:            CLR  DQ                                    ;總線低位,開始寫入  
  213.                        MOV  R3,#6
  214.                        DJNZ R3,$                                    ;保持16微秒以上
  215.                        RRC  A                                  ;把字節DATA分成8個BIT環移給C
  216.                        MOV  DQ, C                                ;寫入一個BIT
  217.                        MOV  R3,#23
  218.                        DJNZ R3,$                                    ;等待
  219.                        SETB  DQ                                   ;重新釋放總線
  220.                        NOP
  221.                        DJNZ R2,WR1                                  ;寫入下一個BIT
  222.                        SETB  DQ         
  223.                        RET                                       ;寫入子程序  
  224.                 ;以下是讀DS18B20子程序(將溫度低位、高位、報警高位TH、報警低位TL從DS18B20中讀出)
  225. READ_1820:         MOV  R4,#4                                  ;讀取4字節
  226.                        MOV  R1,#TEMPL                                ;存入TEMPL (25H)、TEMPLH(26H)、TEMP_TH (27H)、TEMP_TL(28H)
  227.    READ0:           MOV R2,#8                                   ;數據一共有8位
  228.    READ1:            CLR  C
  229.                        SETB  DQ
  230.                        NOP
  231.                        NOP                                 
  232.                        CLR   DQ                                  ;讀前總線保持為低               
  233.                        NOP
  234.                        NOP
  235.                        NOP
  236.                        SETB  DQ                                  ;開始讀總線釋放                 
  237.                 MOV   R3,#9
  238.                        DJNZ  R3,$                                ;延時18微妙
  239.                        MOV C, DQ                                 ;從總線讀到一個BIT                  
  240.                     MOV   R3,#23                                  ;
  241.                       DJNZ R3,$                                   ;等待50us
  242.                       RRC  A                                      ;把讀得的位價值環移給A
  243.                       DJNZ  R2,READ1                                ;讀下一個BIT
  244.                       MOV  @R1,A
  245.                       INC  R1                                      ; R1內數據遞增
  246.                       DJNZ R4,READ0
  247.                       RET                              
  248.                 END
復制代碼

所有資料51hei提供下載:
18b20單支.rar (41.51 KB, 下載次數: 31)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:573098 發表于 2019-6-27 08:33 | 顯示全部樓層
學習一不,謝謝樓主!
回復

使用道具 舉報

ID:264733 發表于 2020-3-14 11:41 | 顯示全部樓層
DOTTAB:              DB   00H,00H,01H,01H,02H,03H,03H,04H
                 DB   05H,05H,06H,06H,07H,08H,08H,09H                             小數部分這個是怎么看的?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美中文字幕 | 男人的天堂中文字幕 | 午夜影院黄| 色资源在线视频 | 99re6在线视频精品免费 | 国产www在线 | 国产一区二区三区四区hd | 国产精品一区二区欧美 | 日韩乱码av | 黄在线免费观看 | 午夜久久久 | 狠狠的干| 一区二区中文 | 成人av电影在线 | 伊人久久免费 | 午夜影院在线观看 | 亚洲欧美激情四射 | 久在草| 久久精品国产久精国产 | 好姑娘影视在线观看高清 | 91精品国产一区二区三区 | 成人午夜免费福利视频 | 国产色婷婷精品综合在线播放 | 欧美一区精品 | 欧美日韩在线综合 | 亚洲精品久久久久久久久久久久久 | 精品99久久久久久 | 成人精品久久久 | 99精品99 | h视频在线免费 | 91精品久久久久久久久久入口 | 一区二区三区四区在线视频 | 亚洲一区二区久久 | 精品欧美一区二区三区精品久久 | 亚洲精品一区二区三区中文字幕 | 中文字幕不卡在线88 | 91久久精品一区二区二区 | 国产日韩精品在线 | 国产一级毛片精品完整视频版 | 亚洲天堂一区二区 | 天堂一区二区三区 |