




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第12講溫度傳感器溫度傳感器概述溫度傳感器DS1820Dallas公司生產的數字溫度傳感器單總線接口方式,只需要與MCU的一個端口連接即可實現雙向通信可以直接將溫度轉化成串行數字信號只有三個引腳(VDD、GND、DQ)同一總線上可以掛接多個溫度傳感器芯片適用于遠距離多點溫度檢測+5V供電,也可以在信號線上高電平時為內部電容充電,供低電平時消耗電源極性接反時,芯片發燙,但不會燒壞主要性能指標溫度測量范圍:-55℃~+125℃溫度測量精度:±0.5℃(-10℃~+85℃)溫度數字量轉換時間:200ms(典型值)DS18B20的外觀與引腳DALLASDS18B20123GNDDQVDDOOO123仰視圖正視圖DS1820內部結構框圖64位ROM和單線端口電源檢測VDD存儲器和控制邏輯溫度傳感器上限觸發TH下限觸發TL8位CRC產生器暫存器內部VDD工作過程內部低溫度系統振蕩器振蕩頻率隨溫度變化很小,為計數器1提供一個頻率穩定的計數脈沖內部高溫度系統振蕩器振蕩頻率對溫度很敏感,為計數器2提供一個頻率隨溫度變化的計數脈沖溫度測量原理低溫度系數振蕩器高溫度系數振蕩器計數器1計數器2溫度寄存器斜坡累加器比較預置=0?=0?預置增加停止溫度測量過程初始時溫度寄存器被預置成-55℃計數器1被預置成與-55℃相對應的一個量計數器1從預置數開始減計數到0時,溫度寄存器中的溫度值增加1℃斜率累加器為計數器1提供新的計數值計數器1開始新的減計數,這個過程重復進行,直到計數器2計數到0為止除初始值以外,計數器1每一個循環的預置數都由斜率累加器提供為了補償振蕩器溫度特性的非線性,斜率累加器提供的預置數將隨溫度而相應變化(也就是說,在不同溫度范圍時,使溫度寄存器值增加1℃所需要的計數個數是不同的)DS18B20芯片的地址編碼當單一總線上掛接多個DS18B20芯片時,使用64位光刻ROM地址來區別不同芯片64位地址碼是產品出廠前光刻好的產品類型標號(說明是溫度傳感器)序列號(與網卡MAC地址相似)CRC碼(CRC=X8+X5+X4+1,用于校驗)8位CRC碼48位序列號8位產品類型標號DS18B20的操作指令0x33——讀取ROM。讀傳感器ROM中的64位編碼0x55——匹配ROM。發出此命令后,接著發出64位編碼,訪問單一總線上相應的DS18B20,并使之做出響應,為讀寫做準備0xF0——搜索ROM。用于確定掛接在同一總線上的DS18B20芯片數,識別64位地址,為操作各器件做準備0xCC——跳過ROM。當總線上只有一個溫度傳感器芯片時,忽略64位地址,直接向DS18B20發出命令0xEC——告警搜索。執行后,只有溫度超過預設上、下限的芯片才做出響應DS18B20的操作指令44H——溫度轉換。啟動DS18B20進行溫度轉換,結果存入內部RAMBEH——讀暫存器。讀內部RAM中的溫度數據4EH——寫暫存器。發出向內部RAM第2、3字節寫上、下限值的命令,緊接著傳送2字節數據48H——復制暫存器。將內部RAM第2、3字節內容復制到EEPROMB8H——重調EEPROM。將EEPROM中內容恢復到內部RAM第2、3字節B4H——讀供電方式。讀得0,DS18B20采用寄生供電;讀得1,DS18B20利用外接電源供電DS18B20內部RAM地址安排9字節存儲器內容字節地址溫度值低位0溫度值高位1溫度上限值2溫度下限值3配置寄存器4保留5保留6保留7CRC校驗值8DS18B20的溫度數據存儲格式位7位6位5位4位3位2位1位0232221202-12-22-32-4位15位14位13位12位11位10位9位8SSSSS262524DS18B20的溫度數據存儲格式字節0字節1位7位6位5位4位3位2位1位0232221202-12-22-32-4位15位14位13位12位11位10位9位8SSSSS262524符號位(1:負值0:正值)測得數據×0.0625=實際溫度值單個DS1820芯片與單片機的連接在有條件的情況下,最好每個溫度傳感器都使用獨立電源接MCU初始化數據線置“1”延時(時間要求不嚴格,但盡量短一點)數據線置“0”延時750us(480~960us)數據線置“1”(15~60us)延時等待芯片返回的低電平若讀到數據線上低電平0,再延時(從5開始至少480us)數據線再次置“1”,結束VccGND主控制器發出的480~960us芯片應答的60~240us15~60us初始化的子過程voiddsreset(void)//18B20復位,初始化函數{ //加電時已有一個初始高電平
uinti;
ds=0; //數據線上輸出低電位并延時750us i=103;
while(i>0)i--;
ds=1; //數據線上輸出高電位并延時30us i=4;
while(i>0)i--;}寫數據數據線置“0”延時15us按從低到高的順序,逐位發送數據延時45us數據線置“1”重復1~5步驟,直到發送完整個數據字節數據線再次置“1”,結束VccGND15us15us15us15us30us30usmintypmaxmintypmax主控制器寫“0”時隙主控制器寫“1”時隙寫數據字節的子過程(方法一)voidtempwritebyte(uchar
dat)//向18B20寫一個字節數據{
uinti;
ucharj; bittestb;
for(j=1;j<=8;j++) {
testb=dat&0x01; //判斷寫數據最低位
if(testb) //寫"1" {
ds=0; //數據線輸出低電平
i++;i++; //延時15us
ds=1; //數據線輸出高電平(寫"1")
i=8;while(i>0)i--; //延時>45us } else //寫"0" {
ds=0; //數據線輸出低電平
i=8;while(i>0)i--; //延時>45us
ds=1; //數據線輸出高電平
i++;i++; //延時15us }
dat=dat>>1; //右移一位,準備下次寫操作
}}寫數據字節的子過程(方法二)voidds1820writebyte(ucharwdata) //ds1820寫數據字節{
uchari=0;for(i=8;i>0;i--) //按從低到高的順序,逐位輸出數據字節
{ DQ=0; //數據線輸出0 DQ=wdata&0x01; //準備寫數據位(同時延時15us)
ds1820delay(10); //延時45us DQ=1; //數據線輸出1
wdata>>=1; //右移一位,準備下次發送
}}DS18B20啟動子過程voidtempchange(void) //{
dsreset(); //溫度傳感器復位
delay(1); //延時
tempwritebyte(0xcc); //寫跳過讀ROM指令
//(因為只有一個溫度傳感器) tempwritebyte(0x44); //寫溫度轉換指令
//啟動溫度轉換開始}讀數據數據線置“1”延時2us數據線置“0”延時2us數據線置“1”延時4us讀數據線,得到一個狀態位,并進行數據處理延時30us重復1~7步驟,直到讀完一個字節讀數據字節的子過程(方法一)bittempreadbit(void) //讀1個數據位{
uinti; bitdat;
ds=0;i++; //數據線拉低到0,延時2us
ds=1;i++;i++; //數據線拉高到1,延時4us
dat=ds; //讀數據線,得到1個數據位
i=8;while(i>0)i--; //延時15us return(dat); //返回數據位}uchar
tempreadbyte(void) //讀1個數據字節{
uchari,j,dat;
dat=0; //清除存儲單元,準備接收數據
for(i=1;i<=8;i++) { j=tempreadbit(); //讀取1個數據位
dat=(j<<7)|(dat>>1); //讀出數據低位在前
}
return(dat);}讀數據字節的子過程(方法二)uchards1820readbyte() //ds1820讀數據字節{
uchari=0;
uchar
dat=0; for(i=8;i>0;i--) //逐位讀取溫度傳器提供的數據
{ DQ=0; //數據線輸出0
dat>>=1; //右移1位,準備用當前最高位存放讀得的數據位
DQ=1; //數據線輸出1,執行下面的語句相當于延時4us
if(DQ) //讀數據線狀態,得到一個數據位
dat|=0x80; //若讀得狀態位為1,保存到dat的當前最高位上
ds1820delay(10); //延時30us }
return(dat);}舉例說明讀數據字節的過程(1)設tempreadbit()第一次返回“1”j=tempreadbit(); //j=00000001j=j<<7; //j=10000000dat=dat>>1; //dat=00000000dat=(j<<7)|(dat>>1); //dat=10000000舉例說明讀數據字節的過程(2)設tempreadbit()第二次返回“1”j=tempreadbit(); //j=00000001j=j<<7; //j=10000000dat=dat>>1; //dat=01000000dat=(j<<7)|(dat>>1); //dat=11000000舉例說明讀數據字節的過程(3)設tempreadbit()第三次返回“0”j=tempreadbit(); //j=00000000j=j<<7; //j=00000000dat=dat>>1; //dat=01100000dat=(j<<7)|(dat>>1); //dat=01100000舉例說明讀數據字節的過程(4)設tempreadbit()第四次返回“1”j=tempreadbit(); //j=00000001j=j<<7; //j=10000000dat=dat>>1; //dat=00110000dat=(j<<7)|(dat>>1); //dat=10110000舉例說明讀數據字節的過程(5)設tempreadbit()第五次返回“0”j=tempreadbit(); //j=00000000j=j<<7; //j=00000000dat=dat>>1; //dat=01011000dat=(j<<7)|(dat>>1); //dat=01011000舉例說明讀數據字節的過程(6)設tempreadbit()第六次返回“0”j=tempreadbit(); //j=00000000j=j<<7; //j=00000000dat=dat>>1; //dat=00101100dat=(j<<7)|(dat>>1); //dat=00101100舉例說明讀數據字節的過程(7)設tempreadbit()第七次返回“1”j=tempreadbit(); //j=00000001j=j<<7; //j=10000000dat=dat>>1; //dat=00010110dat=(j<<7)|(dat>>1); //dat=10010110舉例說明讀數據字節的過程(8)設tempreadbit()第八次返回“0”j=tempreadbit(); //j=00000000j=j<<7; //j=00000000dat=dat>>1; //dat=01001011dat=(j<<7)|(dat>>1); //dat=01001011讀取傳感器中存儲的溫度數據uint
get_temp() //讀取傳感器中存儲的溫度數據{
uchar
a,b;
dsreset(); //溫度傳感器復位
delay(1); tempwritebyte(0xcc); //寫跳過讀ROM指令(因為只有一個溫度傳感器) tempwritebyte(0xbe); //讀內部RAM的命令
a=tempreadbyte();//第一次讀到的是低8位,地址自動修正
b=tempreadbyte();//第二次讀到的是高8位
temp=b; //先保存高8位到temp temp<<=8; //左移8位,低8位以0填充
temp=temp|a; //兩個字節組合為1個字
f_temp=temp*0.0625; //溫度在寄存器中為12位分辨率位0.0625° temp=f_temp*10+0.5; //乘以10表示小數點后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05; returntemp; //temp是整型}temp和f_temp都是在程序開頭定義的變量,在各過程中都有效溫度值在LED數碼管上顯示voiddisp_temp(uintreal) //溫度值轉換成便于輸出顯示的形式{ LED[7]=0; LED[6]=real%10; //溫度值小數點后第1位 LED[5]=(real/10)%10;
//溫度值個位數 LED[4]=real/100; //溫度值十位數}voiddisplay() //數碼管顯示{ P2=0; P0=table[LED[0]];delay(2); //表示第0號傳感器
P2=4; P0=table[LED[4]];delay(2); //溫度值十位數
P2=5; P0=table[LED[5]]|0x80;delay(2); //溫度值個位數,包含小數點
P2=6; P0=table[LED[6]];delay(2); //溫度值1/10位
P2=7; P0=table[LED[7]];delay(2); //溫度值1/100位(實際上總為0)}數據定義#include<reg52.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbit
ds=P2^3;//溫度傳感器信號線uint
temp,realtemp;floatf_temp;ucharcodetable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0123456789ucharLED[8]={0,10,10,10,0,0,0,0};voiddelay(uintz) //延時函數{
uint
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}主控程序main()voidmain(){ while(1) { display();
tempchange(); display();
realtemp=get_temp(); display();
disp_temp(realtemp); }}由于一次溫度采集的過程很長(超過2ms),故不便于利用中斷方式控制LED數碼管顯示過程多點溫度采集需要解決的問題:系統中共包含多少個溫度傳感器?怎樣區分不同的溫度傳感器?怎樣對指定的溫度傳感器執行操作?執行操作的時間有多長?溫度數據傳輸的最大距離有多遠?溫度傳感器的供電問題怎樣解決?多點測溫網絡的構建方法多個DS18B20掛接在同一條總線上在硬件系統搭建時,先讀取DS18B20的ROM序列號,并將它們固化在程序中(如數組),單片機向總線發送匹配ROM命令之后,緊跟發送一個序列號,接下來讀取的溫度數據就來自與ROM序列號匹配的那個DS18B20每一個I/O口掛接一個DS18B20利用SEARCHROM指令動態搜索64位ROM碼(二叉樹遍歷)二叉樹遍歷SEARCHROM指令:發出searchrom
指令后,ds18b20將所有的第一位0,0,0放到總線上,單片機讀到的是相與的結果為0。接著ds18b20將所有器件的第一位的補碼1,1,1放到總線上,單片機讀到的數據是相與的結果為1.等待主機響應之后,繼續將下一位及其反碼,發送到總線上。
每次讀ds18b20發出的兩位會得到00,01,10,11的結果其含義如下:00:掛在總線上的ds18b20在這一位上有沖突,即有的在這一位上為0,有的在這一位上為101:所有DS18B20此位數據均為010:所有DS18B20此位數據均為111:沒有DS18B20二叉樹遍歷ROM搜索過程是簡單三步過程的重復(1)讀一位(2)讀核位的補碼(3)寫所需的那一位的值:發0,則選中這一位為0的ds18b20,在此后的過程中,僅這一位為0的ds18b20參與向總線收發數據發1,則選中這一位為1的ds18b20,在此后的過程中,僅這一位為1的ds18b20參與向總線收發數據總線主機在ROM的每一位上完成這三步過程。全部過程完成之后,總線主機便知道一個器件中ROM的內容讀取傳感器序列號并上傳到串口助手#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^3; //溫度傳感器信號線ucharfCode[8];voidds1820delay(uinti) //延時1微秒{
while(i--);}復位voidds1820reset() //ds1820復位{ DQ=1; //數據線輸出高電平
ds1820delay(4); //延時
DQ=0; //數據線輸出低電平
ds1820delay(100); //延時480~960us DQ=1; //數據線輸出高電平
ds1820delay(40); //延時15~60us}讀數據字節uchards1820readbyte() //ds1820讀數據字節{
uchari=0;
uchar
dat=0; for(i=8;i>0;i--) //逐位讀取溫度傳器提供的數據
{ DQ=0; //數據線輸出0
dat>>=1; //右移一位,準備用存放讀得的數據位
DQ=1; //數據線輸出1,執行下面語句延時4us
if(DQ) //讀數據線狀態,得到一個數據位
dat|=0x80; //若讀得1,保存到dat的當前最高位上
ds1820delay(10); //延時30us }
return(dat);}寫數據字節voidds1820writebyte(ucharwdata) //ds1820寫數據字節{
uchari=0;for(i=8;i>0;i--) //按從低到高順序,逐位輸出數據字節
{ DQ=0; //數據
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國松焦油行業投資前景及策略咨詢研究報告
- 2025至2030年中國智能數顯多回路巡回檢測報警儀數據監測研究報告
- 2025至2030年中國無活塞桿氣缸行業投資前景及策略咨詢報告
- 2025至2030年中國數碼顯示電腦刺繡機行業發展研究報告
- 怎樣提升孩子公民素養
- 寶貝怕黑怎么辦?勇敢心養成術
- 西瓜涂鴉美術課件
- 課程評估與班級教育質量提升計劃
- 環境保護主題的學校藝術活動計劃
- 班級創新活動的挖掘與實現計劃
- 2025年龍江森工集團權屬林業局有限公司招聘筆試參考題庫含答案解析
- 美國、加拿大簽證申請表
- 比較學前教育名詞解釋
- 區級綜合醫院關于落實區領導干部醫療保健工作實施方案
- 申請XXX最低生活保障不予確認同意告知書
- 關于無行賄犯罪行為記錄的承諾書
- 防城港職業技術學院籌設實施方案
- 城市雕塑藝術工程量清單計價定額2020版
- 河池市出租車駕駛員從業資格區域科目考試題庫(含答案)
- 淘汰賽賽對陣表
- 醫療糾紛中的病歷偽造篡改問題研究
評論
0/150
提交評論