/******************************************************************
** 實(shí)驗(yàn)名:51單片機(jī)實(shí)驗(yàn)板溫度測(cè)量(DS18B20)
** 創(chuàng)建人: 謝軍洋
** 日 期: 2008/01/22
** 修改人: 51hei
** 描 述:P3.7口輸入,輸出數(shù)據(jù)。
**------------------------------------------------------------------
** CPU:MCS-51
** 語言:匯編
** Fosc=12M
此次試驗(yàn)的仿真圖
********************************************************************/
GE_BIT EQU 30H
SHI_BIT EQU 31H
BAI_BIT EQU 32H
DI_8BIT EQU 33H
GAO_8BIT EQU 34H
DQ EQU P3.7
ORG 0000H
LJMP START
ORG 0020H
START:
MOV SP,#60H
LCALL ZHUANHUAN ;調(diào)用讀溫度子程序
LCALL CHULI
LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
LJMP START
;-------------------------------------------------
;這是DS18B20復(fù)位初始化子程序
INIT_1820:
SETB DQ
NOP
CLR DQ ;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
MOV R1,#3
DU_1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,DU_1
SETB DQ ;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#25H
DU_2:JNB DQ,DU_3 ;等待DS18B20回應(yīng)
DJNZ R0,DU_2
LJMP DU_4 ;延時(shí)
DU_3:SETB F0 ;置標(biāo)志位,表示DS1820存在
LJMP DU_5
DU_4:CLR F0 ;清標(biāo)志位,表示DS1820不存在
LJMP DU_7
DU_5:MOV R0,#117
DU_6:DJNZ R0,DU_6 ;時(shí)序要求延時(shí)一段時(shí)間
DU_7:SETB DQ
RET
;-------------------------------------------------
;寫DS18B20的子程序(有具體的時(shí)序要求)
WRITE_1820:MOV R2,#8 ;一共8位數(shù)據(jù)
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中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_1820:MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#DI_8BIT ;低位存入DI_8BIT,高位存入GAO_8BIT
RE0:MOV R2,#8 ;數(shù)據(jù)一共有8位
RE1:CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE2:DJNZ R3,RE2
MOV C,DQ
MOV R3,#23
RE3:DJNZ R3,RE3
RRC A
DJNZ R2,RE1
MOV @R1,A
INC R1
DJNZ R4,RE0
/* DEC R1
MOV A,GAO_8BIT
XCHD A,@R1
XCH A,@R1
MOV GAO_8BIT,A
MOV A,@R1
SWAP A
MOV @R1,A */
RET
;-------------------------------------------------
;讀出后轉(zhuǎn)換的溫度值
ZHUANHUAN:
//SETB DQ
LCALL INIT_1820 ;先復(fù)位DS18B20
JB F0,ZH1
RET ;判斷DS1820是否存在?若DS18B20不存在則返回
ZH1:MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒
LCALL INIT_1820 ;準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;-------------------------------------------------
;數(shù)據(jù)處理子程序
CHULI:
MOV P0,GAO_8BIT
MOV P2,DI_8BIT
MOV A,GAO_8BIT
JB ACC.7,FU
MOV A,DI_8BIT
MOV B,#16
DIV AB
MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
MOV A,B ;將TEMPER_L的低四位X10/16得小數(shù)后一位數(shù).
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 36H,A ;將小數(shù)后一位數(shù).存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位數(shù),權(quán)重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入溫度值的整數(shù)部分
MOV B,#10
DIV AB
MOV GE_BIT,B ;個(gè)位存入30H中
MOV B,#10 ;
DIV AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
DIV AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
SJMP EXIT
FU:
MOV A,DI_8BIT
CPL A
ADD A,#1
MOV B,#16
DIV AB
MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
MOV A,B ;將TEMPER_L的低四位X10/16得小數(shù)后一位數(shù).
MOV B,#10
MUL AB
MOV B,#16
DIV AB
// MOV 36H,A ;將小數(shù)后一位數(shù).存入36H中
// MOV A,GAO_8BIT ;TEMPER_H中存放高8位數(shù),權(quán)重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入溫度值的整數(shù)部分
MOV B,#10
DIV AB
MOV GE_BIT,B ;個(gè)位存入30H中
MOV B,#10 ;
DIV AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
DIV AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
SJMP EXIT
EXIT:RET
;-------------------------------------------------
;注:此次ds18b20溫度測(cè)量實(shí)驗(yàn)在51hei單片機(jī)實(shí)驗(yàn)板http://www.torrancerestoration.com上進(jìn)行,測(cè)試一切ok,下面是數(shù)據(jù)顯示子程序
CL0:INC A
AJMP CL1
CHULI:MOV A,DI_8BIT
MOV B,#16
DIV AB
JB B.3,CL0
CL1:MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
MOV A,B ;將TEMPER_L的低四位X10/16得小數(shù)后一位數(shù).
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 36H,A ;將小數(shù)后一位數(shù).存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位數(shù),權(quán)重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入溫度值的整數(shù)部分
MOV B,#10
DIV AB
MOV GE_BIT,B ;個(gè)位存入30H中
MOV B,#10 ;
DIV AB ;
MOV SHI_BIT,B ;十位存入31H中
MOV B,#10 ;
DIV AB ;
MOV BAI_BIT,B ;百位存入32H中
MOV A,GAO_8BIT
MOV 37H,#10H ;
JB ACC.7,EXIT
MOV 37H,#00H
EXIT: RET */
DISPLAY:MOV DPTR,#TABLE
MOV R0,#4
XUN:MOV R1,#250 ;顯示1000次
HUAN:MOV A,#10 //顯示‘-’
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
LCALL DELAY1MS
SETB P3.0
MOV A,#10 //顯示‘-’
MOVC A,@A+DPTR
MOV P1,A
CLR P3.1
LCALL DELAY1MS
SETB P3.1
MOV A,BAI_BIT //顯示溫度百位
MOVC A,@A+DPTR
MOV P1,A
CLR P3.2
LCALL DELAY1MS
SETB P3.2
MOV A,SHI_BIT //顯示溫度十位
MOVC A,@A+DPTR
MOV P1,A
CLR P3.3
LCALL DELAY1MS
SETB P3.3
MOV A,GE_BIT //顯示溫度個(gè)位
MOVC A,@A+DPTR
MOV P1,A
CLR P3.4
LCALL DELAY1MS
SETB P3.4
MOV A,#11 //顯示'C'
MOVC A,@A+DPTR
MOV P1,A
CLR P3.5
LCALL DELAY1MS
SETB P3.5
MOV A,#10 //顯示‘-’
MOVC A,@A+DPTR
MOV P1,A
CLR P3.6
LCALL DELAY1MS
SETB P3.6
/* MOV A,#10 //顯示‘-’
MOVC A,@A+DPTR
MOV P1,A
CLR P3.7
LCALL DELAY1MS
SETB P3.7 */
DJNZ R1,HUAN ;250次沒完循環(huán)
DJNZ R0,XUN ;4個(gè)250次沒完循環(huán)
RET
DELAY10MS:MOV R7,#1 //延時(shí)10MS子程序
L1:NOP
DJNZ R7,L1
DELAY1MS:RET
TABLE:DB 3FH ;0
DB 06H ;1
DB 5BH ;2
DB 4FH ;3
DB 66H ;4
DB 6DH ;5
DB 7DH ;6
DB 07H ;7
DB 7FH ;8
DB 6FH ;9
DB 01000000B ;-
DB 39H ;C
END