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

📄 ex10-4.asm

📁 ds18b20温度采集及数码管显示
💻 ASM
📖 第 1 页 / 共 2 页
字号:

          TEMP_ZH   EQU  24H     ;实测温度值存放单元
          TEMPL     EQU  25H     
          TEMPH     EQU  26H     
          TEMP_TH   EQU  27H     ;高温报警值存放单元
          TEMP_TL   EQU  28H     ;低温报警值存放单元
          TEMPHC    EQU  29H     ;正、负温度值标记
          TEMPLC    EQU  2AH
          TEMPFC    EQU  2BH     
          K1     	EQU  P1.4	 ;查询按键
          K2     	EQU  P1.5    ;设置/调整键
          K3     	EQU  P1.6    ;调整键
          K4     	EQU  P1.7    ;确定键
          BEEP   	EQU  P3.7    ;蜂鸣器
          RELAY  	EQU  P1.3    ;指示灯
          LCD_X     EQU  2FH      ;LCD 字符显示位置
          LCD_RS    EQU  P2.0     ;LCD 寄存器选择信号
          LCD_RW    EQU  P2.1     ;LCD 读写信号
          LCD_EN    EQU  P2.2     ;LCD 允许信号
          FLAG1     EQU  20H.0    ;DS18B20是否存在标志
          KEY_UD    EQU  20H.1    ;设定按键的增、减标志
          DQ 		EQU  P3.3	  ;DS18B20数据信号
           ORG  0000H
           LJMP  MAIN
		   ORG   0030H
MAIN:     MOV  SP,#60H
          MOV  A,#00H
          MOV  R0,#20H       		;将20H~2FH 单元清零
          MOV  R1,#10H
CLEAR:    MOV  @R0,A
          INC  R0
          DJNZ  R1,CLEAR  
          LCALL  SET_LCD
          LCALL  RE_18B20  
START:    LCALL  RST          		;调用18B20复位子程序
          JNB   FLAG1,START1  		;DS1820不存在
          LCALL  MENU_OK			;DS1820存在,调用显示正确信息子程序
		  MOV	TEMP_TH,#055H		;设置TH初值85度
		  MOV	TEMP_TL,#019H		;设置TL初值25度
		  LCALL RE_18B20A			;调用暂存器操作子程序
          LCALL  WRITE_E2       	;写入DS18B20
          LCALL  TEMP_BJ        	;显示温度标记
          JMP   START2
START1:   LCALL  MENU_ERROR			;调用显示出错信息子程序
          LCALL  TEMP_BJ        	;显示温度标记
          SJMP  $
START2:   LCALL  RST				;调用DS18B20复位子程序
          JNB  FLAG1,START1    		;DS18B20不存在
          MOV   A,#0CCH        		;跳过ROM匹配命令
          LCALL  WRITE
          MOV   A,#44H         		;温度转换命令
          LCALL  WRITE
          LCALL  RST
          MOV   A,#0CCH        		;跳过ROM匹配
          LCALL  WRITE  
          MOV   A,#0BEH        		;读温度命令
          LCALL  WRITE
          LCALL  READ				;调用DS18B20数据读取操作子程序
          LCALL CONVTEMP			;调用温度数据BCD 码处理子程序
          LCALL DISPBCD				;调用温度数据显示子程序
          LCALL CONV				;调用LCD显示处理子程序
          LCALL TEMP_COMP			;调用实测温度值与设定温度值比较子程序
          LCALL  PROC_KEY       	;调用键扫描子程序
   		  SJMP START2				;循环
;*************************** 键扫描子程序 *****************************
PROC_KEY:JB  K1,PROC_K1    			
         LCALL  BEEP_BL
         JNB  K1,$
         MOV  DPTR,#M_ALAX1
         MOV  A,#1
         LCALL  LCD_PRINT
         LCALL  LOOK_ALARM
         JB  K3,$
         LCALL  BEEP_BL
         JMP  PROC_K2
PROC_K1: JB  K2,PROC_END			
         LCALL  BEEP_BL
         JNB  K2,$
         MOV   DPTR,#RST_A1
         MOV   A,#1
         LCALL  LCD_PRINT
         LCALL  SET_ALARM
         LCALL  RE_18B20           ;将设定的TH,TL值写入DS18B20
         LCALL  WRITE_E2
PROC_K2: LCALL  MENU_OK
         LCALL  TEMP_BJ
PROC_END:RET

;*************************** 设定温度报警值 TH、TL ***************************
SET_ALARM:LCALL  LOOK_ALARM
AS0:     JB   K1,AS00
         LCALL  BEEP_BL
         JNB  K1,$
         CPL  20H.1            ;UP/DOWN 标记
AS00:    JB  20H.1,ASZ01       ;20H.1=1,增加
         JMP  ASJ01            ;20H.1=0,减小
ASZ01:   JB  K2,ASZ02          ;TH值调整(增加)
         LCALL  BEEP_BL
         INC  TEMP_TH
         MOV  A,TEMP_TH
         CJNE  A,#120,ASZ011
         MOV  TEMP_TH,#0
ASZ011:  LCALL  LOOK_ALARM
         MOV  R5,#10
         LCALL  DELAY
         JMP  ASZ01
ASZ02:   JB  K3,ASZ03          	;TL值调整(增加)
         LCALL  BEEP_BL
         INC  TEMP_TL
         MOV  A,TEMP_TL
         CJNE  A,#99,ASZ021
         MOV  TEMP_TL,#00H
ASZ021:  LCALL  LOOK_ALARM   
         MOV  R5,#10
         LCALL  DELAY
         JMP  ASZ02
ASZ03:   JB  K4,AS0            	;确定调整
         LCALL  BEEP_BL
         JNB  K4,$
         RET
ASJ01:   JB  K2,ASJ02          	;TH值调整(减少)
         LCALL  BEEP_BL
         DEC   TEMP_TH
         MOV  A,TEMP_TH
         CJNE  A,#0FFH,ASJ011
         JMP  ASJ022
ASJ011:  LCALL  LOOK_ALARM
         MOV  R5,#10
         LCALL  DELAY
         JMP  AS0
ASJ02:   JB  K3,ASJ03         	;TL值调整(减少)
         LCALL  BEEP_BL
         DEC  TEMP_TL
         MOV  A,TEMP_TL
         CJNE  A,#0FFH,ASJ021
         JMP  ASJ022
ASJ021:  LCALL  LOOK_ALARM    ;
         MOV  R5,#10
         LCALL  DELAY
         JMP  AS0
ASJ022:  CPL  20H.1
         JMP  ASZ01
ASJ03:   JMP  ASZ03
         RET
RST_A1:  DB  " SET ALERT CODE " ,0

;*********************** 实测温度值与设定温度值比较子程序 **********************
TEMP_COMP:MOV  	A,TEMP_TH       
          SUBB 	A,TEMP_ZH       	;减数>被减数,则
          JC  	CHULI1            	;借位标志位C=1,转
		  MOV	A,TEMPFC
		  CJNE	A,#0BH,COMP
		  SJMP	CHULI2
COMP:     MOV  A,TEMP_ZH
          SUBB  A,TEMP_TL       	;减数>被减数,则
          JC  CHULI2            	;借位标志位C=1,转
          MOV  DPTR,#BJ5
          LCALL  TEMP_BJ3
          CLR   RELAY             	;点亮指示灯
          RET
 CHULI1:  MOV  DPTR,#BJ3
          LCALL  TEMP_BJ3
          SETB  RELAY               ;熄灭指示灯
          LCALL  BEEP_BL			;蜂鸣器响
          RET
 CHULI2:  MOV  DPTR,#BJ4
          LCALL  TEMP_BJ3
          SETB  RELAY               ;熄灭指示灯
          LCALL  BEEP_BL			;蜂鸣器响
          RET
;-----------------------------------------
TEMP_BJ3: MOV  A,#0CEH
          LCALL WCOM
          MOV  R1,#0
          MOV  R0,#2
BBJJ3:    MOV  A,R1
          MOVC A,@A+DPTR
          LCALL  WDATA
          INC R1
          DJNZ  R0,BBJJ3
          RET
BJ3:      DB  ">H"
BJ4:      DB  "<L"
BJ5:      DB  " !"
; 
;**************************** 显示温度标记子程序 ***************************
TEMP_BJ:  MOV  A,#0CBH
          LCALL WCOM
          MOV  DPTR,#BJ1  		;指针指到显示消息
          MOV  R1,#0
          MOV  R0,#2
BBJJ1:    MOV  A,R1
          MOVC A,@A+DPTR
          LCALL  WDATA
          INC R1
          DJNZ  R0,BBJJ1
          RET
BJ1:      DB  00H,"C"

;******************************** 显示正确信息子程序 ***************************
MENU_OK:  MOV  DPTR,#M_OK1  	;指针指到显示消息
          MOV  A,#1          	;显示在第一行
          LCALL  LCD_PRINT
          MOV  DPTR,#M_OK2  	;指针指到显示消息
          MOV  A,#2          	;显示在第一行
          LCALL  LCD_PRINT
          RET
