找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2566|回复: 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 单片机教程网

快速回复 返回顶部 返回列表