回顾我的18B20实验,直到今晚才告一段落,让我记住这一天2010年5月2日晚九点,现在回顾一下吧!
自从1602做出来后,我就致力于18B20温度传感器,因为他不仅体积小,而且是单总线,也是很先进的,我起初只意识到这东西的先进性,并没有了解他的难度,记得是四月初吧,那晚我在1602成功后,骄傲的忘乎所以,于是自己编了一个ASM,写进去直接傻逼!我那一晚试了七八次,都失败了,一连几晚编了写,写了编,还是失败,我开始重新审视这个DS18B20,我上网找了大量的资料,什么中文的,英文的,全解的,入门的,还有程序,结果,还是失败,现在看来,虽然我失败了,但是我已初步了解了1820的构造,和部分时序,半个月后,还是不行,我陷入思考中,为什么?时序不正确?要怎么做?后来想了一个办法,读温度,显示在P0口上,那样一旦成功,在P0上会有所反应,结果,在一切正常下,竟然读出一个0550H,而且不动,一直显示50H,但那时我可以证明我的复位时序是对的,悲哀的是我不知道怎样改了,有过了几天,在网上找到了关于显示0550H的信息,他们称之为85现象,但是还是没解决,大前天,我找了一段程序,写入,竟然让我眼前一亮,因为他可以读出,我在此基础上,看我的时序,原来是我时序出的问题,我按照手册从新编写,果然好了,读出是温度值,不过是BCD码的,然后我着手让他变成十进制,有在网上找公式,费了好大脑汁,写出来,一试,有傻逼,真无语了,还有乱码,直到今晚,我下了班,吃了饭,有来到电脑前,开机,运行KEIL,打开程序,把我的想发写进去,失败,我在一次看资料,说是得乘以0.0625,我想先不用这木弄,先乘以0.5,于是我组合高低字节,然后,处以2,显示,结果。。。。。,显示12摄氏度,不可能啊,今天很热,至少二十度,显然,不正确,我反复搞了几次,还是不行,但是我在偶然间,看到一个现象,就是我一按复位时,显示42摄氏度我一想,复位时应该是85才对,怎么是...42乘以2正好约等于85,数据处理问题,我马上把处以2,去掉,又一试,我成功了,显示25度,和空调上的数值一致,
我........泪.........
这是坚持不懈的结果,永不放弃的结果,在哪里摔倒,在哪里站起来,虽然我笨,但是别人能做到的我通过努力也一定会做到,我付出了一个月的晚上,在工地我也在想,没事我就想,我心血太多了,我写了二百多次,实验更多了,开关,通电断电,资料在我电脑里存满了,网站在我地址栏里挤满了,今天.......不说了,看程序
ORG 0000H
DQ EQU P1.6
LSB EQU 50H
MSB EQU 51H
mov 30H,#00h ; 个位缓冲区
mov 31H,#00h ; 十位缓冲区
MOV 32H,#00H ; 百位缓冲区
MOV 33H,#00H; 千位缓冲区
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 ;复位开始拉低总线500微秒等待应答。
MOV R0,#100
W: NOP
NOP
NOP ;延时500 微秒
DJNZ R0,W
SETB DQ ;总线拉高
MOV R0,#30 ;延时60微秒
DJNZ R0,$
JB DQ,$ ;等待18B20应答低脉冲为存在脉冲,MCU收到后才向下执行。
MOV R0,#200 ;延时60微秒
DJNZ R0,$ ;切忌切忌哈哈哈
RET
WRITE_18B20:MOV R2,#8;一共8位数据
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 ;消除小数
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 ;向个位写数据
lcall deley
sETb P1.3
clr p1.2
mov a,31H ;十位
movc A,@a+dptr
MOV P0,A;向十位写数据
lcall deley
sETb P1.2
clr P1.1
mov a,32H;百位
movC A,@a+dptr
MOV P0,A;向百位写数据
lcall deley
sETb P1.1
clr p1.0
mov a,33H ;千位
movc A,@a+dptr
MOV P0,A;向去千位写数据
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日晚于天津开发区第四项目部二楼宿舍
|