0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Openwrt開(kāi)發(fā)指南 第27章 DS18B20溫度傳感器

嵌入式大雜燴 ? 來(lái)源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-07-15 16:13 ? 次閱讀

開(kāi)發(fā)環(huán)境:

主機(jī):Ubuntu12.04

開(kāi)發(fā)板:RT5350

Openwrt:Openwrt15.05

1 硬件原理

下圖是我們溫度傳感器的接入引腳,3.3V 供電,io 口接 P07的 GP0( GPIO0 的簡(jiǎn)稱(chēng) )。

DS18B20 數(shù)字溫度傳感器接線方便,封裝成后可應(yīng)用于多種場(chǎng)合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號(hào)多種多樣,有 LTM8877,LTM8874 等等。主要根據(jù)應(yīng)用場(chǎng)合的不同而改變其外觀。封裝后的 DS18B20 可用于電纜溝測(cè)溫,高爐水循環(huán)測(cè)溫,鍋爐測(cè)溫,機(jī)房測(cè)溫,農(nóng)業(yè)大棚測(cè)溫,潔凈室測(cè)溫,彈藥庫(kù)測(cè)溫等各種非極限溫度場(chǎng)合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)溫和控制領(lǐng)域。

2 單總線的概念

目前常用的微機(jī)與外設(shè)之間進(jìn)行數(shù)據(jù)傳輸?shù)拇锌偩€主要有 I2C 總線、 SPI 總線和 SCI總線。其中 I2C 總線以同步串行 2 線方式進(jìn)行通信(一條時(shí)鐘線,一條數(shù)據(jù)線) ,SPI 總線則以同步串行 3 線方式進(jìn)行通信(一條時(shí)鐘線,一條數(shù)據(jù)輸入線,一條數(shù)據(jù)輸出線),而 SCI 總線是以異步方式進(jìn)行通信(一條數(shù)據(jù)輸入線,一條數(shù)據(jù)輸出線) 。這些總線至少需要兩條或兩條以上的信號(hào)線。

1-wire , 即 單 線 總 線 , 又 叫 單 總 線 。 近 年 來(lái) , 美 國(guó) 的 達(dá) 拉 斯 半 導(dǎo) 體 公 司(DALLASSEMICONDUCTOR) 推出了一項(xiàng)特有的單總線(1-Wire Bus)技術(shù)。該技術(shù)與上述總線不同,它采用單根信號(hào)線,既可傳輸時(shí)鐘,又能傳輸數(shù)據(jù),而且數(shù)據(jù)傳輸是雙向的,因而這種單總線技術(shù)具有線路簡(jiǎn)單,硬件開(kāi)銷(xiāo)少,成本低廉,便于總線擴(kuò)展和維護(hù)等優(yōu)點(diǎn)。

3 ds18b20 相關(guān)時(shí)序

  • 初始化(復(fù)位)時(shí)序圖:

1.png

(1) 先將數(shù)據(jù)線置高電平“ 1” 。

(2) 延時(shí)(該時(shí)間要求的不是很?chē)?yán)格,但是盡可能的短一點(diǎn))

(3) 數(shù)據(jù)線拉到低電平“ 0” 。

(4) 延時(shí) 750 微秒(該時(shí)間的時(shí)間范圍可以從 480 到 960 微秒) 。

(5) 數(shù)據(jù)線拉到高電平“ 1” 。

(6) 延時(shí)等待(如果初始化成功則在 15 到 60 微秒時(shí)間之內(nèi)產(chǎn)生一個(gè)由 DS18B20 所

返回的低電平“ 0” 。據(jù)該狀態(tài)可以來(lái)確定它的存在,但是應(yīng)注意不能無(wú)限的進(jìn)行等待,不然會(huì)使程序進(jìn)入死循環(huán),所以要進(jìn)行超時(shí)控制) 。

(7) 若 CPU 讀到了數(shù)據(jù)線上的低電平“ 0”后,還要做延時(shí),其延時(shí)的時(shí)間從發(fā)出的高電平算起(第(5)步的時(shí)間算起)最少要 480 微秒。

