?? test1.asm
字號:
$include(c8051f020.inc)
WDDATA bit P1.3 ;//數據總線
exist1820 bit 20H;//表示是否檢測到18B20的標志位
tempH equ 40h;從18B20讀取的溫度高位數
tempL equ 41h;從18B20讀取的溫度低位數
ORG 0000H
LJMP MAIN;
MAIN:
MOV SP,#0B0H
MOV WDTCN,#0DEH
MOV WDTCN,#0ADH
MOV OSCXCN,#67H ;外部晶振11.0592MHz
CLR A
DJNZ ACC,$
DJNZ ACC,$
PORT1: MOV A,OSCXCN
JNB ACC.7,PORT1
MOV OSCICN,#88H ;允許檢測到時鐘丟失觸發復位, 切換為外部時鐘
MOV XBR2,#40H
MOV P1MDOUT,#00H
MOV P1,#0FFH
LOOP: LCALL GETTEMP;(讀取的溫度值在tempH,tempL中)
SJMP LOOP;
;溫度存放格式(右對齊)
; D7 D6 D5 D4 D3 D2 D1 D0
;tempH 0 0 0 0 0 2_+6 2_+5 2_+4
;tempL 2_+3 2_+2 2_+1 2_0 2_-1 2_-2 2_-3 2_-4
Init_1820:
SETB WDDATA ;按照時序拉高P3.0
LCALL DELAY1 ;延時一個機器周期1微秒
LCALL DELAY1
CLR WDDATA ;拉低數據線
MOV R5,#38;38
LCALL Delay ;調用延時子程序,發出一個540微秒的低脈沖
SETB WDDATA ;再次拉高數據線
LCALL DELAY1;
LCALL DELAY1;
MOV R5,#05 ;等待72微秒,其間收到低脈沖,證明18B20存在,否則不存在
LCALL DELAY;
TZ2: JNB WDDATA,TZ3
LJMP TZ4
TZ3: SETB exist1820 ;收到低脈沖,標志位置高,證明18B20存在
LJMP TZ5
TZ4: SETB exist1820;CLR exist1820 ;沒有低脈沖反饋,證明18B20沒有連接上,標志位置低
LJMP TZ7 ;TZ7將P3.0拉高
TZ5: MOV R5,#18;17;復位成功,按照時序延時240微秒
TZ6: LCALL DELAY1;
TZ7: SETB WDDATA
ret;
;540微秒延時
Delay:
DSDLY0: MOV R4,#230
DJNZ R4,$
DJNZ R5,DSDLY0;
ret;
;延時1us
Delay1:
nop;
nop;
NOP;
ret;
;讀出轉化后溫度值的子程序
GetTemp:
setb WDDATA; //定時入口
lcall Init_1820; //運行前先復位
jnb exist1820,gettempend; //如果檢測到18B20存在,跳到退出
mov A,#0cch;
lcall Write1820; //調用SKIP ROM命令
lcall delay1;
mov A,#044h;
lcall Write1820; //調用CONVERT命令,一定要先執行ROM命令再執行RAM命令
MOV R5,#55;54 ; //根據時序要求延時750微秒等待A/D轉換結束
LCALL Delay;
lcall Init_1820; //在讀溫度值前先復位
mov A,#0ccH;
lcall Write1820; //每下一個命令都要調用寫程序寫入
lcall delay1;
mov A,#0BEH;
lcall Write1820;
lcall Read1820;
mov tempL,A; //低位數
lcall Read1820;
mov tempH,A; //高位數
gettempend:
ret;
Write1820:
;程序入口為ACC
;寫溫度子程序
setb WDDATA;
LCALL DELAY1;
MOV R2,#8 ;//一個字節共8位
CLR C ;//清空進位位
wr18201: CLR WDDATA ;//拉低總線
MOV R5,#01H;//18B20開始工作,對數據進行采樣,等待16US
LCALL DELAY;
;LCALL DELAY1;
RRC A ;
MOV WDDATA,C ;//命令字按位依次送給18B20
MOV R5,#05H;//保證寫過程持續在60微秒
LCALL DELAY;
SETB WDDATA
MOV R5,#02H;//30微秒
LCALL DELAY;
;LCALL DELAY1;
DJNZ R2,WR18201 ;//未寫完一個字節的話繼續進行
SETB WDDATA
MOV R5,#06H;//100微秒
LCALL DELAY;
ret;
;讀溫度子程序,可以讀出9個8位數據,分別存入以60H開始的9個地址內
Read1820:
;setb WDDATA;
;LCALL DELAY1;
RE0: MOV R2,#8 ;//數據共有8位
RE1: CLR C
SETB WDDATA
LCALL DELAY1;
LCALL DELAY1;
CLR WDDATA
LCALL DELAY1;//保持低電平2微秒
LCALL DELAY1
LCALL DELAY1;
SETB WDDATA ;//
MOV R5,#01H;//等待18微秒,讓字節傳來
LCALL DELAY;
LCALL DELAY1;
LCALL DELAY1
LCALL DELAY1;
;SETB WDDATA;
;MOV R5,#01H;
;LCALL DELAY;
;CLR WDDATA;
;LCALL DELAY1;
;LCALL DELAY1;
;clr wddata;
;mov r5,#01h;
;lcall delay;
;setb wddata;
;lcall delay1;
;lcall delay1;
;lcall delay1;
;lcall delay1;
;mov c,wddata;
;mov r4,#04
;lcall delay;
;rrc a;
MOV C,WDDATA ;//主機按位依次讀入18B20數據
MOV R5,#05H;
LCALL DELAY;
RRC A ;//讀取數據移入A
DJNZ R2,RE1
LCALL DELAY1;
LCALL DELAY1
;LCALL DELAY1;
SETB WDDATA
ret; 返回數據在A中
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -