一、需求分析
1.1 开发目的
此次项目是为了满足广大消费者对于温度适中的坏境中进行测温。具有操作简单,适用于各类群众。
1.2 范围
基于s3c2410开发板的18b20测温系统适用于各类消费者,此类项目一般不用于商业用途!
1.3 定义
开发板:s3c2410系列的开发板。
1.4 参考资料
[1]网络.DS18B20的工作原理 2011
[2]网络.免费的74LS164中文资料 2011
[3]网络.温度传感器DS18B20的驱动方法 2011
二 具体需求
2.1.1 功能需求1
硬件系统搭建
首先按照给出的18B20测温材料、四位一体数码管、74LS164画出电路图,搭建好硬件环境。然后检查是否存在虚焊和焊错情况。
2.1.2 功能需求2
编写软件程序
根据硬件坏境,这里具体编写两个驱动程序(18B20驱动和164控制数码管显示驱动)和一个测试程序。分析18B20的特性,其读出来的数据通过原有的硬件系统存储在RAM区中,其中低八位存放读过来的八位数据,高八位的低四位存放剩余的四位数据。首先通过18B20驱动程序将18B20中的数据读到一个变量中,然后在通过18B20驱动程序中的read()函数的接口传送到164驱动中,驱使数码管显示数据。
18B20驱动程序:
#include <linux/module.h> //支持printk输出
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/arch-s3c2410/regs-gpio.h>
#include <asm/hardware.h>
#include<linux/delay.h>
#include <asm/uaccess.h>
#define DEVICE_NAME "demo"
#define demo_MAJOR 231
#define DQ S3C2410_GPH6//宏定义的与18B20连接传送数据的管脚
#define DQ_out S3C2410_GPH6_OUTP//宏定义的与18B20连接传送数据管脚为输出状态
#define DQ_inp S3C2410_GPH6_INP
static char devicecount=0; //计数器,防止被多个人多次打开
static char data[2];//用来存放从18B20读进来的12bit数据
/*************************************************************************/
//初始化函数,通过do……while();循环来检测到达跳出循环是否为低电平状态,再利用while();将DQ拉高。
static int init(void)
{
do
{
s3c2410_gpio_cfgpin(DQ,DQ_out);
s3c2410_gpio_setpin(DQ,1);
udelay(100);
s3c2410_gpio_setpin(DQ,0);
udelay(500);
s3c2410_gpio_setpin(DQ,1);
udelay(50);
}while(s3c2410_gpio_getpin(DQ)!=0);
while(s3c2410_gpio_getpin(DQ)==0);
return 0;
}
//写函数,通过函数调用高速18B20在执行读数据前得一些操作准备,也就是将18B20中的数据存储在RAM区中。
static void write (unsigned char Data)
{
unsigned char i;
s3c2410_gpio_cfgpin(DQ,DQ_out);
udelay(10);
for(i=0;i<8;i++)
{
s3c2410_gpio_setpin(DQ,0);
udelay(10);
if(Data&0x01)
s3c2410_gpio_setpin(DQ,1);
else
s3c2410_gpio_setpin(DQ,0);
udelay(40);
s3c2410_gpio_setpin(DQ,1);
udelay(1);