(8) 將數(shù)據(jù)線再次拉高到高電平“ 1”后結(jié)束。

  • 寫(xiě) ds18b20 時(shí)序圖:
    2.png

(1) 數(shù)據(jù)線先置低電平“ 0” 。

(2) 延時(shí)確定的時(shí)間為 15 微秒。

(3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位) 。

(4) 延時(shí)時(shí)間為 45 微秒。

(5) 將數(shù)據(jù)線拉到高電平。

(6) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。

(7) 最后將數(shù)據(jù)線拉高。

  • 讀 ds18b20 時(shí)序圖:
    3.png

(1)將數(shù)據(jù)線拉高“ 1” 。

(2)延時(shí) 2 微秒。

(3)將數(shù)據(jù)線拉低“ 0” 。

(4)延時(shí) 3 微秒。

(5)將數(shù)據(jù)線拉高“ 1” 。

(6)延時(shí) 5 微秒。

(7)讀數(shù)據(jù)線的狀態(tài)得到 1 個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。

(8)延時(shí) 60 微秒。

4 驅(qū)動(dòng)程序

關(guān)于字符設(shè)備驅(qū)動(dòng)程序的使用,我們可以參照點(diǎn)亮 led 燈的那個(gè)實(shí)驗(yàn),這里只給出跟ds18b20 密切相關(guān)的驅(qū)動(dòng)程序,詳細(xì)的程序請(qǐng)查看我們的驅(qū)動(dòng)文件!

//配置連接溫度傳感器的引腳
#define DS18B20_L		*GPIO21_0_DATA &= ~(1< //低電平	
#define DS18B20_H		*GPIO21_0_DATA |=  (1< //高電平
#define DS18B20_OUT	        *GPIO21_0_DIR  |=  (1< //輸出	
#define DS18B20_IN		*GPIO21_0_DIR  &= ~(1< //輸入	
#define DS18B20_STA		*GPIO21_0_DATA & 0x01	

//寄存器定義
volatile unsigned long *GPIO21_0_DIR;
volatile unsigned long *GPIO21_0_DATA;	


/****************  基本定義 **********************/
//初始化函數(shù)必要資源定義
//用于初始化函數(shù)當(dāng)中
//device number;
	dev_t dev_num;
//struct dev
	struct cdev ds18b20_cdev;
//auto "mknode /dev/ds18b20 c dev_num minor_num"
struct class *ds18b20_class = NULL;
struct device *ds18b20_device = NULL;

/********************  ds18b20有關(guān)的函數(shù)   ****************************/
//復(fù)位ds18b20傳感器
static unsigned char ds18b20_reset(void)
{
	unsigned char ret = 0;
	unsigned char count = 0;

	DS18B20_OUT;
	DS18B20_H;
	udelay(100);			
	DS18B20_L;			
	udelay(600);			
	DS18B20_H;			
	udelay(45);			

	DS18B20_IN;			
	do
	{
		ret = DS18B20_STA;
		udelay(1);			
		count++;
	}
	while(ret != 0 && count< 50);

	DS18B20_OUT;

	udelay(400);			
	DS18B20_H;			

	return ret;
}

//從ds18b20讀取一個(gè)字節(jié)
static unsigned char read_byte(void)
{
	unsigned char i,byte=0;

	DS18B20_OUT;
	DS18B20_H;
	udelay(100);

	for(i = 0; i< 8; i++)
	{
		byte > >= 1;
		DS18B20_L;
		udelay(4);
		DS18B20_H;
		udelay(2);
		if(DS18B20_STA == 1)
			byte |= 0x80;
		udelay(10);
	}

	return byte;
}

//向ds18b20寫(xiě)入一個(gè)字節(jié)
static unsigned char write_byte(unsigned char byte)
{
	unsigned char i;

	DS18B20_OUT;
	DS18B20_H;
	udelay(100);

	for(i = 0; i< 8; i++)
	{
		DS18B20_L;
		if( byte & 0x01 )
			DS18B20_H;
		else
			DS18B20_L;
		udelay(40);
		DS18B20_H;
		byte > >= 1;
	}
	udelay(10);
}

