回顧我的18B20實驗,直到今晚才告一段落,讓我記住這一天2010年5月2日晚九點,現(xiàn)在回顧一下吧!
自從1602做出來后,我就致力于18B20溫度傳感器,因為他不僅體積小,而且是單總線,也是很先進的,我起初只意識到這東西的先進性,并沒有了解他的難度,記得是四月初吧,那晚我在1602成功后,驕傲的忘乎所以,于是自己編了一個ASM,寫進去直接傻逼!我那一晚試了七八次,都失敗了,一連幾晚編了寫,寫了編,還是失敗,我開始重新審視這個DS18B20,我上網(wǎng)找了大量的資料,什么中文的,英文的,全解的,入門的,還有程序,結(jié)果,還是失敗,現(xiàn)在看來,雖然我失敗了,但是我已初步了解了1820的構(gòu)造,和部分時序,半個月后,還是不行,我陷入思考中,為什么?時序不正確?要怎么做?后來想了一個辦法,讀溫度,顯示在P0口上,那樣一旦成功,在P0上會有所反應(yīng),結(jié)果,在一切正常下,竟然讀出一個0550H,而且不動,一直顯示50H,但那時我可以證明我的復(fù)位時序是對的,悲哀的是我不知道怎樣改了,有過了幾天,在網(wǎng)上找到了關(guān)于顯示0550H的信息,他們稱之為85現(xiàn)象,但是還是沒解決,大前天,我找了一段程序,寫入,竟然讓我眼前一亮,因為他可以讀出,我在此基礎(chǔ)上,看我的時序,原來是我時序出的問題,我按照手冊從新編寫,果然好了,讀出是溫度值,不過是BCD碼的,然后我著手讓他變成十進制,有在網(wǎng)上找公式,費了好大腦汁,寫出來,一試,有傻逼,真無語了,還有亂碼,直到今晚,我下了班,吃了飯,有來到電腦前,開機,運行KEIL,打開程序,把我的想發(fā)寫進去,失敗,我在一次看資料,說是得乘以0.0625,我想先不用這木弄,先乘以0.5,于是我組合高低字節(jié),然后,處以2,顯示,結(jié)果。。。。。,顯示12攝氏度,不可能啊,今天很熱,至少二十度,顯然,不正確,我反復(fù)搞了幾次,還是不行,但是我在偶然間,看到一個現(xiàn)象,就是我一按復(fù)位時,顯示42攝氏度我一想,復(fù)位時應(yīng)該是85才對,怎么是...42乘以2正好約等于85,數(shù)據(jù)處理問題,我馬上把處以2,去掉,又一試,我成功了,顯示25度,和空調(diào)上的數(shù)值一致,
我........淚.........
這是堅持不懈的結(jié)果,永不放棄的結(jié)果,在哪里摔倒,在哪里站起來,雖然我笨,但是別人能做到的我通過努力也一定會做到,我付出了一個月的晚上,在工地我也在想,沒事我就想,我心血太多了,我寫了二百多次,實驗更多了,開關(guān),通電斷電,資料在我電腦里存滿了,網(wǎng)站在我地址欄里擠滿了,今天.......不說了,看程序
ORG 0000H
DQ EQU P1.6
LSB EQU 50H
MSB EQU 51H
mov 30H,#00h ; 個位緩沖區(qū)
mov 31H,#00h ; 十位緩沖區(qū)
MOV 32H,#00H ; 百位緩沖區(qū)
MOV 33H,#00H; 千位緩沖區(qū)
mov dptr,#tab
MAIN:
LCALL GMP
lcall display
SJMP MAIN
GMP: SETB P1.6
LCALL RSET_18B20
MOV A,#0CCH
LCALL WRITE_18B20
MOV A,#44H
LCALL WRITE_18B20
LCALL DELAY
LCALL RSET_18B20
MOV A,#0CCH
LCALL WRITE_18B20
MOV A,#0BEH
LCALL WRITE_18B20
LCALL READ_18B20
MOV LSB,A
LCALL READ_18B20
MOV MSB,A
RET
RSET_18B20:SETB DQ
CLR DQ ;復(fù)位開始拉低總線500微秒等待應(yīng)答。
MOV R0,#100
W: NOP
NOP
NOP ;延時500 微秒
DJNZ R0,W
SETB DQ ;總線拉高
MOV R0,#30 ;延時60微秒
DJNZ R0,$
JB DQ,$ ;等待18B20應(yīng)答低脈沖為存在脈沖,MCU收到后才向下執(zhí)行。
MOV R0,#200 ;延時60微秒
DJNZ R0,$ ;切忌切忌哈哈哈
RET
WRITE_18B20:MOV R2,#8;一共8位數(shù)據(jù)
WE: CLR C
CLR DQ
MOV R0,#5
DJNZ R0,$
RRC A
MOV DQ,C
MOV R0,#22
DJNZ R0,$
SETB DQ
NOP
DJNZ R2,WE
RET
READ_18B20:MOV R2,#8
RE:SETB DQ
NOP
CLR C
CLR DQ
NOP
NOP
NOP
NOP
SETB DQ
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DQ
MOV R0,#21
DJNZ R0,$
RRC A
DJNZ R2,RE
RET
DELAY:MOV R0,#0FFH
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R0,$
RET
display:
MOV A,LSB
ANL A,#0F0H
SWAP A
MOV LSB,A ;消除小數(shù)
MOV A,MSB
ANL A,#07H
SWAP A
MOV MSB,A
ADD A,LSB
MOV B,#10
DIV AB
MOV 30H,B
MOV 31H,A
;*****************顯示子程序 **********************************************
clr P1.3
mov a,30H ;個位
movC A,@a+dptr
MOV P0,A ;向個位寫數(shù)據(jù)
lcall deley
sETb P1.3
clr p1.2
mov a,31H ;十位
movc A,@a+dptr
MOV P0,A;向十位寫數(shù)據(jù)
lcall deley
sETb P1.2
clr P1.1
mov a,32H;百位
movC A,@a+dptr
MOV P0,A;向百位寫數(shù)據(jù)
lcall deley
sETb P1.1
clr p1.0
mov a,33H ;千位
movc A,@a+dptr
MOV P0,A;向去千位寫數(shù)據(jù)
lcall deley
sETb P1.0
;;**************************************************
deley:mov r0,#01h
loop:mov r1,#0ffh
lo:nop
nop
nop
NOP
NOP
djnz r1,lo
djnz r0,loop
ret
tab:db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h
ret
END
5月2日晚于天津開發(fā)區(qū)第四項目部二樓宿舍
|