发表于:2005-06-30 09:23:00
164楼
求助:情况如下:我用89c52控制18B20做现场单点温度测试(30米,5V供电,加上拉电阻4.7K),用普通线室内没问题,现场用双心屏蔽线干扰比较严重,显示255与实际温度值来回切换。
回来后做了以下实验:
1、用8芯屏蔽网线连接通过。
2、加74HC244驱动(1A1.2Y1接P3.7。1Y1.2A1接18B20;/G1接地;/G2接P1.7),用模拟板调试(不是连续测量)通过。把程序写入控制仪并分别用普通电线和8芯屏蔽网线连接18B20测试,网线通过,普通线显示255C偶尔显示(28C)。
问题:1、为啥不加244驱动两种线都能通过;加了只能通过一种。是否因阻抗不同引起???
2、加244驱动后还要加4。7K电阻吗,实验中加不加没有影响。
请有经验的朋友给予指导,谢谢!
附程序如下:
主程序:(4MHz晶振,3us/周期)
00 NOP
C2AF CLR EA 关中断
1212A0 LCALL INI0 初始化
BA0032 CJNZ R2 #00H 无传感器,转走
74CC MOV A #CCH
1212E0 LCALL WR0 发跳过ROM命令
7444 MOV A #44H
1212E0 LCALL WR0 发启动转换命令
1212A0 LCALL INI0
74CC MOV A #CCH
1212E0 LCALL WR0 发跳过ROM命令
74BE MOV A #BEH
1212E0 LCALL WR0 发读存储器命令
121300 LCALL RD0 读温度值
F527 MOV 27H A 温度值低位字节送27H
121300 LCALL RD0
F528 MOV 28H A 温度值高位字节送28H
E527 MOV A 27H 字节调整
A240 MOV C 40H
13 RRC A
A241 MOV C 41H
13 RRC A
A242 MOV C 42H
13 RRC A
A243 MOV C 43H
13 RRC A
78CO MOV R0 #C0H 结果存入C0H
F6 MOV @R0 A
D2AF SETB EA 开中断
22 RET
初始化子程序
00 NOP
7903 INIO: MOV R1 #03H 初始化失败次数3次
D2B7 INI1: SETB P3.7
783C MOV R0 #3CH
C2B7 INI2: CLR P3.7
D8FC DJNZ R0 INI2 延时[(1+2)2X=540] X=64H
D2B7 SETB P3.7
C297 CLR P1.7
7807 MOV R0 #07H
30B708 INI3: JNB P3.7 INI4
D8FB DJNZ R0 INI3 延时[(2+2)2X=88] X=07H
D9EB DJNZ R1 INI1 未准备好,重新初始化。
7A0F MOV R2 #0FH 无传感器,R2置0FH
800F SJMP INI7
7814 INI4: MOV R0 #14H
20B706 INI5: JB P3.7 INI6 数据线变高,初始化成功。
D8FB DJNZ R0 INI5 数据线低电平可持续 [(2+2)2X=240] X=14H
D297 SETB P1.7
D9DC DJNZ R1 INI1 初始化失败,重来。
D8FE INI6: DJNZ R0 $ 测得数据线变高,延时够240us
7A00 MOV R2 #00H 有传感器,R2置00H
7825 INI7: MOV R0 #25H
D8FE DJNZ R0 $ 将时间延时够[480(20+240) =220us]
D297 SETB P1.7
22 RET
写时序子程序
00 NOP
D2B7 WRO: SETB P3.7
7908 MOV R1 #08H 循环8次,写一个字节。
13 WR1: RRC A 写入位从A中移入CY
C2B7 CLR P3.7
00 NOP
92B7 MOV P3.7 C 将欲传送的数值以进位形式送出。
780E MOV R0 #10EH 延时88 us
D8FE WR2: DJNZ R0 $
D2B7 SETB P3.7
00 NOP
D9F1 DJNZ R1 WR1
22 RET
读一个字节
00 NOP
7908 RD0: MOV R1 #08H 循环8次,写一个字节。
7801 RD1: MOV R0 #01H
C2B7 CLR P3.7
00 NOP 低电平持续2 us
D2B7 SETB P3.7 口线设为输入
C297 CLR P1.7
D8FE RD2: DJNZ R0 $ 等待8 us
A2B7 MOV C P3.7 主机按位依次读入DS18B20的数据
13 RRC A
780B MOV R0 #0BH
D8FE RD3: DJNZ R0 $ 保持读过程持续读64 us
D297 SETB P1.7
D9EA DJNZ R1 RD1 读完一个字节的数据,保存在A中
D2B7 SETB P3.7
22 RET