//從ds18b20中讀出溫度數(shù)據(jù)
static unsigned int read_temp(void)
{
	unsigned int t = 0 , l = 0;

	if(ds18b20_reset())
	{
		printk("step1,reset_ds18b20 error!n");
		return 0;
	}

	write_byte(0xcc);
	write_byte(0x44);
	udelay(4);

	if(ds18b20_reset())
	{
		printk("step2,reset_ds18b20 error!n");
		return 0;
	}

	write_byte(0xcc);
	write_byte(0xbe);

	l = read_byte();
	t = read_byte();
	t < <= 8;
	t += l;

	return t;
}


/**********************************************************************/

/**************** 結(jié)構(gòu)體 file_operations 成員函數(shù) *****************/
//open
static int ds18b20_open(struct inode *inode, struct file *file)
{
	printk("ds18b20 drive open...n");

	DS18B20_OUT; //初始化該引腳為輸出;

	return 0;
}

//close
static int ds18b20_close(struct inode *inode , struct file *file)
{
	return 0;
}

//read
static ssize_t ds18b20_read(struct file *file, char __user *buffer,
			size_t len, loff_t *pos)
{
	unsigned int temp;
	printk("ds18b20 drive read...n");

	temp = read_temp();
	copy_to_user(buffer, &temp, 4);
	
	return 4;
}
/***************** 結(jié)構(gòu)體: file_operations ************************/
//struct
static const struct file_operations ds18b20_fops = {
	.owner   = THIS_MODULE,
	.open	 = ds18b20_open,
	.release = ds18b20_close,	
	.read	 = ds18b20_read,
};


/*************  functions: init , exit*******************/
//條件值變量,用于指示資源是否正常使用
unsigned char init_flag = 0;
unsigned char add_code_flag = 0;

//init
static __init int ds18b20_init(void)
{
	int ret_v = 0;
	printk("ds18b20 drive init...n");

	//函數(shù)alloc_chrdev_region主要參數(shù)說(shuō)明:
	//參數(shù)2: 次設(shè)備號(hào)
	//參數(shù)3: 創(chuàng)建多少個(gè)設(shè)備
	if( ( ret_v = alloc_chrdev_region(&dev_num,0,1,"ds18b20") ) < 0 )
	{
		goto dev_reg_error;
	}
	init_flag = 1; //標(biāo)示設(shè)備創(chuàng)建成功;

	printk("The drive info of ds18b20:nmajor: %dnminor: %dn",
		MAJOR(dev_num),MINOR(dev_num));

	cdev_init(&ds18b20_cdev,&ds18b20_fops);
	if( (ret_v = cdev_add(&ds18b20_cdev,dev_num,1)) != 0 )
	{
		goto cdev_add_error;
	}

	ds18b20_class = class_create(THIS_MODULE,"ds18b20");
	if( IS_ERR(ds18b20_class) )
	{
		goto class_c_error;
	}

	ds18b20_device = device_create(ds18b20_class,NULL,dev_num,NULL,"ds18b20");
	if( IS_ERR(ds18b20_device) )
	{
		goto device_c_error;
	}
	printk("auto mknod success!n");

	//------------   請(qǐng)?jiān)诖颂砑幽某跏蓟绦? --------------//
       

	GPIO21_0_DATA = (volatile unsigned long *)ioremap(0x10000620, 4);
	GPIO21_0_DIR =  (volatile unsigned long *)ioremap(0x10000624, 4);

        //如果需要做錯(cuò)誤處理,請(qǐng):goto ds18b20_error;	

	 add_code_flag = 1;
	//----------------------  END  ---------------------------// 

	goto init_success;

dev_reg_error:
	printk("alloc_chrdev_region failedn");	
	return ret_v;

cdev_add_error:
	printk("cdev_add failedn");
 	unregister_chrdev_region(dev_num, 1);
	init_flag = 0;
	return ret_v;

class_c_error:
	printk("class_create failedn");
	cdev_del(&ds18b20_cdev);
 	unregister_chrdev_region(dev_num, 1);
	init_flag = 0;
	return PTR_ERR(ds18b20_class);

device_c_error:
	printk("device_create failedn");
	cdev_del(&ds18b20_cdev);
 	unregister_chrdev_region(dev_num, 1);
	class_destroy(ds18b20_class);
	init_flag = 0;
	return PTR_ERR(ds18b20_device);

//------------------ 請(qǐng)?jiān)诖颂砑幽腻e(cuò)誤處理內(nèi)容 ----------------//
ds18b20_error:
		

	add_code_flag = 0;
	return -1;
//--------------------          END         -------------------//
    
init_success:
	printk("ds18b20 init success!n");
	return 0;
}

//exit
static __exit void ds18b20_exit(void)
{
	printk("ds18b20 drive exit...n");	

	if(add_code_flag == 1)
 	{   
           //----------   請(qǐng)?jiān)谶@里釋放您的程序占有的資源   ---------//
	    printk("free your resources...n");	               

		iounmap(GPIO21_0_DATA);
		iounmap(GPIO21_0_DIR);

	    printk("free finishn");		               
	    //----------------------     END      -------------------//
	}					            

	if(init_flag == 1)
	{
		//釋放初始化使用到的資源;
		cdev_del(&ds18b20_cdev);
 		unregister_chrdev_region(dev_num, 1);
		device_unregister(ds18b20_device);
		class_destroy(ds18b20_class);
	}
}


/**************** module operations**********************/
//module loading
module_init(ds18b20_init);
module_exit(ds18b20_exit);

//some infomation
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("from Jafy");
MODULE_DESCRIPTION("ds18b20 drive");

5 應(yīng)用程序

int main(int argc, char **argv)
{
	int fd;
	float t;
	unsigned int tmp = 0;

	//打開(kāi)溫度傳感器驅(qū)動(dòng)模塊
	fd = open("/dev/ds18b20", O_RDWR | O_NONBLOCK);
	if (fd < 0)
	{
		printf("can't open!n");
		return -1;
	}

	read(fd, &tmp, sizeof(tmp));
	t = tmp * 0.0625;
	printf("the current temperature is %fn",t);

	close(fd);
	
	return 0;
}

編譯模塊驅(qū)動(dòng),不熟悉的朋友可看LED驅(qū)動(dòng)相關(guān)。

$make package/kernel/ds18b20/compile V=99

編譯模塊驅(qū)動(dòng)和應(yīng)用程序

$make package/ds18b20_app/compile V=99

$make package/ds18b20_app/install V=99

$make package/index V=99

復(fù)制文件傳給開(kāi)發(fā)板測(cè)試

6 實(shí)驗(yàn)結(jié)果

4.png
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    2854

    瀏覽量

    155322
  • DS18B20
    +關(guān)注

    關(guān)注

    10

    文章

    774

    瀏覽量

    80482
  • 引腳
    +關(guān)注

    關(guān)注

    16

    文章

    1132

    瀏覽量

    49742
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4771

    瀏覽量

    96183
  • OpenWrt
    +關(guān)注

    關(guān)注

    10

    文章

    122

    瀏覽量

    39148
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于STM32的DS18B20溫度傳感器設(shè)計(jì)

    DS18B20內(nèi)置了64位產(chǎn)品序列號(hào),方便識(shí)別身份,在一根線上可以?huà)旖佣鄠€(gè)DS18B20傳感器,通過(guò)64位身份驗(yàn)證,可以分別讀取來(lái)至不同傳感器采集的
    的頭像 發(fā)表于 03-07 11:44 ?1.3w次閱讀
    基于STM32的<b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>設(shè)計(jì)

    DS18B20溫度傳感器是什么

    DALLAS最新單線數(shù)字溫度傳感器DS18B20簡(jiǎn)介新的“一線器件”體積更小、適用電壓更寬、更經(jīng)濟(jì) Dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器
    發(fā)表于 04-27 08:14

    DS18B20溫度傳感器實(shí)驗(yàn)

    單片機(jī)驅(qū)動(dòng)DS18B20溫度傳感器實(shí)現(xiàn)溫度的串口打印顯示,本實(shí)驗(yàn)中STM32基于HAL庫(kù)開(kāi)發(fā)。本文全程記錄實(shí)驗(yàn)過(guò)
    發(fā)表于 08-18 07:44

    外設(shè)溫度傳感器DS18B20概述

    參看:《嵌入式-STM32開(kāi)發(fā)指南》第三部分 外設(shè)篇 - 2 溫度傳感器DS18B20這篇文
    發(fā)表于 01-05 07:17

    數(shù)字溫度傳感器DS18B20的設(shè)計(jì)及應(yīng)用

    數(shù)字溫度傳感器DS18B20的設(shè)計(jì)及應(yīng)用 1引言 DS18B20是DALLAS公司生產(chǎn)的一線式數(shù)字溫度
    發(fā)表于 04-02 18:00 ?2716次閱讀
    數(shù)字<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b><b class='flag-5'>DS18B20</b>的設(shè)計(jì)及應(yīng)用

    DS18B20完成溫度檢測(cè)的技巧

    介紹了DS18B20 溫度傳感器 的結(jié)構(gòu)和特點(diǎn)以及用DS18B20溫度傳感器進(jìn)行
    發(fā)表于 08-23 10:44 ?189次下載
    <b class='flag-5'>DS18B20</b>完成<b class='flag-5'>溫度</b>檢測(cè)的技巧

    DS18B20數(shù)字溫度傳感器

    本設(shè)計(jì)基于單片機(jī)STM32開(kāi)發(fā)板,對(duì)DS18B20數(shù)字溫度傳感器進(jìn)行控制,有源代碼
    發(fā)表于 05-11 14:54 ?42次下載

    溫度傳感器DS18B20

    溫度傳感器DS18B20 51例程,親測(cè)可用
    發(fā)表于 06-14 15:36 ?20次下載

    智能溫度傳感器DS18B20的原理與應(yīng)用

    DS18B20是DALLAS公司生產(chǎn)的單線數(shù)字溫度傳感器,他具有獨(dú)特的單線總線接口方式。文章詳細(xì)的介紹了單線數(shù)字溫度傳感器
    發(fā)表于 10-11 18:19 ?48次下載

    關(guān)于DS18B20溫度傳感器的原理和使用介紹說(shuō)明(2)

    DS18B20溫度傳感器的原理和使用
    的頭像 發(fā)表于 07-10 03:03 ?7017次閱讀

    關(guān)于DS18B20溫度傳感器的原理及使用介紹說(shuō)明(1)

    DS18B20溫度傳感器的原理和使用
    的頭像 發(fā)表于 07-10 03:00 ?2.1w次閱讀

    ds18b20的特性_ds18b20溫度傳感器應(yīng)用

    本文首先介紹了ds18b20的特性,其次介紹了DS18B20工作原理,最后介紹了ds18b20溫度傳感器應(yīng)用。
    發(fā)表于 04-24 09:10 ?1.1w次閱讀
    <b class='flag-5'>ds18b20</b>的特性_<b class='flag-5'>ds18b20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>應(yīng)用

    8051單片機(jī)Proteus仿真與開(kāi)發(fā)實(shí)例--DS18B20溫度傳感器仿真

    DS18B20溫度傳感器仿真DS18B20傳感器是常用的數(shù)字溫度
    發(fā)表于 11-21 12:21 ?20次下載
    8051單片機(jī)Proteus仿真與<b class='flag-5'>開(kāi)發(fā)</b>實(shí)例--<b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>仿真

    【正點(diǎn)原子FPGA連載】第二十七DS18B20數(shù)字溫度傳感器實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開(kāi)發(fā)指南_V2.1

    【正點(diǎn)原子FPGA連載】第二十七DS18B20數(shù)字溫度傳感器實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開(kāi)發(fā)指南_V2.1
    發(fā)表于 11-25 11:06 ?28次下載
    【正點(diǎn)原子FPGA連載】第二十七<b class='flag-5'>章</b><b class='flag-5'>DS18B20</b>數(shù)字<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA<b class='flag-5'>開(kāi)發(fā)指南</b>_V2.1

    ds18b20溫度傳感器如何使用

    DS18B20是一款廣泛使用的數(shù)字溫度傳感器,它具有高精度、低功耗和易于使用的特點(diǎn)。 DS18B20溫度
    的頭像 發(fā)表于 09-03 16:51 ?272次閱讀