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

📄 ds18b20.lst

📁 用89C51单片机,LCD1602,建成的数字温度计.
💻 LST
📖 第 1 页 / 共 3 页
字号:
0003 FB              169             mov     r3,a;
0004 120000   F      170             call    reset_ds18b20; //
0007 74CC            171             mov     A,#0cch;        //跳跃ROM命令
0009 120000   F      172             call    write_byte;
000C 74BE            173             mov     A,#0beh;        //读暂存器命令
000E 120000   F      174             call    write_byte;     
0011                 175     r_scrat_loop:
0011 120000   F      176             call    read_byte;
0014 F6              177             mov     @r0,a;
0015 08              178             inc     r0;
0016 DBF9            179             djnz    r3,r_scrat_loop;
0018 120000   F      180             call    reset_ds18b20;
001B 22              181             ret
                     182     
                     183     
                     184     ;================================================================================
                     185     ;主机写单从设备的3个暂存器函数
                     186     ;函数原型:void write_scrat(unsigned char data * buf)
                     187     ;入口:R7(buf)欲写数据的首地址   
                     188     
                     189     ;================================================================================
                     190     ?PR?_write_scrat?DS18B20   SEGMENT CODE 
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 PAGE     4

                     191             PUBLIC  _write_scrat
                     192     
----                 193     RSEG  ?PR?_write_scrat?DS18B20
0000                 194     _write_scrat:
0000 7B03            195             mov     r3,#3;
0002 EF              196             mov     a,r7;
0003 F8              197             mov     r0,a;
0004 120000   F      198             call    reset_ds18b20; //
0007 74CC            199             mov     a,#0cch;        //跳跃ROM命令
0009 120000   F      200             call    write_byte;
000C 744E            201             mov     a,#04eh;        //写暂存器命令
000E 120000   F      202             call    write_byte;     
0011                 203     w_scrat_loop:
0011 E6              204             mov     a,@r0;
0012 120000   F      205             call    write_byte;//写数据
0015 08              206             inc     r0;
0016 DBF9            207             djnz    r3,w_scrat_loop;
0018 22              208             ret
                     209             
                     210     
                     211     
                     212     ;===================================================================================
                     213     
                     214     ;===================================================================================
                     215     ;温度数据(HEX)转换为8位(4字节)BCD码
                     216     ;函数原型:void hextobcd(unsigned char data * source ,unsigned char data * disten)
                     217     ;入口:source(R7):需转换数据的首地址指针;disten(R5):转换后数据保存地址指针
                     218     ;===================================================================================
                     219     ?PR?_hextobcd?DS18B20   SEGMENT CODE 
                     220             PUBLIC  _hextobcd
                     221     
