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

📄 ds18b20temperature.asm

📁 控制器实用单片机AT89C2051,温度传感器实用DS18B20,用4位共阳LED数码管以动态扫描法实现温度显示。
💻 ASM
字号:
;DS18B20温度计
;采用4位LED共阳显示器显示测温值,显示精度0.1摄氏度,测温范围-55-+125
;AT89C51,12MHZ晶振

;===============
;常数定义
;===============
TIMEL  EQU  0E0H    ;20ms,定时器0时间常数
TIMEH  EQU  0B1H
TEMPHEAD  EQU  36H

;===============
;工作内存定义
;===============
BITST  DATA  20H
TIME1SOK BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL  DATA  26H
TEMPH  DATA  27H
TEMPHC DATA  28H
TEMPLC DATA  29H

;===============
;引脚定义
;===============
TEMPDIN  BIT  P3.7

;===============
;中断向量区
;===============
ORG  0000H
LJMP START

ORG  00BH
LJMP T0IT

;===============
;系统初始化
;===============
ORG 100H

START:
	MOV SP,#60H
CLSMEM:
	MOV R0,#20H
	MOV R1,#60H
CLSMEM1:
	MOV @R0,#00H
	INC R0
	DJNZ R1,CLSMEM1
	MOV TMOD,#00100001B   ;定时器0,工作方式1(16BIT)
	MOV TH0,#TIMEL
	MOV TL0,#TIMEH        ;20ms
	SJMP INIT

ERROR:
	NOP
	LJMP START

	NOP
INIT:
	NOP
	SETB ET0
	SETB TR0
	SETB EA
	MOV PSW,#00H
	CLR TEMPONEOK
	LJMP MAIN

;==========================
;定时器0中断服务程序
;==========================
T0IT:
	PUSH PSW
	MOV PSW,#10H
	MOV TH0,#TIMEH
	MOV TL0,#TIMEL
	INC R7
	CJNE R7,#32H,T0IT1
	MOV R7,#00H
	SETB TIME1SOK             ;1s定时到标志 
T0IT1:  POP PSW
	RETI


;===========================
;主程序
;===========================
MAIN:
	LCALL DISP1     ;调用显示子程序
	JNB TIME1SOK,MAIN
	CLR TIME1SOK    ;测温每1s一次
	JNB TEMPONEOK,MAIN2  ;上电时先温度转换一次
	LCALL READTEMP1    ;读出温度值子程序
	LCALL CONVTEMP     ;温度BCD码计算处理子程序
	LCALL DISPBCD      ;显示区BCD码温度值刷新子程序
	LCALL DISP1        ;消闪烁,显示一次
MAIN2:
	LCALL READTEMP
	SETB TEMPONEOK
	LJMP MAIN
	
	
;============================
;============================
;子程序区
;============================
;RESET DS18B20
;============================
INITDS1820:
	SETB TEMPDIN
	NOP
	NOP
	CLR TEMPDIN
	MOV R6,#0A0H     ;DELAY 480us   
	DJNZ R6,$
	MOV R6,#0A0H
	DJNZ R6,$
	SETB TEMPDIN
	MOV R6,#32H      ;DELAY 70us 
	DJNZ R6,$
	MOV R6,#3CH
LOOP1820:
	MOV C,TEMPDIN
	JC  INITDS1820OUT
	DJNZ R6,LOOP1820
	MOV R6,#064H      ;DELAY 200us
	DJNZ R6,$
	SJMP INITDS1820
	RET
INITDS1820OUT:
	SETB TEMPDIN
	RET

;============================
;读DS18B20的程序,从DS18B20中读出一个字的数据
;===========================
READDS1820:
	MOV R7,#08H
	SETB  TEMPDIN
	NOP
	NOP
READDS1820LOOP:
	CLR  TEMPDIN
	NOP
	NOP
	NOP
	SETB TEMPDIN
	MOV R6,#07H
        DJNZ R6,$
        MOV C,TEMPDIN
	MOV R6,#3CH
        DJNZ R6,$
        RRC A
        SETB TEMPDIN
        DJNZ R7,READDS1820LOOP
        MOV  R6,#3CH
        DJNZ R6,$
        RET

;===================================
;写DS18B20的程序,从DS18B20中写一个字节的数据
;====================================
WRITEDS1820:
	MOV R7,#08H
	SETB TEMPDIN
	NOP
	NOP
WRITEDS1820LOOP:
	CLR TEMPDIN
	MOV R6,#07H
        DJNZ R6,$
        RRC A
        MOV TEMPDIN,C
	MOV R6,#34H
        DJNZ R6,$
        SETB TEMPDIN
        DJNZ R7,WRITEDS1820LOOP
        RET

;========================
;READ TEMP
;========================
READTEMP:
	LCALL INITDS1820
	MOV A,#0CCH
	LCALL WRITEDS1820
	MOV R6,#34H
	DJNZ R6,$
	MOV A,#44H
	LCALL WRITEDS1820
	MOV R6,#34H
	DJNZ R6,$
	RET

READTEMP1:
	LCALL INITDS1820
	MOV A,#0CCH
	LCALL WRITEDS1820
	MOV R6,#34H
	DJNZ R6,$
	MOV A,#0BEH
	LCALL WRITEDS1820
	MOV R6,#34H
	DJNZ R6,$
	MOV R5,#09H
	MOV R0,#TEMPHEAD
	MOV B,#00H

READTEMP2:
	LCALL READDS1820
	MOV @R0,A
	INC R0

READTEMP21:
	LCALL CRC8CAL
	DJNZ R5,READTEMP2
	MOV A,B
	JNZ READTEMPOUT
	MOV A,TEMPHEAD+0
	MOV TEMPL,A
	MOV A,TEMPHEAD+1
	MOV TEMPH,A
READTEMPOUT:
	RET

;=========================
;处理温度BCD码子程序
;========================
CONVTEMP:
	MOV A,TEMPH
	ANL A,#80H
	JZ TEMPC1
	CLR C
	MOV A,TEMPL
	CPL A
	ADD A,#01H
	MOV TEMPL,A
	MOV A,TEMPH
	CPL A
	ADDC A,#00H
	MOV TEMPHC,#0BH
	SJMP TEMPC11

TEMPC1: MOV TEMPHC,#0AH
TEMPC11:
	MOV A,TEMPHC
	SWAP A
	MOV TEMPHC,A
	MOV A,TEMPL
	ANL A,#0FH
	MOV DPTR,#TEMPDOTTAB
	MOVC A,@A+DPTR
	MOV TEMPLC,A

	MOV A,TEMPL
	ANL A,#0F0H
	SWAP A
	MOV TEMPL,A
	MOV A,TEMPH
	ANL A,#0FH
	SWAP A
	ORL A,TEMPL
	LCALL HEX2BCD1
	MOV TEMPL,A
	ANL A,#0F0H
	SWAP A
	ORL A,TEMPHC
	MOV TEMPHC,A
	MOV A,TEMPL
	ANL A,#0FH
	SWAP A
	ORL A,TEMPLC
	MOV TEMPLC,A
	MOV A,R7
	JZ TEMPC12
	ANL A,#0FH
	SWAP A
	MOV R7,A
	MOV A,TEMPHC
	ANL A,#0FH
	ORL A,R7
	MOV TEMPHC,A
TEMPC12:
	RET

;============================
;小数部分码表
;============================
TEMPDOTTAB:
	DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H

;=============================
;显示区BCD码温度值刷新程序
;=============================
DISPBCD:
	MOV A,TEMPLC
	ANL A,#0FH
	MOV 70H,A
	MOV A,TEMPLC
	SWAP A
	ANL A,#0FH
	MOV 71H,A
	MOV A,TEMPHC
	ANL A,#0FH
	MOV 72H,A
	MOV A,TEMPHC
	SWAP A
	ANL A,#0FH
	MOV 73H,A
	MOV A,TEMPHC
	ANL A,#0F0H
	CJNE A,#010H,DISPBCD0
	SJMP DISPBCD2
DISPBCD0:
	MOV A,TEMPHC
	ANL A,#0FH
	JNZ DISPBCD2
	MOV A,TEMPHC
	SWAP A
	ANL A,#0FH
	MOV 73H,#0AH
	MOV 72H,A
DISPBCD2:
	RET

;===========================
;显示子程序
;===========================

DISP1:
	MOV R1,#70H
	MOV R5,#0FEH
PLAY:
	MOV P1,#0FFH
	MOV A,R5
	MOV P3,A
	MOV A,@R1
	MOV DPTR,#TAB
	MOVC A,@A+DPTR
	MOV P1,A
	MOV A,R5
	JB ACC.1,LOOP5
	CLR P1.7
LOOP5:
	LCALL DL1MS
	INC R1
	MOV A,R5
	JNB ACC.3,ENDOUT
	RL  A
	MOV R5,A
	AJMP PLAY
ENDOUT:
	MOV P1,#0FFH
	MOV P3,#0FFH
	RET
TAB:
	DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共阳段码表 0 1 2 3 4 5 6 7 8 9 不亮 -

DL1MS:
	MOV R6,#14H
DL1:
	MOV R7,#19H
DL2:
	DJNZ R7,DL2
	DJNZ R6,DL1
	RET

;==========================
;单字节十六进制转BCD
;==========================
HEX2BCD1:
	MOV B,#64H
	DIV AB
	MOV R7,A
	MOV A,#0AH
	XCH A,B
	DIV AB
	SWAP A
	ORL A,B
	RET

;=============================
;Calculate CRC-8 Values.Uses the CCITT-8 Polynomial,Expressed Aa
;x^8+x^5+x^4+1
;=============================

CRC8CAL:
	PUSH ACC
	MOV R7,#08H
CRC8LOOP1:
	XRL A,B
	RRC A
	MOV A,B
	JNC CRC8LOOP2
	XRL A,#18H
CRC8LOOP2:
	RRC A
	MOV B,A
	POP ACC
	RR A
	PUSH ACC
	DJNZ R7,CRC8LOOP1
	POP ACC
	RET
	
END

⌨️ 快捷键说明

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