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

📄 zong.asm

📁 奉上刚做好的测温小制作--基于DS18B20传感器 今个学期刚学了单片机
💻 ASM
📖 第 1 页 / 共 2 页
字号:



;内存分配声明
TEMPER_L EQU 29H;用于保存读出温度的低字节
TEMPER_H EQU 28H;用于保存读出温度的高字节
T_DF EQU 27H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)
T_INTEGER EQU 26H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节


FLAG1 BIT 50H;位地址50H是字节2AH的最低位,用作是否检测到DS18B20的标志位

A_BIT EQU 20h ;液晶十位数存放内存位置
B_BIT EQU 21h ;液晶个位数存放内存位置
C_BIT EQU 22H ;个位小数
D_BIT EQU 23H ;十位小数
E_BIT EQU 24H ;百位小数
F_BIT EQU 25H ;千位小数


RS BIT P2.6 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
RW BIT P2.7
E  BIT P2.5


         ORG    0000H
         LJMP   MAIN
         ORG    0003H
         LJMP   INT
         ORG 0100H

MAIN:    SETB   EA
         SETB   EX0
         SETB   IT0
         LCALL MAIN1
         LCALL MAIN2
         LCALL MAIN3
         LCALL MAIN4
         LJMP  MAIN

INT:     MOV	A,P1
	 ORL	A,#0FH
	 MOV	P1,A
	 MOV    A,P1
         ANL    A,#0FH
         CJNE   A,#0FH,NEXT
         AJMP   INT2
NEXT:    JNB    ACC.3,FUNC3
         JNB    ACC.2,FUNC2
         JNB    ACC.1,FUNC1
         JNB    ACC.0,FUNC0
INT2:
         RETI

FUNC3:  LCALL MAIN4
FUNC31: MOV    A,P1
        JNB    ACC.3,FUNC31
        AJMP   INT2

FUNC2:  LCALL MAIN3
FUNC21: MOV    A,P1
        JNB    ACC.2,FUNC21
        AJMP   INT2

FUNC1:	LCALL MAIN2
FUNC11: MOV    A,P1
        JNB    ACC.1,FUNC11
        AJMP   INT2

FUNC0:  LCALL MAIN1
FUNC01: MOV    A,P1
        JNB    ACC.0,FUNC01
        AJMP   INT2

;----------------------------------------------

MAIN1:
       LCALL T_CONVERSION1;调用读温度子程序1
       LCALL T_FORMAT;将读出的2字节温度格式化
       LCALL DISPLAY;调用液晶显示子程序
       LCALL CHANEL1
       LCALL D1S;延时1秒后再测
       RET
MAIN2:
       LCALL T_CONVERSION2;调用读温度子程序2
       LCALL T_FORMAT;将读出的2字节温度格式化
       LCALL DISPLAY;调用液晶显示子程序
       LCALL CHANEL2
       LCALL D1S;延时1秒后再测
       RET
MAIN3:
       LCALL T_CONVERSION3;调用读温度子程序3
       LCALL T_FORMAT;将读出的2字节温度格式化
       LCALL DISPLAY;调用液晶显示子程序
       LCALL CHANEL3
       LCALL D1S;延时1秒后再测
       RET
MAIN4:
       LCALL T_CONVERSION4;调用读温度子程序4
       LCALL T_FORMAT;将读出的2字节温度格式化
       LCALL DISPLAY;调用液晶显示子程序
       LCALL CHANEL4
       LCALL D1S;延时1秒后再测
       RET



;--------------DS18B201的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION1:LCALL INIT_18201;先复位DS18B201
             JB FLAG1,T_C01
             RET ; 判断DS1820是否存在?若DS18B201不存在则返回

T_C01:       MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18201
             MOV A,#44H ; 发出温度转换命令
             LCALL WRITE_18201
             LCALL D1S  ;这里等待AD转换结束,12位的话要延时750m秒
             LCALL INIT_18201;准备读温度前先复位
             MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18201
             MOV A,#0BEH ; 发出读温度命令
             LCALL WRITE_18201
             LCALL READ_18201; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
             RET

;------DS18B201复位初始化程序-----------------------------------------
INIT_18201: SETB P1.4
            NOP
            CLR P1.4
            MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT10:     MOV R1,#150;;;;250
            DJNZ R1,$
            DJNZ R0,INIT10

            SETB P1.4;然后拉高数据线
            NOP

            MOV R0, #15
INIT11:     JNB P1.4, INIT13;延时60us等待DS18B20回应
            DJNZ R0, INIT11
            LJMP INIT14 ; 超时而没有响应
INIT13:      SETB FLAG1 ; 置标志位,表示DS1820存在
            LJMP INIT15
INIT14:      CLR FLAG1 ; 清标志位,表示DS1820不存在
            LJMP INIT16
INIT15:      MOV R0, #120
            DJNZ R0, $ ; 延时240us
INIT16:      SETB P1.4
            RET

;---------写DS18B201的子程序(有具体的时序要求)-------------------------------------
WRITE_18201:  MOV R2,#8;一共8位数据
WR10:         CLR P1.4
             MOV R3,#6
             DJNZ R3,$
             RRC A
             MOV P1.4,C
             MOV R3,#20
             DJNZ R3,$
             SETB P1.4
             NOP
             NOP
             DJNZ R2,WR10
             SETB P1.4
             RET