M_OK1:    DB   "   DS18B20 OK   ",0
M_OK2:    DB   " TEMP:          ",0

;******************************** 显示出错信息子程序 ***************************
MENU_ERROR:MOV  DPTR,#M_ERROR1  ;指针指到显示消息
          MOV  A,#1          	;显示在第一行
          LCALL  LCD_PRINT
          MOV  DPTR,#M_ERROR2  	;指针指到显示消息1
          MOV  A,#2          	;显示在第一行
          LCALL  LCD_PRINT
          RET
M_ERROR1: DB   " DS18B20 ERROR  ",0
M_ERROR2: DB   " TEMP: ----     ",0

;****************************DS18B20复位子程序 *****************************
RST:  	SETB DQ
        NOP
        CLR DQ
        MOV R0,#6BH         ;主机发出延时复位低脉冲
        MOV R1,#04H
TSR1:   DJNZ R0,$
        MOV R0,#6BH
        DJNZ R1,TSR1
        SETB DQ        		;拉高数据线
        NOP
        NOP
        NOP
        MOV R0,#32H
TSR2:   JNB DQ,TSR3   		;等待DS18B20回应
        DJNZ R0,TSR2
        JMP TSR4             ; 延时
TSR3:   SETB FLAG1           ; 置1标志位,表示DS1820存在
        JMP TSR5
TSR4:   CLR FLAG1            ; 清0标志位,表示DS1820不存在
        JMP TSR7
TSR5:   MOV R0,#06BH
TSR6:   DJNZ R0,$            ; 时序要求延时一段时间
TSR7:   SETB DQ
        RET

;************************ DS18B20暂存器操作子程序 ***************************
RE_18B20:JB  FLAG1,RE_18B20A
        RET
RE_18B20A:
LCALL  RST
        MOV  A,#0CCH       		;跳过ROM匹配
        LCALL  WRITE
WR_SCRAPD:
        MOV  A,#4EH        		;写暂器
        LCALL  WRITE
        MOV  A,TEMP_TH     		;TH(报警上限)
        LCALL  WRITE
        MOV  A,TEMP_TL     		;TL(报警下限)
        LCALL  WRITE
        MOV  A,#7FH        		;12位精度
        LCALL  WRITE
        RET

;************************ 复制暂存器子程序 *******************************
WRITE_E2:LCALL  RST
        MOV  A,#0CCH        	;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#48H         	;把暂存器里的温度报警值拷贝到EEROM
        LCALL  WRITE
        RET

;*********************** 重读EEROM子程序 ********************************
READ_E2:LCALL  RST
        MOV  A,#0CCH        	;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#0B8H        	;把EEROM里的温度报警值拷贝回暂存器
        LCALL  WRITE
        RET

;************************ 将自定义字符写入LCD的CGRAM中 *********************
STORE_DATA:
        MOV  A,#40H
        LCALL  WCOM
        MOV  R2,#08H
        MOV  DPTR,#D_DATA
        MOV  R3,#00H
S_DATA: MOV  A,R3
        MOVC  A,@A+DPTR
        LCALL  WDATA      		;写入数据
        INC  R3
        DJNZ  R2,S_DATA
        RET
D_DATA: DB  0CH,12H,12H,0CH,00H,00H,00H,00H
;***********************  DS18B20数据写入操作子程序 ************************
WRITE:  MOV R2,#8            	;一共8位数据
        CLR  C
WR1:    CLR DQ        			;开始写入DS18B20总线要处于复位(低)状态
        MOV R3,#07
        DJNZ R3,$            	;总线复位保持16微妙以上
        RRC A                	;把一个字节DATA 分成8个BIT环移给C
        MOV DQ,C      			;写入一位
        MOV R3,#3CH
        DJNZ R3,$            	;等待100微妙
        SETB DQ       			;重新释放总线
        NOP
        DJNZ R2,WR1          	;写入下一位
        SETB DQ
        RET

;********************** DS18B20数据读取操作子程序  **************************
READ:    MOV R4,#4          	;将温度低位、高位、TH、TL从DS18B20中读出
         MOV R1,#TEMPL        	;存入25H、26H、27H、28H单元
RE00:    MOV R2,#8
RE01:    CLR CY
         SETB DQ
         NOP
         NOP
         CLR DQ        			;读前总线保持为低
         NOP
         NOP
         NOP
         SETB DQ       			;开始读总线释放
         MOV R3,#09           	;延时18微妙
         DJNZ R3,$
         MOV C,DQ      			;从DS18B20总线读得一位
         MOV R3,#3CH
         DJNZ R3,$            	;等待100微妙

⌨️ 快捷键说明

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