通过c51的串口读取ds18b20的数据有一个问题就是mcu的一直开着,所以就想直接用gpio连接ds18b20,这样也可以省些电。LED这个固然好,但是新鲜过去实用性不大,不如挂一个温湿度计来的方便和节能。主要是得一直挂着,没办法玩51了。

首先需要用面包板或者实验板把ds和一个4.7k的电阻焊上去。

连接如下:

然后加载模块

1sudo modprobe 1w_gpio  
2sudo modprobe 1w_therm

为了启动时候自动加载,可以在/etc/modules里添加如下内容

11w_gpio  
21w_therm

启动时候就可以看到1 wire 协议和slave加载

1[ 11.618177] Driver for 1-wire Dallas network protocol.
2[ 11.698036] w1_master_driver w1_bus_master1: Family 28 for 28.0000046eae7a.c3 is not registered.
3[ 138.941466] w1_slave_driver 28-0000046eae7a: 18S20 doesn't respond to CONVERT_TEMP.

然后就可以从设备文件读取数值

1cli@raspberrypi /etc $ cat /sys/devices/w1_bus_master1/28-0000046eae7a/w1_slave<br />
25f 01 4b 46 7f ff 01 10 9b : crc=9b YES<br />
35f 01 4b 46 7f ff 01 10 9b t=21937<br />
4cli@raspberrypi /etc $

但是这个数值需要经过处理。

 1#!/usr/bin/python
 2import glob
 3import os
 4
 5devicedir = glob.glob("/sys/bus/w1/devices/28-*")
 6device = devicedir[0]+"/w1_slave"
 7
 8f = open (device, 'r')
 9sensor = f.readlines()
10f.close()
11
12crc=sensor[0].split()[-1]
13temp=float(sensor[1].split()[-1].strip('t='))
14temp_C=(temp/1000.000)
15
16if 'YES' in crc:
17        print temp_C
18else:
19         print dtime,"\tCRC check failed."