----                 222     RSEG  ?PR?_hextobcd?DS18B20
0000                 223     _hextobcd:
0000 EF              224             mov     a,r7;
0001 F8              225             mov     r0,a;
0002 ED              226             mov     a,r5;
0003 F9              227             mov     r1,a;
0004 E6              228             mov     a,@r0;
0005 FD              229             mov     r5,a;//低字节
0006 08              230             inc     r0;
0007 E6              231             mov     a,@r0;
0008 FF              232             mov     r7,a;//高字节
0009 120000   F      233             call    neg;//判负求补
000C 120000   F      234             call    data_apart;整数与小数分离
000F 120000   F      235             call    hbcd;//转换为BCD码
0012 E8              236             mov     a,r0;//恢复数据指针
0013 FF              237             mov     r7,a;
0014 E9              238             mov     a,r1;
0015 FD              239             mov     r5,a;
0016 22              240             ret
                     241             
                     242             
                     243     
                     244     ;===================================================================================
                     245     
                     246     
                     247     
                     248     
                     249     ;===================================================================================
                     250     ;两字节HEX数据转换为两字节BCD(
                     251     ;入口:欲转换的数据在R6R7,R6为整数,R7为小数部分;
                     252     ;       R1=转换后BCD数据保存首地址
                     253      ;出口:转换后的BCD码首地址在R1中,(R1),(R1)+1为整数部分,(R1)的第7位为数据符号位:1
                             =负数;0=正数
                     254      ;      (R1)+2,(R1)+3为小数部分。
                     255     ;================================================================================= 
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 PAGE     5

0017                 256     hbcd:
                     257     ;整数部分转换   
0017 E9              258             mov     a,r1;
0018 C0E0            259             push    acc;
001A EE              260             mov     a,r6;
001B A2E7            261             mov     c,acc.7;
001D 92D5            262             mov     F0,c;//暂存符号位
001F 75F064          263             mov     b,#100;
0022 84              264             div     ab;
0023 A2D5            265             mov     c,F0;
0025 92E7            266             mov     acc.7,c;恢复符号位
0027 F7              267             mov     @r1,a;
0028 740A            268             mov     a,#10;
002A C5F0            269             xch     a,b;
002C 84              270             div     ab;
002D C4              271             swap    a;
002E 45F0            272             orl     a,b;
0030 09              273             inc     r1;
0031 F7              274             mov     @r1,a;
                     275     ;小数部分BCD码转换
0032 E4              276             clr     a;
0033 FA              277             mov     r2,a;
0034 FB              278             mov     r3,a;
0035 EF              279             mov     a,r7;
0036 30E702          280             jnb     acc.7,hbcd_1;
0039 7A50            281             mov     r2,#50h;
003B 30E605          282     hbcd_1: jnb     acc.6,hbcd_2;
003E EA              283             mov     a,r2;
003F 2425            284             add     a,#25h;
0041 FA              285             mov     r2,a;
0042 EF              286             mov     a,r7;
0043 30E507          287     hbcd_2: jnb     acc.5,hbcd_3;
0046 EA              288             mov     a,r2;
0047 2412            289             add     a,#12h;
0049 FA              290             mov     r2,a;
004A 7B50            291             mov     r3,#50h;
004C EF              292             mov     a,r7;
004D 30E409          293     hbcd_3: jnb     acc.4,hbcd_4;
0050 EA              294             mov     a,r2;
0051 2406            295             add     a,#06h;
0053 D4              296             da      a;
0054 FA              297             mov     r2,a;
0055 EB              298             mov     a,r3;
0056 2425            299             add     a,#25h;
0058 FB              300             mov     r3,a;
0059 EA              301     hbcd_4: mov     a,r2;
005A 09              302             inc     r1;
005B F7              303             mov     @r1,a;
005C EB              304             mov     a,r3;
005D 09              305             inc     r1;
005E F7              306             mov     @r1,a;
005F D0E0            307             pop     acc;//恢复数据指针
0061 F9              308             mov     r1,a;
0062 22              309             ret             
                     310     ;===================================================================================
                     311     ;数据求补运算子程序
                     312     ;入口:R5,R7;R7为高字节
                     313     ;出口:数据地址不变
                     314     ;===================================================================================
0063                 315     neg:
0063 EF              316             mov     a,r7;
0064 30E70D          317             jnb     acc.7,neg_ret;//判断数据是否是负数,若非负数则直接退出
0067 ED              318             mov     a,r5;              //否则求补
0068 F4              319             cpl     a;
0069 C3              320             clr     c;
006A 2401            321             add     a,#1;
A51 MACRO ASSEMBLER  DS18B20                                                              04/23/2007 23:23:06 PAGE     6

006C FD              322             mov     r5,a;
006D EF              323             mov     a,r7;
006E F4              324             cpl     a;
006F 3400            325             addc    a,#0;
0071 D2E3            326             setb    acc.3;//设置负数标志
0073 FF              327             mov     r7,a;
0074 22              328     neg_ret:        ret     
                     329     
                     330     
                     331                     
                     332     
                     333     
                     334     ;==========================================================================================
                     335     ;整数与小数部分的分离   
                     336     ;入口:数据在R6,R7中,R7为高字节
                     337     ;出口:分离的整数在R6中,小数在R7中
                     338     ;========================================================================================= 
                                  
0075                 339     data_apart:
0075 EF              340             mov     a,r7;//高字节
0076 540F            341             anl     a,#0fh;

⌨️ 快捷键说明

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