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

📄 ds18b20.lst

📁 用89C51单片机,LCD1602,建成的数字温度计.
💻 LST
📖 第 1 页 / 共 3 页
字号:
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 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

                       1     ;===========================================================================
                       2     ;DS18B20与77E58系列单片机的接口程序
                       3     ;单片机晶振40MHz,机器周期为0.1uS
                       4     ;此代码已调试通过。
                       5     
                       6     ;       温度转换--->....→读取温度→CRC校验→温度转换→数据处理→其他服务→
                       7     ;                                 ↑_________↓_____________________________↓
                       8     ;===========================================================================
                       9     ;1 wire 总线DQ
  00B5                10     DQ bit P3^5
                      11     
                      12     
                      13     ;===========================================================================
                      14     NAME    DS18B20 ;模块名称
                      15     
                      16     ;===========================================================================
                      17     
                      18     ;===========================================================================
                      19     ;主机对1 wire 设备初始化子程序
                      20     ;函数原型:bit  reset_ds18b20(void)
                      21     ;返回值Cy:1=设备存在;0=设备不存在
                      22     ;===========================================================================
                      23     ?PR?reset_ds18b20?DS18B20   SEGMENT CODE 
                      24             PUBLIC  reset_ds18b20
                      25     
----                  26     RSEG  ?PR?reset_ds18b20?DS18B20 
0000                  27     reset_ds18b20:
0000 C2AF             28             clr     ea;
0002 C2B5             29             clr     DQ;
0004 120000   F       30             call    delay_500uS;
0007 D2B5             31             setb    DQ;
0009 120000   F       32             call    delay_90uS;
000C D3               33             setb    c;      设备存在
000D 30B503           34             jnb     DQ,i_ret;
0010 C3               35             clr     c;      设备不存在
0011 0100     F       36             ajmp    j_ret;  
0013 120000   F       37     i_ret:  call    delay_400uS;
                      38      
0016 D2AF             39     j_ret:  setb    ea;
0018 22               40             ret             
                      41     
                      42     ;==============================================================================
                      43     ;主机向DS18B20写一个字节数据
                      44     ;入口:欲写的数据在A中
                      45     
                      46     
                      47     ;==============================================================================
0019                  48     write_byte:
0019 C0D0             49             push    psw;
001B 7C08             50             mov     r4,#8;
001D C3               51             clr     c;
001E                  52     w_loop1:
001E 13               53             rrc     a;      数据的低位先发,后发高位
001F C2AF             54             clr     ea;//禁止中断
0021 4009             55             jc      write1;
0023 C2B5             56             clr     DQ;
0025 120000   F       57             call    delay_90uS;
0028 D2B5             58             setb    DQ;
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 PAGE     2

002A 0100     F       59             ajmp    w_loop2;
002C C2B5             60     write1: clr     DQ;
                      61     ;       mov     r7,#1;  恢复时间延时必须大于1uS
                      62     ;       djnz    r7,$;
002E 00               63      NOP
002F D2B5             64             setb    DQ;
0031 120000   F       65             call    delay_90uS;
0034 D2AF             66     w_loop2:setb    ea;开中断
0036 DCE6             67             djnz    r4,w_loop1;
0038 D0D0             68             pop     psw;
003A 22               69             ret
                      70     
                      71     ;==============================================================================
                      72     ;主机从DS18B20读取一个字节数据
                      73     ;出口:数据在A中
                      74     ;
                      75     
                      76     ;===============================================================================
003B                  77     read_byte:
                      78             
003B C0D0             79             push    psw;
003D 7C08             80             mov     r4,#8;
003F E4               81             clr     a
0040                  82     read_loop:
0040 C2AF             83             clr     ea;禁止中断
0042 C2B5             84             clr     DQ;
                      85     ;       mov     r7,#1;  拉低总线时间应大于1uS   
                      86     ;       djnz    r7,$;
0044 00               87       NOP
0045 D2B5             88             setb    DQ;
0047 7F05             89             mov     r7,#5;  //必须在从拉低总线开始的15uS以内采样总线
0049 DFFE             90             djnz    r7,$;
                      91     ;       mov     c,DQ;
004B 120000   F       92         call DQ_select_responses1   
004E 13               93             rrc     a;
004F 7F19             94             mov     r7,#25;延时50uS
0051 DFFE             95             djnz    r7,$;
                      96             ;mov    r7,#1;3;        恢复时间延时必须大于1uS
                      97             ;djnz   r7,$;
0053 00               98             NOP
0054 D2AF             99             setb    ea;开中断
0056 DCE8            100             djnz    r4,read_loop;
0058 D0D0            101             pop     psw;
005A 22              102             ret
005B                 103     DQ_select_responses1:
005B C0E0            104         PUSH        acc
005D 7402            105             mov             a,#2
005F 5580            106             anl             a,P0 ;选择对应的端口
0061 D3              107             setb            c
0062 6002            108             jz         c_next
0064 8001            109              sjmp   c_next1
0066 C3              110     c_next: clr     c
0067                 111     c_next1:
0067 D0E0            112             pop             acc
0069 22              113             ret 
                     114     ;===============================================================================
                     115     ;读取ROM序列码
                     116     ;函数原型:void read_rom(unsigned char data * buf)
                     117     ?PR?_read_rom?DS18B20   SEGMENT CODE 
                     118             PUBLIC  _read_rom
                     119     
----                 120     RSEG  ?PR?_read_rom?DS18B20     
0000                 121     _read_rom:
0000 EF              122             mov     a,r7;
0001 F8              123             mov     r0,a;
0002 7B08            124             mov     r3,#8;
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 PAGE     3

0004 120000   F      125             call    reset_ds18b20;
0007 7433            126             mov     a,#33h;
0009 120000   F      127             call    write_byte;
000C 120000   F      128     read:   call    read_byte;
000F F6              129             mov     @r0,a;
0010 08              130             inc     r0;
0011 DBF9            131             djnz    r3,read;
0013 120000   F      132             call    reset_ds18b20;
0016 22              133             ret     
                     134     
                     135     
                     136     
                     137     ;=================================================================================
                     138     ;单从设备温度转换函数
                     139     ;函数原型:void temp_conver(void)
                     140     ;
                     141     
                     142     ;=================================================================================
                     143     ?PR?temp_conver?DS18B20   SEGMENT CODE 
                     144             PUBLIC  temp_conver
                     145     
----                 146     RSEG  ?PR?temp_conver?DS18B20   
0000                 147     temp_conver:
0000 120000   F      148             call    reset_ds18b20;
0003 74CC            149             mov     A,#0cch;        //跳跃ROM命令
0005 120000   F      150             call    write_byte;
0008 7444            151             mov     A,#044h;        //温度转换命令
000A 120000   F      152             call    write_byte;     
000D 22              153             ret
                     154             
                     155     ;=================================================================================
                     156     ;主机读取单从设备暂存器函数
                     157     ;函数原型:void read_scrat(unsigned char data * buf,unsigned char n)
                     158     ;入口:r7(buf):数据缓冲区首址
                     159     ;       R5(n):欲读取的字节数   
                     160     ;================================================================================
                     161     ?PR?_read_scrat?DS18B20   SEGMENT CODE 
                     162             PUBLIC  _read_scrat
                     163     
----                 164     RSEG  ?PR?_read_scrat?DS18B20
0000                 165     _read_scrat: 
0000 EF              166             mov     a,r7;
0001 F8              167             mov     r0,a;
0002 ED              168             mov     a,r5;

⌨️ 快捷键说明

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