當前位置:編程學習大全網 - 編程語言 - 基於AT89C51單片機和DS18B20溫度傳感器、LCD1602液晶顯示的高精度數字溫度計匯編程序

基於AT89C51單片機和DS18B20溫度傳感器、LCD1602液晶顯示的高精度數字溫度計匯編程序

DS18B20溫度傳感器、LCD1602液晶顯示的代碼

;XRF多功能51單片機開發板

;DS18B20測溫程序(液晶顯示,可測量0-99度)

;**************************************************************************

;**************************************************************

TEMPER_L EQU 36H ;從DS18B20中讀回高位,低位暫存區

TEMPER_H EQU 35H ;

TEMPER_NUM EQU 60H;溫度值存儲

TEMPER_GE EQU 61H

TEMPER_SHI EQU 62H

TEMPER_SAVE EQU 63H

FLAG1 BIT 00H

FLAG2 BIT 01H

RS BIT p2.0;液晶控制接口

RW BIT p2.1

E BIT p2.2

DQ BIT p3.5;單總線口

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN: MOV SP,#70H

LCALL GET_TEMPER

LCALL TEMPER_COV

LCALL LCDDISP

lcall d100ms

lcall d100ms

LJMP MAIN

NOP

;**************************************************

;讀出轉換後的溫度值

;**************************************************

GET_TEMPER:

SETB DQ ; 定時入口

BCD: LCALL INIT_1820

JB FLAG1,S22

LJMP BCD ; 若DS18B20不存在則返回

S22: LCALL DELAY1

MOV A,#0CCH ; 跳過ROM匹配------0CC命令

LCALL WRITE_1820

MOV A,#44H ; 發出溫度轉換命令

LCALL WRITE_1820

LCALL D100MS

CBA:LCALL INIT_1820

JB FLAG1,ABC

LJMP CBA

ABC:LCALL DELAY1

MOV A,#0CCH ; 跳過ROM匹配

LCALL WRITE_1820

MOV A,#0BEH ; 發出讀溫度命令

LCALL WRITE_1820

LCALL READ_18200 ;READ_1820

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

DJNZ R3,$

RRC A

MOV DQ,C

MOV R3,#23

DJNZ R3,$

SETB DQ

NOP

DJNZ R2,WR1

SETB DQ

RET

;****************************************************

;讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據

;****************************************************

READ_18200:

MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出

MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)

RE00:

MOV R2,#8

RE01:

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,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

;;****************************************************

;將從DS18B20中讀出的溫度數據進行轉換

;;****************************************************

TEMPER_COV:

MOV A,#0F0H

ANL A,TEMPER_L ; 舍去溫度低位中小數點後的四位溫度數值

SWAP A

MOV TEMPER_NUM,A ;得到低四位

MOV A,TEMPER_L

JNB ACC.3,TEMPER_COV1 ; 四舍五入去溫度值

INC TEMPER_NUM

TEMPER_COV1:

MOV A,TEMPER_H

ANL A,#07H

SWAP A

ORL A,TEMPER_NUM ;得到高四位,再與低四位相或得到值

MOV TEMPER_NUM,A ; 保存變換後的溫度數據

LCALL BIN_BCD

RET

;;****************************************************

;將16進制的溫度數據轉換成壓縮BCD碼

;;****************************************************

BIN_BCD:

MOV A,TEMPER_NUM

MOV B,#10

DIV AB

MOV TEMPER_SHI,A

MOV TEMPER_GE,B

RET

;****************************************************

;DS18B20初始化程序

;;****************************************************

INIT_1820:

SETB DQ

NOP

CLR DQ

MOV R0,#250

TSR1:

DJNZ R0,TSR1 ; 延時520us

SETB DQ

MOV R0,#25H ;96US-25H

TSR2:

DJNZ R0,TSR2

JNB DQ,TSR3;如D0為低則復位成功,DS18B20存在

LJMP TSR4 ; 延時

TSR3:

SETB FLAG1 ; 置標誌位,表示DS1820存在

LJMP TSR5

TSR4:

CLR FLAG1 ; 清標誌位,表示DS1820不存在

LJMP TSR7

TSR5:

MOV R0,#06BH ;200US

TSR6:

DJNZ R0,TSR6 ; 延時

TSR7:

SETB DQ ;拉高總線

RET

;*************************************************

;數碼顯示程序

;*************************************************

;*************************************************

;液晶顯示程序

;*************************************************

LCDDISP:

mov p1,#01h;清屏

call enrw

mov p1,#38h;設為8位,5*7字 型兩行

call enrw

mov p1,#0Ch

call enrw

mov p1,#06h

call enrw

mov p1,#80h

call enrw

mov dptr,#yjtab

call rwram

mov p1,#0C0h

call enrw

mov dptr,#yjtab1

call rwram

W_TEM:

mov p1,#0CCh

call enrw

MOV DPTR,#ASCII

MOV A,TEMPER_SHI

MOVC A,@A+DPTR

MOV P1,A

setb rs

clr rw

clr e

call D500us

setb e

MOV DPTR,#ASCII

MOV A,TEMPER_GE

MOVC A,@A+DPTR

MOV P1,A

setb rs

clr rw

clr e

call D500us

setb e

RET

enrw:clr rs

clr rw

clr e

call D500us

setb e

ret

rwram:mov r1,#00h

a1: mov a,r1

movc a,@a+dptr

call rwram2

inc r1

cjne a,#00h,a1

ret

rwram2:mov p1,a

setb rs

clr rw

clr e

call D500us

setb e

ret

;**************R***********************************

;延時子程序

;*************************************************

D500us:

MOV R6,#250;延時500us

DJNZ R6,$

RET

DELAY1:MOV R7,#20H

DJNZ R7,$

RET

D100MS: MOV R6,#200

D2: MOV R5,#250

DJNZ R5,$

DJNZ R6,D2

RET

yjtab: db ' XRF MCS-51 ',00h

yjtab1:db 'temperature:**`C',00h

ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

end

  • 上一篇:JAVA實訓報告
  • 下一篇:《鳥兒滿天飛》幼兒園大班教案
  • copyright 2024編程學習大全網