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

📄 456.asm

📁 随着CPU技术的发展
💻 ASM
📖 第 1 页 / 共 2 页
字号:
            TEMP_H EQU 30H
            TEMP_L EQU 31H
            TEMP_NUM EQU 32H
            TEMP_BCD EQU 33H
            COUNTER_H EQU 34H
            COUNTER_L EQU 35H
            BCD_H EQU 36H
            BCD_L EQU 37H
            COUNTER EQU 36H
            FLAG1 BIT 00H
			DQ BIT P1.3
            LCD_E BIT P1.0
            LCD_RS BIT P1.2
            LCD_RW BIT P1.1
            LCD_DB EQU P0
            SWITCH BIT P1.4
            LARUM BIT P1.5


            ORG 0000H
            LJMP MAIN
            
            ORG 0030H
MAIN:       MOV SP,#70H
            SETB LARUM
            MOV TMOD,#05H       ;设定计数器0工作方式
            LCALL INI_1602      ;LCD初始化子程序调用
            LCALL TEXT
            CLR SWITCH

CYC:        LCALL TEMP          ;DS1820温度检测子程序调用
			LCALL CONVERSION    ;温度值转换子程序调用
            LJMP CYC            ;循环检测跳转

;********************************************************
;                     DS1820温度检测模块
;********************************************************

TEMP:		SETB DQ
LP1:		LCALL INI_1820     ;DS18B20初始化子程序调用
            JB FLAG1,LP2
			LJMP LP1           ;若DS18B20不存在则反复检测

LP2:  		MOV A,#0CCH       ;DS1820跳过ROM匹配指令------0CCH
			LCALL WRITE_1820  ;调用DS1820写入子程序
			MOV A,#44H        ;发出温度转换命令
			LCALL WRITE_1820  ;调用DS1820写入子程序

            LCALL MON      ;借用延时执行显示程序,提高利用率(模数转换)
            LCALL DP
            
CBA:		LCALL INI_1820     ;重新初始化
			JB FLAG1,ABC
			LJMP CBA
ABC:        MOV A,#0CCH        ;跳过ROM匹配
			LCALL WRITE_1820   ;调用DS1820写入子程序
			MOV A,#0BEH        ;DS1820读温度命令 ----0BEH
			LCALL WRITE_1820   ;调用DS1820写入子程序
			LCALL READ_18200   ;调用DS1820读取子程序读取温度
			RET
   
;------------------读DS18B20子程序,从DS18B20中读出一个字节的数据
READ_1820:	MOV R2,#8
RE1:		CLR C
			SETB DQ
			NOP
			NOP
			CLR DQ
			NOP
			NOP
			NOP
			SETB DQ
			MOV R3,#7
			DJNZ R3,$
			MOV C,DQ
			MOV R3,#23
			DJNZ R3,$
			RRC A
			DJNZ R2,RE1
			RET

;-------------------写DS18B20子程序
WRITE_1820:	MOV R2,#8     ;写入位数
			CLR C
WR1:		CLR DQ       ;拉低总线,写开始
			MOV R3,#6    ;延时12us+2us
			DJNZ R3,$
			RRC A       ;移入一位给CY
			MOV DQ,C    ;送出
			MOV R3,#20 ;延时40us+2us
			DJNZ R3,$
			SETB DQ     ;释放总线,写一位结束
            DJNZ R2,WR1  ;判断一个字节数据写入
            RET
   
;-------------------读DS18B20子程序,从DS18B20中读出两个字节的温度数据
READ_18200:	MOV R4,#2         ;将温度高位和低位从DS18B20中读出
			MOV R1,#TEMP_L    ;低位存入TEMP_L,高位存入TEMP_H
READ1:		MOV R2,#8         ;一字节判断
READ2:		CLR C
			SETB DQ
			NOP
			NOP
			CLR DQ   ;拉低总线,读开始
            NOP      ;1us
			NOP      ;1us
   			SETB DQ   ;1us
			MOV R3,#5   ;1us
			DJNZ R3,$    ;10us     延时14us
            MOV C,DQ     ;读入信号
			MOV R3,#23
			DJNZ R3,$    ;46us
			RRC A        ;读取信号移入A
			DJNZ R2,READ2 ;循环读取
			MOV @R1,A
			DEC R1
			DJNZ R4,READ1
			RET

;-------------------将从DS18B20中读出的温度数据进行转换
CONVERSION:	MOV A,TEMP_L
			ANL A,#0F0H ; 舍去温度低位中小数点后的四位温度数值
			SWAP A
			MOV TEMP_NUM,A

	        MOV A,TEMP_H
			ANL A,#07H
			SWAP A
			ORL A,TEMP_NUM
			MOV TEMP_NUM,A ; 保存变换后的温度数据

            MOV A,TEMP_L
			JNB ACC.3,TEMP_COV1 ; 四舍五入温度值
			INC TEMP_NUM

TEMP_COV1:  LCALL BIN_BCD
			RET
   
;-------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD:	MOV DPTR,#TEMP_TAB
			MOV A,TEMP_NUM
			MOVC A,@A+DPTR
			MOV TEMP_BCD,A
			RET

TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H

;-------------------DS18B20初始化程序
INI_1820:	SETB DQ      ;释放总线
			NOP
			CLR DQ       ;拉低总线
            LCALL DELAY2     ;延时512us
			SETB DQ           ;释放总线
            LCALL DELAY1      ;延时64us
            JNB DQ,TSR1       ;判断DS1820存在信号
            LJMP TSR2
TSR1:		SETB FLAG1        ;置标志位1,表示DS1820存在
			LJMP TSR3
TSR2:		CLR FLAG1         ;清标志位1,表示DS1820不存在
			LJMP TSR4
TSR3:		MOV R0,#100       ;延时200us
            DJNZ R0,$
TSR4:		SETB DQ
			RET
   
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:		JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
                RET
RE_CONFIG1:		MOV A,#0CCH ; 发SKIP ROM命令
                LCALL WRITE_1820
			    MOV A,#4EH ; 发写暂存存储器命令
			    LCALL WRITE_1820

			    MOV A,#00H ; TH(报警上限)中写入00H
			    LCALL WRITE_1820
			    MOV A,#00H ; TL(报警下限)中写入00H
			    LCALL WRITE_1820
			    MOV A,#7FH ; 选择12位温度分辨率
			    LCALL WRITE_1820
			    RET
   
;------------------延时子程序
DELAY:			MOV R7,#00H      ;延时132ms
MIN:			DJNZ R7,YS500
                RET

YS500:			LCALL DELAY2
			    LJMP MIN

DELAY2: 		MOV R6,#00H      ;延时512us
			    DJNZ R6,$
			    RET

DELAY1:		MOV R7,#20H  ;延时64us
			DJNZ R7,$
			RET
   

;****************************************************
;                     显示子程序模块
;****************************************************

MON:     LCALL TEMP_MON
         LCALL REV_MON
         RET


;------------------1602通用液晶初始化子程序
INI_1602:   MOV R1,#38H
            LCALL WRITE_IR
            MOV R1,#01H
            LCALL WRITE_IR
            MOV R1,#06H
            LCALL WRITE_IR
            MOV R1,#0CH
            LCALL WRITE_IR
            RET
            

;-------------------1602通用液晶忙态检测子程序
BF:         CLR LCD_RS
            SETB LCD_RW
            SETB LCD_E
            SETB LCD_DB.7
            JB LCD_DB.7,BF
            CLR LCD_E
            RET
            
            
;-------------------写LCD指令寄存器子程序
WRITE_IR:   LCALL BF
            CLR LCD_RS
            CLR LCD_RW
            SETB LCD_E
            MOV LCD_DB,R1
            CLR LCD_E
            RET
            
;-------------------写LCD数据寄存器子程序
WRITE_DR:   LCALL BF
            SETB LCD_RS
            CLR LCD_RW
            SETB LCD_E
            MOV LCD_DB,R2
            CLR LCD_E
            RET
            

TEMP_MON:   MOV DPTR,#NUM_TAB
            MOV R1,#85H
            LCALL WRITE_IR
            MOV A,TEMP_BCD
            ANL A,#0F0H
            SWAP A
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            MOV A,TEMP_BCD
            ANL A,#0FH
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            MOV R2,#43H
            LCALL WRITE_DR
            RET
            
            
REV_MON:    MOV A,COUNTER
            MOV B,#60
            MUL AB
            MOV COUNTER_L,B
            MOV COUNTER_H,A

            CLR A
            CLR C
            MOV BCD_L,A
            MOV BCD_H,A
            MOV R7,#10H
REV_01:     MOV A,COUNTER_H
            RLC A
            MOV COUNTER_H,A
            MOV A,COUNTER_L
            RLC A
            MOV COUNTER_L,A
            MOV A,BCD_L
            ADDC A,BCD_L
            DA A
            MOV BCD_L,A
            MOV A,BCD_H
            ADDC A,BCD_H
            DA A
            MOV BCD_H,A
            DJNZ R7,REV_01
            
            MOV DPTR,#NUM_TAB
            MOV R1,#0C4H
            LCALL WRITE_IR
            MOV A,BCD_H
            ANL A,#0F0H
            SWAP A
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            MOV A,BCD_H
            ANL A,#0FH
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            MOV A,BCD_L
            ANL A,#0F0H
            SWAP A
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            MOV A,BCD_L
            ANL A,#0FH
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR



            RET

NUM_TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
        DB 41H,42H,43H,44H,45H,46H

;-------------------不用更新的字符显示子程序

TEXT:       MOV DPTR,#TEXT_TAB
            MOV R1,#80H             ;第一行显示
            LCALL WRITE_IR
            MOV R3,#5H
            LCALL LOOP1
            
            MOV R1,#0C0H            ;第二行显示
            LCALL WRITE_IR
            MOV R3,#4H
            LCALL LOOP1
            RET
            
LOOP1:      MOV A,#00H
            MOVC A,@A+DPTR
            MOV R2,A
            LCALL WRITE_DR
            INC DPTR
            DJNZ R3,LOOP1

⌨️ 快捷键说明

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