⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lst

📁 基于8051编写的温度计程序 采用汇编语言 在LED上显示温度
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  DS18B20                                                              01/06/2009 10:18:37 PAGE     1


MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN DS18B20.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE DS18B20.asm SET(SMALL) DEBUG EP

LOC  OBJ            LINE     SOURCE

  0008                 1     N       EQU     8               ;读出ROM的位数
  00B2                 2     DQ      EQU     P3.2            ;单总线的数据线
  0028                 3     TH      EQU     40              ;最高极限温度
  000A                 4     TL      EQU     10              ;最低极限温度
  00F0                 5     SROMC   EQU     0F0H            ;搜索ROM命令
  0055                 6     MROMC   EQU     55H             ;匹配ROM命令
  00CC                 7     LROMC   EQU     0CCH            ;跳过读ROM命令
  0033                 8     RROMC   EQU     33H             ;读ROM命令
  0044                 9     CTC     EQU     44H             ;转换温度命令
  004E                10     WREGC   EQU     4EH             ;写暂存器命令
  00BE                11     RREGC   EQU     0BEH            ;读暂存器命令
  001F                12     CONFIG  EQU     1FH             ;配置寄存器的值,9位温度值
                      13     
----                  14             DSEG    AT 30H
0030                  15     DAT:    DS      1               ;温度值存储单元
0031                  16     POINT:  DS      1               ;小数点后温度值的存储单元
0032                  17     ROMA:   DS      8               ;器件A的ROM存储单元
003A                  18     BUF:    DS      9               ;暂存器中数据存储单元
0043                  19     BUFT:   DS      4               ;数码管动态显示的4个数据缓冲单元
0047                  20     BTH:    DS      1               ;显示ROM中某一字节高四位
0048                  21     BTL:    DS      1               ;显示ROM中某一字节低四位
                      22     
----                  23             CSEG    AT 0000H
0000 020100           24             LJMP    MAIN
                      25     
0100                  26             ORG     0100H
0100 758000           27     MAIN:   mov p0,#0
0103 758170           28     MOV     SP,#70H
0106 75D000           29             MOV     PSW,#00H
0109 120162           30             LCALL   Initial
010C 74CC             31             MOV     A,#LROMC        ;写跳过ROM命令
010E 120171           32             LCALL   W8BIT
0111 744E             33             MOV     A,#WREGC        ;写暂存器命令,可写入TH,TL,Configuration
0113 120171           34             LCALL   W8BIT
0116 7428             35             MOV     A,#TH           ;写18B20的TH寄存器
0118 120171           36             LCALL   W8BIT
011B 740A             37             MOV     A,#TL           ;写18B20的TL寄存器
011D 120171           38             LCALL   W8BIT
0120 741F             39             MOV     A,#CONFIG       ;写18B20的配置寄存器,9位温度值
0122 120171           40             LCALL   W8BIT
                      41     
0125 120162           42     RETN:   LCALL   Initial         ;18B20初始化
0128 74CC             43             MOV     A,#LROMC        ;写跳过ROM命令
012A 120171           44             LCALL   W8BIT
012D 7444             45             MOV     A,#CTC          ;写转换温度命令
012F 120171           46             LCALL   W8BIT
0132 1201EF           47     BUSY:   LCALL   Disply          ;显示温度
0135 C2B2             48             CLR     DQ              ;读18B20的忙位
0137 00               49             NOP
0138 D2B2             50             SETB    DQ
013A 00               51             NOP
013B A2B2             52             MOV     C,DQ
013D 120220           53             LCALL   DLY70           ;延时70微秒
0140 50F0             54             JNC     BUSY            ;如果18B20忙,转BUSY
0142 120162           55             LCALL   Initial         ;初始化
0145 74CC             56             MOV     A,#LROMC        ;写跳过ROM命令
0147 120171           57             LCALL   W8BIT
014A 74BE             58             MOV     A,#RREGC        ;写读18B20暂存器命令
A51 MACRO ASSEMBLER  DS18B20                                                              01/06/2009 10:18:37 PAGE     2

014C 120171           59             LCALL   W8BIT
014F 7B02             60             MOV     R3,#2           ;设置计数器R3=2,从18B20读2个字节的温度值
0151 793A             61             MOV     R1,#BUF         ;置R1温度值缓冲区
0153 120182           62     RER:    LCALL   R8BIT           ;读温度值
0156 F7               63             MOV     @R1,A           ;将温度值存入缓冲区
0157 09               64             INC     R1              ;温度值缓冲区地址加1
0158 DBF9             65             DJNZ    R3,RER          ;如2个字节温度值没读完,转RER
015A 120193           66             LCALL   STORE           ;温度转换并存储子程序
015D 1201EF           67             LCALL   Disply          ;温度显示子程序,只所以调用2次该子程序
                      68                                     ;是为了增强数码管的亮度