;------读DS18B201的程序,从DS18B201中读出两个字节的温度数据------------------------
READ_18201:  MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
            MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE10:        MOV R2,#8
RE11:        SETB P1.4
            NOP
            NOP
            CLR P1.4
            NOP
            NOP
            SETB P1.4
            MOV R3,#5
            DJNZ R3, $
            MOV C,P1.4
            MOV R3,#20
            DJNZ R3, $
            RRC A
            DJNZ R2,RE11
            MOV @R1,A
            DEC R1        ; 高位存入2EH(TEMPER_H)
            DJNZ R4,RE10
            RET
;--------------------------------------------------------------------
;--------------DS18B202的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION2:LCALL INIT_18202;先复位DS18B202
             JB FLAG1,T_C02
             RET ; 判断DS18202是否存在?若DS18B202不存在则返回

T_C02:       MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18202
             MOV A,#44H ; 发出温度转换命令
             LCALL WRITE_18202
             LCALL D1S  ;这里等待AD转换结束,12位的话要延时750m秒
             LCALL INIT_18202;准备读温度前先复位
             MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18202
             MOV A,#0BEH ; 发出读温度命令
             LCALL WRITE_18202
             LCALL READ_18202; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
             RET

;------DS18B202复位初始化程序-----------------------------------------
INIT_18202: SETB P1.5
            NOP
            CLR P1.5
            MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT20:     MOV R1,#150;;;;250
            DJNZ R1,$
            DJNZ R0,INIT20

            SETB P1.5;然后拉高数据线
            NOP

            MOV R0, #15
INIT21:     JNB P1.5, INIT23;延时60us等待DS18B20回应
            DJNZ R0, INIT21
            LJMP INIT24 ; 超时而没有响应
INIT23:      SETB FLAG1 ; 置标志位,表示DS1820存在
            LJMP INIT25
INIT24:      CLR FLAG1 ; 清标志位,表示DS1820不存在
            LJMP INIT26
INIT25:      MOV R0, #120
            DJNZ R0, $ ; 延时240us
INIT26:      SETB P1.5
            RET

;---------写DS18B202的子程序(有具体的时序要求)-------------------------------------
WRITE_18202:  MOV R2,#8;一共8位数据
WR20:         CLR P1.5
             MOV R3,#6
             DJNZ R3,$
             RRC A
             MOV P1.5,C
             MOV R3,#20
             DJNZ R3,$
             SETB P1.5
             NOP
             NOP
             DJNZ R2,WR20
             SETB P1.5
             RET

;------读DS18B202的程序,从DS18B202中读出两个字节的温度数据------------------------
READ_18202:  MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
            MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE20:        MOV R2,#8
RE21:        SETB P1.5
            NOP
            NOP
            CLR P1.5
            NOP
            NOP
            SETB P1.5
            MOV R3,#5
            DJNZ R3, $
            MOV C,P1.5
            MOV R3,#20
            DJNZ R3, $
            RRC A
            DJNZ R2,RE21
            MOV @R1,A
            DEC R1        ; 高位存入2EH(TEMPER_H)
            DJNZ R4,RE20
            RET

;-------------------------------------------------------------------
;--------------DS18B23的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION3:LCALL INIT_18203;先复位DS18B203
             JB FLAG1,T_C03
             RET ; 判断DS18203是否存在?若DS18B203不存在则返回

T_C03:       MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18203
             MOV A,#44H ; 发出温度转换命令
             LCALL WRITE_18203
             LCALL D1S  ;这里等待AD转换结束,12位的话要延时750m秒
             LCALL INIT_18203;准备读温度前先复位
             MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18203
             MOV A,#0BEH ; 发出读温度命令
             LCALL WRITE_18203
             LCALL READ_18203; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
             RET

;------DS18B203复位初始化程序-----------------------------------------
INIT_18203: SETB P1.6
            NOP
            CLR P1.6
            MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT30:     MOV R1,#150;;;;;250
            DJNZ R1,$
            DJNZ R0,INIT30

            SETB P1.6;然后拉高数据线
            NOP

            MOV R0, #15
INIT31:     JNB P1.6, INIT33;延时60us等待DS18B20回应
            DJNZ R0, INIT31
            LJMP INIT34 ; 超时而没有响应
INIT33:      SETB FLAG1 ; 置标志位,表示DS1820存在
            LJMP INIT35
INIT34:      CLR FLAG1 ; 清标志位,表示DS1820不存在
            LJMP INIT36
INIT35:      MOV R0, #120
            DJNZ R0, $ ; 延时240us
INIT36:      SETB P1.6
            RET

;---------写DS18B203的子程序(有具体的时序要求)-------------------------------------
WRITE_18203:  MOV R2,#8;一共8位数据
WR30:         CLR P1.6
             MOV R3,#6
             DJNZ R3,$
             RRC A
             MOV P1.6,C
             MOV R3,#20
             DJNZ R3,$
             SETB P1.6
             NOP
             NOP
             DJNZ R2,WR30
             SETB P1.6
             RET

;------读DS18B203的程序,从DS18B203中读出两个字节的温度数据------------------------
READ_18203:  MOV R4,#2 ; 将温度高位和低位从DS18B203中读出
            MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE30:        MOV R2,#8
RE31:        SETB P1.6
            NOP
            NOP
            CLR P1.6
            NOP

⌨️ 快捷键说明

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