?? 18b20.asm
字號:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能: DS18b20的顯示實驗
;使用環境:板上18b20接口,上拉電阻存在,只需把18B20的三根線接到相應位置即可,晶振為11.0592MHz
;使用資源:使用P2.7采集溫度,4位數碼管使用P0口,p2.0,p2.1,p2.2,p2.3控制顯示,采用描繪顯示方法
; 測試18B20存在P1.7口L8燈亮,不存在P1.0口L1燈亮
;聲 明: 此程序僅共參考,不一定準確,就算給大家一個"例程"吧,如果大家有不同意見,希望多多指正!
;提供者: 單片機試驗網
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;////////////數據定義///////////////////////////
TH EQU 38 ;高溫報警點
TL EQU 10 ;低溫報警點
TEMPH EQU 40H ;讀出寄存器5個單元的內容
TEMPL EQU 41H
REG2 EQU 42H
REG3 EQU 43H
REG4 EQU 44H
CONFIG9 EQU 1FH ;9位精度的CONFIG數據
COMFIG10 EQU 3FH ;10位精度的CONFIG數據
CONFIG11 EQU 5FH ;11位精度的CONFIG數據
CONFIG12 EQU 7FH ;12位精度的CONFIG數據
CNT EQU 20H ;中斷轉換時間
DAT EQU P2.7;數據線
FLAG1 BIT 00H ;測試DS18B20的存在
RS BIT p2.0;液晶控制接口
RW BIT p2.1
E BIT p2.2
;/////////////程序開始///////////////////////////
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIM0 ;定時器0中斷
ORG 0030H
MAIN:
MOV SP,#07H ;設定堆棧指針
LCALL RESET ;18b20復位
LCALL INIT ;初始化數碼管
MOV TMOD,#21H ;定時器0設置
MOV TH0,#00H
MOV TL0,#00H
SETB ET0
SETB TR0
CALL INITDISP
SETB EA
;CALL LCDDISP
STAR: ;LCALL DISP ;顯示溫度值
;lcall lcddisp
LJMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:;18B20復位程序,11.0592Mz單周期1US
SETB DAT
NOP
CLR DAT
;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
MOV R0,#0FFH
SETB DAT ;然后拉高數據線
TSR2: JNB DAT,TSR3;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3: SETB FLAG1 ; 置標志位,表示DS1820存在
CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.0
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7: SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------寫DS18B20的程序
WRITE: ;18B20寫入1個字節子程序
MOV R2,#8
CLR C
WR1: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#23
DJNZ R3,$
SETB DAT
NOP
DJNZ R2,WR1
SETB DAT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------------讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
;讀出溫度值的子程序RDTEMP
RDTEMP:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#TEMPL ; 低位存入41H(TEMPL),高位存入40H(TEMPH)
RE00: MOV R2,#8
RE01: CLR C
SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
NOP
SETB DAT
MOV R3,#7
DJNZ R3,$
MOV C,DAT
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVV:;數據處理子程序DIVV
MOV A,41H
MOV B,#16
DIV AB
MOV 74H,A ;將41H的高4位右移4位,存入74H中
MOV A,B
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 73H,A;70 ;將41H的低4位X10/16得小數后1位數
MOV A,40H
MOV B,#16
MUL AB
ADD A,74H
MOV B,#10
DIV AB
MOV 72H,B;71 ;將個位數存入72H中
MOV B,#10
DIV AB
MOV 71H,B;72 ;將十位數存入71H中
MOV A,40H
MOV 70H,#10H;73 ;如果為負則符號位為#10H
JB ACC.7,SA
MOV 70H,#00H ;如果為正則符號位為#00H
SA:
RET
;------------------讀出轉換后的溫度值
GET_TEMPER:
SETB DAT ; 定時入口
BCD: LCALL RESET
JB FLAG1,S22
LJMP BCD ; 若DS18B20不存在則返回
S22: LCALL DELAY1
MOV A,#0CCH ; 跳過ROM匹配------0CC
LCALL WRITE
MOV A,#44H ; 發出溫度轉換命令
LCALL WRITE
NOP
LCALL DELAY
LCALL DELAY
CBA: CALL RESET
JB FLAG1,ABC
LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE
LCALL RDTEMP ;READ_1820
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------延時子程序
DELAY: MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
;*************************************************
;液晶顯示程序
;*************************************************
INITDISP:
MOV R2,#38H ;0011 1000功能設置:采用8位數據總線,采用雙行顯示,采用5X7點陳
LCALL WRC ;寫入指令
ACALL DELAY11 ;延時程序
MOV R2,#0CH ;0000 1100光標/顯示移位:1為顯示移位,0為光標移位
ACALL WRC
ACALL DELAY11
MOV R2,#06H ;0000 0110輸入模式:1為AC增量模式,0為AC自減模式,顯示整體不移動
ACALL WRC
ACALL DELAY11
MOV R2,#01H ;清屏
LCALL WRC
ACALL DELAY11
mov P0,#01h;清屏
call enrw
mov P0,#38h;設為8位,5*7字 型兩行
call enrw
mov P0,#0Ch
call enrw
mov P0,#06h
call enrw
mov P0,#80h
call enrw
mov dptr,#yjtab
call rwram
mov P0,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
RET
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;寫入控制指令,數據放在R2中
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRC:
ACALL BUSY
CLR P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2;E使用信號
NOP
CLR P2.2;E使用能下降沿觸發
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;忙閑測試
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUSY:
CLR P2.0;RS=0讀寄存器 讀BF
SETB P2.1; R/W 1為讀,0為寫
NOP
SETB P2.2;E
NOP
MOV A,P0;讀取P0口
JB ACC.7,BUSY
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;寫入數據
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRD:
ACALL BUSY
SETB P2.0
CLR P2.1
CLR P2.2
MOV A,R2
MOV P0,A
NOP
SETB P2.2
NOP
CLR P2.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;寫入N個數據,R2為要顯示的數據,R4為顯示個數
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRN:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R2,A
LCALL WRD
DJNZ R4,WRN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序延時
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY11: MOV R6,#01H
DL0: MOV R7,#250
DL1: NOP
NOP
DJNZ R7,DL1
DJNZ R6,DL0
RET
/*
*/
LCDDISP:
MOV DPTR,#ASCII ;顯示第二行數據
MOV R2,#0CCH ;1100 0000 DDRAM地址設置為40h
LCALL WRC
;MOV R4,#16
;LCALL WRN
CLR A
MOV A,71H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD
MOV A,72H
MOVC A,@A+DPTR
;INC DPTR
MOV R2,A
LCALL WRD
RET
/******************/
MOV R1,#71
mov P0,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e
INC R1
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e
RET
enrw:clr rs
clr rw
clr e
call delay
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 P0,a
setb rs
clr rw
clr e
call delay
setb e
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*DISP: ;數碼管顯示程序,此程序要注意的是P2.7口的DS18B20數據采集,不能影響此口
MOV R1,#70H
DISP1:
CLR P2.0;第一個數碼管亮
SETB P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第二個數碼管亮
CLR P2.1
SETB P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第三個數碼管亮
SETB P2.1
CLR P2.2
SETB P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
ADD A,#80H;點亮小數點
MOV P0,A
LCALL DLYS
INC R1;
SETB P2.0;第四個數碼管亮
SETB P2.1
SETB P2.2
CLR P2.3
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
RET*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------重新寫DS18B20暫存存儲器設定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ; 發SKIP ROM命令
LCALL WRITE
MOV A,#4EH ; 發寫暫存存儲器命令
LCALL WRITE
MOV A,#00H ; TH(報警上限)中寫入00H
LCALL WRITE
MOV A,#00H ; TL(報警下限)中寫入00H
LCALL WRITE
MOV A,#7FH ; 選擇12位溫度分辨率
LCALL WRITE
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0: ;中斷處理程序
CLR TR0
CLR EA
MOV A,CNT
INC A
MOV CNT,A
CJNE A,#10,TZ ;刷新時間到一定的時間,就采集溫度,注意采集時間不能太快,太快就能時實顯示
MOV CNT,#00H
LCALL GET_TEMPER
LCALL DIVV
LCALL LCDDISP
TZ: MOV TH0,#00H ;設定定時器0的參數
MOV TL0,#00H
SETB EA
SETB TR0
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的數據,使用R0,R1,R3
MOV 70H,#00H ;初始化數碼管的顯示內容
MOV 71H,#00H
MOV 72H,#00H
MOV 73H,#00H
MOV CNT,#00H ;刷新時間初始化
LCALL RE_CONFIG ;配置DS18B20程序
LCALL GET_TEMPER ;獲得溫度值
LCALL DIVV ;溫度值進行轉換
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLYS: MOV R6,#1 ;延時處理程序
DLYS0:MOV R5,#60
DJNZ R5,$
DJNZ R6,DLYS0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3
DB 99H,92H,82H,0F8H;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -