历史上的今天
返回首页

历史上的今天

今天是:2025年03月03日(星期一)

正在发生

2020年03月03日 | 基于ARM-LINUX的温度传感器驱动-DS18B20

2020-03-03 来源:eefocus

DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。


技术性能描述

1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
2. 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。
3. 支持多点组网功能,多个DS18B20可以并联在唯一的三线上。
4. 工作电源: 3~5V/DC
5. 在使用中不需要任何外围元件
6. 测量结果以9~12位数字量方式串行传送


DS18b20封装

DS18B20 引脚功能: GND 电压地 •DQ 单数据总线 •VDD 电源电压 •NC 空引脚


DS18b20与处理器的连接


DS18B20 工作原理及应用

DS18B20 的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解 18B20的内部存储器资源。18B20 共有三种形态的存储器资源。它们分别是:

ROM 只读存储器:

用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H) ,后面48 位是芯片唯一的序列号,最后 8位是以上 56的位的 CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20 共 64 位 ROM。

RAM 数据暂存器:

用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共9 个字节 RAM,每个字节为 8 位。第1、2 个字节是温度转换后的数据值信息,第 3、4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、7、8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8个字节的 CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据, DS18B20共3位EEPROM,并在 RAM 都存在镜像,以方便用户操作。


控制器对 18B20 操作流程:

1、复位:首先我们必须对 DS18B20 芯片进行复位,复位就是由控制器(单片机)给 DS18B20单总线至少 480uS 的低电平信号。当 18B20 接到此复位信号后则会在 15~60uS 后回发一个芯片的存在脉冲。

2、存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在 15~60uS 后接收存在脉冲,存在脉冲为一个 60~240uS 的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与 18B20 间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。

3、控制器发送 ROM 指令:双方打完了招呼之后最要将进行交流了,ROM 指令共有 5条,每一个工作周期只能发一条,ROM指令分别是读 ROM 数据、指定匹配芯片、跳跃 ROM、芯片搜索、报警芯片搜索。ROM 指令为 8 位长度,功能是对片内的 64位光刻 ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的 ID号来区别,一般只挂接单个 18B20芯片时可以跳过 ROM 指令(注意:此处指的跳过 ROM指令并非不发送 ROM 指令,而是用特有的一条“跳过指令” )

4、控制器发送存储器操作指令:在 ROM 指令发送给 18B20 之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为 8 位,共 6 条,存储器操作指令分别是写 RAM 数据、读RAM 数据、将 RAM 数据复制到 EEPROM、温度转换、将 EEPROM中的报警值复制到 RAM、工作方式切换。存储器操作指令的功能是命令 18B20 作什么样的工作,是芯片控制的关键。

5、执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待 18B20 执行其指令,一般转换时间为 500uS。如执行数据读写指令则需要严格遵循 18B20 的读写时序来操作。


若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过 ROM 指令、执行温度转换存储器操作指令、等待 500uS 温度转换时间。紧接着执行第二个周期为复位、跳过 ROM指令、执行读 RAM 的存储器操作指令、读数据(最多为 9 个字节,中途可停止,只读简单温度值则读前 2 个字节即可)。其它的操作流程也大同小异,在此不多介绍。


关于ds18b20的数据手册网上资源较为丰富,这里不再详细介绍,下面是基于ARM-LINUX的驱动程序,在arm-gcc 编译后测试通过。(华清远见原创,转载请注明出处)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");

#define GPHCON (*(volatile unsigned int *)S3C2410_GPHCON)
#define GPHDAT (*(volatile unsigned int *)S3C2410_GPHDAT)
#define GPHUP (*(volatile unsigned int *)S3C2410_GPHUP)

static int ds18b20_major = 230;/*静态申请设备号*/

struct cdev cdev;
struct class *my_class;

spinlock_t lock;

dev_t dev = 0;
int number_of_devices = 1;

/*配置为输入模式*/
void set_conIN(void)
{
GPHCON &= ~(1<<19);
GPHCON &= ~(1<<18);
}

/*配置为输出模式*/
void set_conOUT(void)
{
GPHCON |= (1<<18);
GPHCON &= ~(1<<19);
}

/*引脚置位*/
void set_data(int i)
{
if( i == 0 ){
GPHDAT &= ~(1<<9);
}else if( i == 1 ){
GPHDAT |= (1<<9);
}
}

/*复位ds18b20*/
unsigned int reset_ds18b20(void)
{
unsigned int retValue;
set_conOUT();

set_data(1);
__udelay(1);
set_data(0);
__udelay(600);
set_data(1);
__udelay(20);
set_conIN();
__udelay(100);
/*稍做延时后 如果x=0则初始化成功
x=1则初始化失*/
retValue = (GPHDAT >> 9) & 0x01;
printk("init is %dn",retValue);
return retValue;
}

/*读取一位温度*/
unsigned int read_bit(void)
{
spin_lock(&lock);
set_conOUT();
//set_data(1);
//__udelay(2);
set_data(0);
__udelay(2);
set_conIN();
__udelay(1);
spin_unlock(&lock);
return ((GPHDAT >> 9) & 0x01);
}

/*写一位命令*/
void write_bit(char bitValue)
{
spin_lock(&lock);
set_conOUT();
set_data(0);
__udelay(15);
if( bitValue == 1 ){
set_data(1);
}else{
set_data(0);
}
spin_unlock(&lock);
__udelay(45);
set_conIN();
__udelay(2);
}

/*写命令*/
void write_cmd(char cmd)
{
unsigned char i;
unsigned char temp;


for(i=0; i<8;i++){
temp = cmd>>i;
temp &= 0x01;
write_bit(temp);
}
//__udelay(10);
}
/*打开设备*/
static int ds18b20_open(struct inode *inode,struct file *filp)
{
printk (KERN_INFO "HEY! device openedn");
//GPHUP &= ~(1<<9);
GPHUP |= (1<<9);
spin_lock_init(&lock);
return 0;
}
/*读取数据*/
static int ds18b20_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
char lowValue=0,highValue=0;
unsigned int i;
//float value;

if(reset_ds18b20()){
printk("init errorn");
}
__udelay(400);
set_conOUT();
set_data(1);
write_cmd(0xCC);
write_cmd(0x44);
__udelay(100000);

if(reset_ds18b20()){
printk("init errorn");
}
__udelay(400);
set_conOUT();
set_data(1);
write_cmd(0xcc);
write_cmd(0xBE);
/*读取温度转化数值*/

for(i=0; i<8; i++){
if( read_bit() ){
lowValue |= (0x01<}
__udelay(62);
}
printk("lowValue is %dn",lowValue);
for(i=0; i<8; i++){
if( read_bit() ){
highValue |= (0x01<}
__udelay(62);
}
printk("highValue is %dn",highValue);
#if 0
i = highValue;
i <<= 8;
i = i|lowValue;
value = i*0.0625;
printk("kernel is %dn",value);
#endif

highValue <<= 4;
highValue |= ((lowValue&0xf0)>>4) ;

/*拷贝内核数据到用户空间*/
copy_to_user(buffer, &highValue, sizeof(highValue));
return 0;
}
/*写命令,在此置空*/
static int ds18b20_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
{
return 0;
}

static int ds18b20_release(struct inode *inode,struct file *filp)
{
printk (KERN_INFO "device closedn");
return 0;
}

static int ds18b20_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
return 0;
}

struct file_operations ds18b20_fops ={
.owner = THIS_MODULE,
.open = ds18b20_open,
.read = ds18b20_read,
.write = ds18b20_write,
.ioctl = ds18b20_ioctl,
.release = ds18b20_release,
};
static void ds18b20_setup_cdev(void)
{
int error,devno = MKDEV(ds18b20_major,0);
cdev_init(&cdev,&ds18b20_fops);
cdev.owner = THIS_MODULE;
cdev.ops = &ds18b20_fops;
error = cdev_add(&cdev,devno,1);
if( error )
printk(KERN_INFO"Error %d adding ds18b20 %dn",error,0);
my_class = class_create(THIS_MODULE,"my_class");
if(IS_ERR(my_class))
{
printk("Err: failed in creating class.n");
return;
}
device_create(my_class,NULL,devno,NULL,"ds18b20");
}
/*注册设备*/

static int ds18b20_init(void)
{
int result;

dev = MKDEV(ds18b20_major,0);
if(ds18b20_major)
result = register_chrdev_region(dev,1,"ds18b20");
else{
result = alloc_chrdev_region(&dev,0,1,"ds18b20");
ds18b20_major=MAJOR(dev);
}
if( result < 0 ){
printk(KERN_WARNING"ds18b20:unable to get major %dn",ds18b20_major);
return result;
}
if(ds18b20_major == 0 )
ds18b20_major = result;

ds18b20_setup_cdev();
printk("ds18b20 initialized.n");
return 0;
}

static void __exit ds18b20_exit(void)
{
dev_t devno = MKDEV (ds18b20_major, 0);
device_destroy(my_class,devno);
class_destroy(my_class);
cdev_del (&cdev);
unregister_chrdev_region (devno, number_of_devices);

printk("ds18b20_major=%dn",ds18b20_major);
printk("ds18b20 device uninstalledn");
}

module_init(ds18b20_init);
module_exit(ds18b20_exit);

推荐阅读

史海拾趣

EEMB Co Ltd公司的发展小趣事

EEMB集团一直非常重视企业文化和团队建设。公司注重培养员工的创新意识和团队精神,为员工提供了良好的工作环境和发展机会。同时,公司也积极履行社会责任,关注环保和公益事业,为社会做出了积极贡献。这些举措不仅增强了公司的凝聚力和向心力,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事是基于公开信息和一般情况下的假设而编写的,可能与EEMB Co Ltd公司的实际发展情况存在差异。

Analog Microwave Design公司的发展小趣事

Analog Microwave Design公司一直注重企业文化的建设和传承。公司倡导创新、务实、合作的企业精神,鼓励员工敢于挑战、勇于创新。同时,公司还注重员工的培训和发展,为员工提供了良好的职业晋升通道和学习机会。这种积极向上的企业文化不仅激发了员工的工作热情和创新精神,还为公司的长期发展提供了有力保障。

以上五个故事分别从初创时期的挑战与机遇、技术创新的突破、国际化战略的实施、产品线的丰富与完善以及企业文化的建设与传承等方面,展现了Analog Microwave Design公司在电子行业发展的历程和成就。这些故事不仅反映了公司的成长轨迹,也体现了公司在面对市场变化和技术挑战时所采取的积极态度和应对策略。

CMD公司的发展小趣事

CMD公司在数据存储领域不断创新,推出了一系列高性能的产品。其微开放系统、高性能工作站等产品为LAN和PC提供了先进的数据存储技术。同时,CMD还致力于发展、生产、销售高性能ASIC和板级产品,其IDE/UltraATA芯片在全球范围内得到了广泛应用。

AC Photonics Inc公司的发展小趣事

AC Photonics Inc公司自成立以来,一直致力于光电技术的研发与应用。在公司成立初期,研发团队在光子集成技术上取得了重大突破,成功开发出一种高效、稳定的光电转换器。这一技术的问世,不仅提升了数据传输的速度和稳定性,还大大降低了能耗,为公司的业务发展奠定了坚实的基础。随着这一技术的逐步推广和应用,AC Photonics Inc在电子行业中逐渐崭露头角。

Barkston Plastics Engineering Ltd.公司的发展小趣事

面对国内市场的饱和,Barkston Plastics Engineering Ltd.开始寻求国际化发展的道路。然而,国际市场环境的复杂性和文化差异给公司带来了诸多挑战。在经历了一系列的市场调研和风险评估后,Barkston成功打入欧洲市场,通过与当地企业的合作,逐步扩大了其国际影响力。这一国际化发展进程不仅为公司带来了更广阔的市场空间,也提升了其在全球电子行业中的地位。

Cyrix Corp公司的发展小趣事

在被VIA收购后的一段时间里,Cyrix继续寻求市场扩张的机会。例如,在1998年,Cyrix与北京大船电子技术公司签订了总代理协议,以扩大其在中国的分销网络。这一策略帮助Cyrix进一步打开了中国市场的大门,为其在全球市场的发展奠定了基础。

以上五个故事描绘了Cyrix Corp公司在电子行业中的发展历程。从初创时期的挑战英特尔到被多次收购后的市场策略调整和市场扩张尝试,Cyrix的发展之路充满了曲折和变革。

问答坊 | AI 解惑

FPGA设计者的5项基本功

记得《佟林传》里,佟林练的基本功是“绕大树、解皮绳”,然后才练成了什么“鬼影随行、柳叶绵丝掌”。 在我看来,成为一名说得过去的FPGA设计者,需要练好5项基本功:仿真、综合、时序分析、调试、验证。 需要强调的一点是, ...…

查看全部问答>

上网“打酱油”

俺时不时地用QQ聊天、写博、泡坛子,自觉天天跟网络世界亲密接触,还不至于太out!一日,俺闲逛到一论坛,看斑竹发帖正告:请勿发了帖就跑,不要当事不关己发了帖就走人的“酱油”男女。俺泡坛子也不是一日两日了,可这“酱油”男女是什么意思?不是 ...…

查看全部问答>

跪求学习bootloader的书!!

跪求学习bootloader的书!!…

查看全部问答>

水木清华上的示波器讨论

※ 来源:·水木社区 newsmth.net·[FROM: 218.240.137.*]发信人: twomol (twomol), 信区: Measurement标  题: Re: 现在生产数字示波器的都有哪些厂家?发信站: 水木社区 (Mon Nov 26 16:13:06 2007), 站内 除了Tek还有谁?研制数字示波器的难 ...…

查看全部问答>

关于Windows CE.NET的书

请问关于Windows CE.NET的编程方面有什么好一点书,最好内容能够详尽一点,谢谢!…

查看全部问答>

智能电视静电保护技巧

高清数字内容过去只能承载于物理磁盘上,需要专用设备才可以播放;而今,宽带连接无处不在,高清数字内容可以从“云”端中以“流”的形式传送和定制到计算 机、智能手机或任何其它连网设备上。传统电视是一种独立的终端,只能接收广播电视节目,由于 ...…

查看全部问答>

Fpga/Cpld的基本概念

推荐几种最基本的电路。模拟的 大家一起学习。。…

查看全部问答>

MSP430 关于large data memory model的问题

简单的说一下我的程序功能是利用MSP430f5528实现对mpu6050(六轴陀螺仪)的控制(I2C实现),并且将其采集的数据通过串口发送出去,这个过程中需要调用eMPL.lib! 这个是问题出现前的程序描述: C:\\Program Files (x86)\\Texas Instruments\\ccs ...…

查看全部问答>

ATmega16 读取DS18B20程序

//AVR+GCC #include #include #define  DQ       0x05 #define  DQ_1     PORTB |=  (1…

查看全部问答>