0160 80C3             69             SJMP    RETN
                      70     
                      71     
                      72             ;18B20初始化子程序,使用R7
0162 C2B2             73     Initial:CLR     DQ              ;数据线为低700微秒
0164 12021C           74             LCALL   DLY700
0167 D2B2             75             SETB    DQ              ;置数据线为高,以便接收18B20信号
0169 A2B2             76     I1:     MOV     C,DQ            ;等待数据线为低
016B 40FC             77             JC      I1
016D 12021C           78             LCALL   DLY700          ;延时700微秒
0170 22               79             RET
                      80     
                      81             ;向18B20写8位子程序,被写的数在ACC中
                      82             ;使用R2、R7
0171 7A08             83     W8BIT:  MOV     R2,#8           ;设置计数器R2为8
0173 C2B2             84     W1:     CLR     DQ              ;使数据线为低
0175 13               85             RRC     A               ;右移将被写位移如进位C
0176 5002             86             JNC     W2              ;被写位为0,转W2
0178 D2B2             87             SETB    DQ              ;被写位为1,使数据线为高
017A 120220           88     W2:     LCALL   DLY70           ;延时70微秒
017D D2B2             89             SETB    DQ              ;使数据线为高
017F DAF2             90             DJNZ    R2,W1           ;如果8位数据没写完,转W1
0181 22               91             RET
                      92     
                      93             ;读8位子程序,读的数在ACC中
                      94             ;使用R2、R7
0182 7A08             95     R8BIT:  MOV     R2,#8           ;设置计数器R2为8
0184 C2B2             96     RR1:    CLR     DQ              ;使数据线为低,启动读过程
0186 00               97             NOP                     ;等待4微秒
0187 D2B2             98             SETB    DQ              ;使数据线为高,以便从18B20读数据
0189 00               99             NOP                     ;等待4微秒
018A A2B2            100             MOV     C,DQ            ;将数据读入进位C
018C 13              101             RRC     A               ;通过右移将进位C送入ACC
018D 120220          102             LCALL   DLY70           ;延时70微秒
0190 DAF2            103             DJNZ    R2,RR1          ;如果8位数据没读完,转RR1
0192 22              104             RET
                     105     
                     106     
                     107             ;温度值存储子程序,使用R0
0193 783A            108     STORE:  MOV     R0,#BUF         ;将温度缓冲区首址送R0
0195 E6              109             MOV     A,@R0
0196 F5F0            110             MOV     B,A
0198 5408            111             ANL     A,#08H          ;保留小数位
019A F531            112             MOV     POINT,A
019C E5F0            113             MOV     A,B
019E 54F0            114             ANL     A,#0F0H         ;保留高4位
01A0 F5F0            115             MOV     B,A
01A2 08              116             INC     R0
01A3 E6              117             MOV     A,@R0
01A4 540F            118             ANL     A,#0FH          ;保留低4位
01A6 45F0            119             ORL     A,B             ;组成1个字节
01A8 C4              120             SWAP    A
01A9 7843            121             MOV     R0,#BUFT
01AB 20E707          122             JB      ACC.7,NEG       ;如果温度为负,转NEG
01AE F530            123             MOV     DAT,A           ;温度为正值,直接存到DAT里
01B0 7400            124             MOV     A,#00H          ;正号显示
A51 MACRO ASSEMBLER  DS18B20                                                              01/06/2009 10:18:37 PAGE     3

01B2 F6              125             MOV     @R0,A
01B3 8018            126             JMP     NST
01B5 F4              127     NEG:    CPL     A               ;将相应的负值转换为其绝对值
01B6 F5F0            128             MOV     B,A
01B8 E531            129             MOV     A,POINT
01BA F4              130             CPL     A
01BB C2E4            131             CLR     ACC.4
01BD 2408            132             ADD     A,#08H
01BF A2E4            133             MOV     C,ACC.4
01C1 C5F0            134             XCH     A,B
01C3 3400            135             ADDC    A,#0
01C5 F530            136             MOV     DAT,A           ;把负温度值1-8位变正存储
01C7 85F031          137             MOV     POINT,B         ;把负温度值第9位变正存储
01CA 7440            138             MOV     A,#40H          ;负号显示

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -