娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

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

正在發生

2020年03月03日 | 基于ARM-LINUX的溫度傳感器驅動-DS18B20

發布者:瘋狂小馬 來源: eefocus關鍵字:ARM-LINUX  溫度傳感器驅動  DS18B20 手機看文章 掃描二維碼
隨時隨地手機看文章

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);

關鍵字:ARM-LINUX  溫度傳感器驅動  DS18B20 引用地址:基于ARM-LINUX的溫度傳感器驅動-DS18B20

上一篇:s3c2440A開發板UART總結以及UART代碼詳解
下一篇:arm力天電子 lpc2148 基于DS18b20的溫度采集實驗程序詳解

推薦閱讀

2017年8月1日,江蘇檢察機關“案管機器人”上崗正式開啟智能輔助辦案時代。記者3月1日從省檢察院獲悉:半年多來,案管機器人已輔助全省檢察機關偵查監督、公訴部門檢察官辦理交通肇事案件4169件,系統審查、甄別、推送的準確率達99.7%。在江蘇全省三級檢察院,人工智能與檢察辦案是如何深度“碰撞”的?記者進行了深入探訪。執檢“小智”“一日不見、時...
■ 2018年,我國機器人產業保持健康、快速發展。2019年,我國機器人產業發展機遇與挑戰并存,制造業提質增效、換檔升級的緊迫需求為機器人行業提供了全新動能。 ■ 由于我國工業機器人的核心部件長期依賴進口,生產成本、采購成本、管理成本等相對高昂,部分國內機器人企業以產品的“性價比”來打開市場,導致盈利空間縮減。 ■ 隨著我國一系列機器...
賽普拉斯半導體公司(NASDAQ:CY)日前宣布,推出具備電力傳輸功能(PD)的新一代USB-C控制器EZ-PD CCG6DF和CCG6SF。全新的雙端口和單端口USB-C控制器將為新一代的筆記本電腦和臺式機提供最高的BOM集成度,在縮小電路板面積的同時,還能降低OEM廠商的成本。此外,新的EZ-PD控制器還支持最新的USB4?標準和Intel Thunderbolt?平臺。 賽普拉斯最新的EZ-PD...
Knowles Corporation宣布推出AISonic藍牙標準解決方案,這是一個完整的開發方案,可實現與藍牙設備的理想語音集成。開發套件使OEM和ODM能夠在藍牙設備中構建語音激活的呼叫,控制和遠場語音識別功能,包括智能揚聲器,智能家居鎖,已連接的電燈開關,可穿戴設備,車載語音助手等。AISonic藍牙標準解決方案是Knowles新參考解決方案系列下的一個開發包,用...

史海拾趣

問答坊 | AI 解惑

正弦脈寬調制(SPWM)波的基本要素

               項目簡介 江蘇省常熟市    吳棟梁 個人原創的《超音頻寬頻帶功率正弦波逆變電源》系電力電子變流技術(SPWM)類的電源引擎, 資質情況為國內領先水平,持 ...…

查看全部問答∨

ARM內核結構簡介

ARM內核結構簡介…

查看全部問答∨

如何用createwindow創建不帶右上角"X"的窗口

就合普通的dialog樣式一樣,出現OK按鈕,點擊關閉,而不是出現"X"按鈕點擊最小化…

查看全部問答∨

F2812 的IFR究竟是寫0清除狀態位還是寫1清除

F2812 的IFR究竟是寫0清除狀態位還是寫1清除? F2812的資料介紹中 Note部分:To clear an IFR bit, you must write a one to it, not a zero. 在寄存器各位Description中:Write a 0 to this bit to clear it to 0 and clear the interrupt reques ...…

查看全部問答∨

T0中斷和外部中斷0不能同時使用嗎

用匯編寫了個程序,兩個中斷同時使用時,程序不響應,設置優先級后還是不響應。但是單個中斷調試時有用,想問下大家這個問題該怎么解決,謝謝了 程序如下 ORG 0000H LJMP RESET            // &n ...…

查看全部問答∨

LM3S 比較器詳解

申請團購LM3S開發板,找了個比較器資料…

查看全部問答∨

請網友不要再亂發論壇里已經有的文章和資料,純粹浪費空間和讀者時間

看看論壇里充斥著發了多次的文章和資料,實在沒有意思!請網友不要再亂發論壇里已經有的文章和資料,純粹浪費空間和讀者時間…

查看全部問答∨

太辛苦啦。。

我室友治本大叔。。天天苦戰到晚上2點。。我的眼睛也都被點陣閃的花了。。。 辛苦呀。。。 傷不起呀。。。 …

查看全部問答∨

問:如何選擇分立晶體管?

本帖最后由 雨中 于 2014-9-29 19:41 編輯 答:謹慎些。 不過,過于小心也不好。我曾經看到 有些工程師為了給低速邏輯反相器選 擇最佳分立晶體管而痛苦數日之久, 甚至因為無法獲得與應用筆記中的發 射極跟隨器所用的一模一樣的晶體管而 事實 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 南涧| 深圳市| 本溪市| 平阴县| 济宁市| 南江县| 南投市| 义马市| 彰化市| 和平县| 响水县| 南召县| 花垣县| 越西县| 东丰县| 新田县| 武宣县| 龙里县| 神木县| 维西| 玉屏| 黄骅市| 武川县| 静安区| 阿城市| 高邮市| 东光县| 女性| 鹿泉市| 大兴区| 甘泉县| 太白县| 乌苏市| 浪卡子县| 河西区| 道孚县| 南部县| 通城县| 瑞金市| 长乐市| 库伦旗|