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

📄 temperature.lst

📁 《PIC单片机应用开发典型模块》源代码及图片
💻 LST
📖 第 1 页 / 共 2 页
字号:
A51 MACRO ASSEMBLER  TEMPERATURE                                                          06/23/2007 10:21:11 PAGE     1


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

LOC  OBJ            LINE     SOURCE

                       1     ;----------------------------------
                       2     ;                   温度检测实例
                       3     ;功能:从温度传感器DS18B20读写,然后将接收到的数据
                       4     ;             直接显示到两个数码管上
                       5     ;-----------------------------------
                       6     
                       7     ; 这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592mhz
                       8     ; 温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
                       9     ; 可以将检测到的温度直接显示到两个数码管上
                      10     ; 显示温度00到99度
0000                  11         ORG 0000H
                      12     ;----------------------------------
                      13     ;单片机内存分配申明
                      14     ;----------------------------------
  0029                15         TEMPER_L EQU 29H   ;  用于保存读出温度的低8位
  0028                16         TEMPER_H EQU 28H   ;  用于保存读出温度的高8位
  0038                17         FLAG1 EQU 38H       ;  是否检测到DS18B20标志位
  0020                18         A_BIT EQU 20h        ;  数码管个位数存放内存位置
  0021                19         B_BIT EQU 21h        ;   数码管十位数存放内存位置
                      20     ;----------------------------------
                      21     ;主循环,用来反复读温度和显示温度
                      22     ;----------------------------------
0000                  23     MAIN:
0000 120047           24         LCALL GET_TEMPER    ;  调用读温度子程序
                      25     ; 进行温度显示,这里考虑用两位数码管来显示温度
                      26     ; 显示范围00到99度,显示精度为1度
                      27     ; 因为12位转化时每一位的精度为0.0625度,不要求显示小数所以可以抛弃29H的低4位
                      28     ; 将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
                      29     
0003 E529             30         MOV A,29H
0005 A240             31         MOV C,40H            ;  将28H中的最低位移入C
0007 13               32         RRC A
0008 A241             33         MOV C,41H
000A 13               34         RRC A
000B A242             35         MOV C,42H
000D 13               36         RRC A
000E A243             37         MOV C,43H
0010 13               38         RRC A
0011 F529             39         MOV 29H,A
0013 1200AE           40         LCALL DISPLAY         ;  调用数码管显示子程序
0016 B290             41         CPL P1.0
0018 0100             42         AJMP MAIN
                      43     ;----------------------------------
                      44     ; 这是DS18B20复位初始化子程序
                      45     ;----------------------------------
001A                  46     INIT_1820:
001A D2A2             47         SETB P2.2                       ;  拉高2.2管脚的电平
001C 00               48         NOP
001D C2A2             49         CLR P2.2                        ;  拉低2.2管脚的电平
                      50     ;  主机发出延时537微秒的复位低脉冲
001F 7903             51         MOV R1,#3
0021                  52     TSR1:
0021 786B             53         MOV R0,#107
0023 D8FE             54         DJNZ R0,$               ;  当R0不等于0时,原地等待
0025 D9FA             55         DJNZ R1,TSR1           ;  当R1不等于0时,返回TSR1,用于延时
0027 D2A2             56         SETB P2.2               ;  然后拉高数据线,将18B20中的数据清零
0029 00               57         NOP
002A 00               58         NOP
A51 MACRO ASSEMBLER  TEMPERATURE                                                          06/23/2007 10:21:11 PAGE     2

002B 00               59         NOP
002C 7825             60         MOV R0,#25H
002E                  61     TSR2:
002E 30A205           62         JNB P2.2,TSR3            ;  等待DS18B20回应,有回应则跳到TSR3
0031 D8FB             63         DJNZ R0,TSR2            ;  如果等没到37次,则继续等待回应
0033 02003B           64         LJMP TSR4               ;  跳转到TSR4
0036                  65     TSR3:
0036 D238             66         SETB FLAG1              ;  置标志位,表示DS1820存在
0038 020040           67         LJMP TSR5                ;  跳转到TSR5
003B                  68     TSR4:
003B C238             69         CLR FLAG1                ;  清标志位,表示DS1820不存在
003D 020044           70         LJMP TSR7                 ;  跳转到TSR5
0040                  71     TSR5:
0040 7875             72         MOV R0,#117
0042                  73     TSR6:
0042 D8FE             74         DJNZ R0,TSR6              ;  时序要求延时一段时间
0044                  75     TSR7:
0044 D2A2             76         SETB P2.2                   ;  拉高数据线
0046 22               77         RET
                      78     ;----------------------------------
                      79     ; 读出转换后的温度值
                      80     ;----------------------------------
0047                  81     GET_TEMPER:
0047 D2A2             82         SETB P2.2                  ;  拉高数据线
0049 12001A           83         LCALL INIT_1820           ;  先复位DS18B20
004C 203803           84         JB FLAG1,TSS2             ;  如果检测到18B20,则跳转到TSS2
004F C2A2             85         CLR P2.2
0051 22               86         RET                       ;  判断DS1820是否存在?若DS18B20不存在则返回
0052                  87     TSS2:
0052 74CC             88         MOV A,#0CCH               ;  跳过ROM匹配
0054 120072           89         LCALL WRITE_1820          ;  调用写18B20指令,将累加器中的命令写进18B20中
0057 7444             90         MOV A,#44H                 ;  发出温度转换命令
0059 120072           91         LCALL WRITE_1820          ;  调用写18B20指令,将累加器中的命令写进18B20中
                      92     ;  这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
005C 1200AE           93         LCALL DISPLAY
005F 12001A           94         LCALL INIT_1820            ;  准备读温度前先复位
0062 74CC             95         MOV A,#0CCH               ;  跳过ROM匹配
0064 120072           96         LCALL WRITE_1820
0067 74BE             97         MOV A,#0BEH                ;  发出读温度命令
0069 120072           98         LCALL WRITE_1820
006C 12008A           99         LCALL READ_18200           ;  将读出的温度数据保存到35H/36H
006F C294            100         CLR P1.4
0071 22              101         RET
                     102     ;----------------------------------
                     103     ;写DS18B20的子程序(有具体的时序要求)
                     104     ;----------------------------------
0072                 105     WRITE_1820:
0072 7A08            106         MOV R2,#8                    ;  一共8位数据
0074 C3              107         CLR C                        ;  清除进位标志位
0075                 108     WR1:
0075 C2A2            109         CLR P2.2                      ;  拉低数据线60微秒以上后,将数据移位写入18B20
0077 7B05            110         MOV R3,#5
0079 DBFE            111         DJNZ R3,$                     ;  等待60微秒以上,完成写初始化,然后写入数据,
007B 13              112         RRC A                        ;  将累加器中的数据带进位右移
007C 92A2            113         MOV P2.2,C                   ;  将进位位写进18B20后,等待15微秒以上
007E 7B15            114         MOV R3,#21
0080 DBFE            115         DJNZ R3,$                     ;  等待15微秒以上,完成一比特的写操作
0082 D2A2            116         SETB P2.2                     ;  拉高数据线,初始化写

⌨️ 快捷键说明

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