




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、帶溫度補(bǔ)償?shù)腍C-SR04超聲波測距系統(tǒng)利用從網(wǎng)上購買的HC-SR04超聲波模塊制作了一個(gè)測距裝置,HC-SR04自身不帶溫度補(bǔ)償功能,所以加上一個(gè)使用DS18B20做的溫度測量模塊。整個(gè)系統(tǒng)包括:51單片機(jī)最小系統(tǒng),超聲波測距模塊、溫度測量模塊、液晶顯示模塊。使用了如下主要元器件:元件說明數(shù)量STC89C52RC51單片機(jī)1HC-SR04超聲波測距模塊1DS18B20溫度測量模塊11602液晶顯示模塊1系統(tǒng)電路圖完成接線后的測距系統(tǒng)實(shí)物圖51單片機(jī)最小系統(tǒng)單片機(jī)型號:STC89C52RC,晶振:12Mhz。自己動(dòng)手焊接的最小系統(tǒng)板。LCD1602A液晶顯示模塊:HC-SR04超聲波測距模塊H
2、C-SR04超聲波測距模塊可提供2cm至400cm的非接觸式距離感測功能,測距精度可達(dá)3mm;模塊自身包括超聲波發(fā)射器、接收器與控制電路。實(shí)物正反兩面圖HC-SR04電氣參數(shù):HC-SR04工作原理及說明:1、 給Trig觸發(fā)控制信號IO端口至少10us的高電平信號;2、 模塊自動(dòng)發(fā)送8個(gè)40khz的方波,并自動(dòng)檢測是否有信號返回;3、 有信號返回時(shí),Echo回響信號輸出端口輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間;4、 兩次測距時(shí)間間隔最少在60ms以上,以防止發(fā)射信號對回響信號的影響;超聲波時(shí)序圖單片機(jī)控制HC-SR04超聲波測距說明:原理圖中,單片機(jī)的P2.5口接HC
3、-SR04的Trig端口,P2.6口接HC-SR04的Echo端口,超聲波在傳播時(shí)碰到障礙物即返回,HC-SR04模塊收到回波信號后Echo口輸出一個(gè)高電平,單片機(jī)檢測到高電平后即啟動(dòng)計(jì)數(shù)器開始計(jì)數(shù),直到單片機(jī)檢測到Echo口變成低電平后結(jié)束計(jì)數(shù),計(jì)數(shù)器的計(jì)數(shù)值乘以單片機(jī)計(jì)數(shù)周期就是超聲波從發(fā)射到接收的往返時(shí)間,即距離S=v*t/2;由于在室溫下,聲速受溫度的影響,其變化關(guān)系為:V=334.1+T*0.61(T為當(dāng)前溫度),利用DS18B20溫度傳感器可以得到環(huán)境溫度,補(bǔ)償溫度對聲速的影響。當(dāng)溫度高于26度或低于14度時(shí),上述公式不能完全滿足對測量的修正了,所以高于26度時(shí)取26度,低于14度
4、時(shí)取14度。距離計(jì)算公式為:S=(334.1+T*0.61)*N*T0/2T:當(dāng)前環(huán)境溫度值N:計(jì)數(shù)值T0:單片機(jī)計(jì)數(shù)周期=晶振頻率/12(微秒)HC-SR04測量存在不穩(wěn)定性,所在對同一距離進(jìn)行多次測量,并對測量結(jié)果排序,去除最大和最小值,將余下的求平均值。程序流程圖:程序代碼:主程序代碼:/* 程序:基于HC-SR04的超聲波測距系統(tǒng)* 單片機(jī)型號:STC89C52 12MHz* 說明:按下K1鍵后,指示燈點(diǎn)亮,開始連續(xù)進(jìn)行7次超聲波測距,每次測距間隔80ms,* 完成后對7次結(jié)果排序并將最大的2個(gè)數(shù)值和最小的2個(gè)數(shù)值去除,對剩余的* 3個(gè)數(shù)值取平均值。完成后指示燈滅,輸出結(jié)果到LCD16
5、02上。測量超出范圍則發(fā)出報(bào)警聲。* 使用兩個(gè)IO端口控制HC-SR04觸發(fā)信號輸入和回響信號輸出,* 以及一個(gè)T0定時(shí)器用于時(shí)間計(jì)數(shù)。* 使用DS18B20測量環(huán)境溫度,聲速公式:V=334.1m/s+Temperature*0.61,* 單片機(jī)晶振為12Mhz(11.953M),計(jì)數(shù)時(shí)為T=1us* 計(jì)算公式:S=(334.1m/s+Temperature*0.61)*N*T/2,N為計(jì)數(shù)值=TH0*256+TL0*/*包含頭文件*/#include #include /*宏定義*/#define ucharunsigned char/無符號8位#define uintunsigned i
6、nt /無符號16位#define ulongunsigned long /無符號32位/*全局變量定義*/sbit K1=P10;/按下K1后,開始測距sbit LEDRed=P11;/測距指示燈,亮表示正在測距,滅表示測距完成sbit BEEP=P12;/報(bào)警測量超出范圍sbit Trig=P25;/HC-SR04觸發(fā)信號輸入sbit Echo=P26;/HC-SR04回響信號輸出float xdata DistanceValue=0.0;/測量的距離值float xdata SPEEDSOUND;/聲速float xdata XTALTIME;/單片機(jī)計(jì)數(shù)周期uchar xdata st
7、ringBuf6;/數(shù)值轉(zhuǎn)字符串緩沖/LCD1602提示信息uchar code Prompts16=Measure Distance,/測量距離- Out of Range -,/超出測量范圍MAX range 400cm ,/測距最大值400cmMIN range 2cm ,/測距最小值2cm ,/清屏 Press K1 Start /按鍵開始測量;uchar xdata DistanceText=Range: ;/測量結(jié)果字符串uchar xdata TemperatureText=Temperature: ;/測量溫度值/*外部函數(shù)聲明*/extern void LCD_Initial
8、ize();extern void LCD_Display_String(uchar *, uchar);extern void ReadTemperatureFromDS18B20();extern int xdata CurTempInteger; /毫秒延時(shí)函數(shù)void DelayMS(uint ms);/20微秒延時(shí)函數(shù)void Delay20us();/HCSR04初始化void HCSR04_Initialize();/測量距離float MeasuringDistance();/測距的數(shù)值排序求平均float DistanceStatistics();/輸出距離值到LCD1602
9、上void DisplayDistanceValue(float dat);/將無符號的整數(shù)轉(zhuǎn)成字符串,返回字符串長度,不包括0結(jié)束符uchar UnsigedIntToString(uint value);/蜂鳴器void Beep(uchar time);/顯示溫度值void DisplayTemperatureValue();/*主函數(shù)*/void main()LCD_Initialize();/1602初始化LCD_Display_String(Prompts0,0x00);LCD_Display_String(Prompts5,0x40);ReadTemperatureFromDS1
10、8B20();/測溫度HCSR04_Initialize();/HC-SR04初始化while(1)if(K1=0)DelayMS(5);if(K1=0)Beep(1);while(K1=0);LEDRed=0;ReadTemperatureFromDS18B20();/測溫度DisplayTemperatureValue();if(CurTempInteger26)CurTempInteger=26;SPEEDSOUND=334.1+CurTempInteger*0.61;/計(jì)算聲速DistanceValue=DistanceStatistics();/測距并返回距離值DisplayDist
11、anceValue(DistanceValue);/顯示距離值LEDRed=1;/測距的數(shù)值排序求平均float DistanceStatistics()uchar i,j;float disData7,t;/連續(xù)測距for(i=0;i7;i+)disDatai=MeasuringDistance();DelayMS(80);/排序for(j=0;j=6;j+)for(i=0;idisDatai+1)t=disDatai;disDatai=disDatai+1;disDatai+1=t; return (disData2+disData3+disData4)/3;/測量距離float Meas
12、uringDistance()/最大定時(shí)時(shí)間約65msTH0=0;TL0=0;/生成20us的脈沖寬度的觸發(fā)信號Trig=1;Delay20us();Trig=0;/等待回響信號變高電平while(!Echo);TR0=1;/啟動(dòng)定時(shí)器0/等待回響信號變低電平while(Echo);TR0=0;/關(guān)閉定時(shí)器0/返回距離值(mm)return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000;/HCSR04初始化void HCSR04_Initialize()/計(jì)算單片機(jī)計(jì)數(shù)周期 晶振=11.953M單位usXTALTIME=12/11.9
13、53;/溫度25度時(shí)聲速的值SPEEDSOUND=334.1+25*0.61;Trig=0;Echo=0;TMOD=0x01;/輸出距離值到LCD1602上void DisplayDistanceValue(float dat)uchar i=0,j=0,len;uint value;value=(uint)dat;/范圍檢查大于4000mm和小于20mm都為超出測量范圍if(value4000)LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts2,0x40);Beep(2);else if(value20)LCD_Disp
14、lay_String(Prompts1,0x00);LCD_Display_String(Prompts3,0x40);Beep(2);else/將數(shù)值轉(zhuǎn)換成字符串len=UnsigedIntToString(value);/保留1位小數(shù)while(stringBufi!=0)if(len-j=1) DistanceText6+j=.;j+;elseDistanceText6+j=stringBufi;i+;j+;DistanceText6+j=c;j+;DistanceText6+j=m;i=7+j;/剩余位置補(bǔ)空格while(i16)DistanceTexti= ;i+;/LCD_Disp
15、lay_String(Prompts0,0x00);LCD_Display_String(DistanceText,0x40);/顯示溫度值void DisplayTemperatureValue()TemperatureText13=CurTempInteger/10+0;TemperatureText14=CurTempInteger%10+0;TemperatureText15=C;LCD_Display_String(TemperatureText,0x00);/將無符號的整數(shù)轉(zhuǎn)成字符串,返回字符串長度uchar UnsigedIntToString(uint value)uchar
16、i=0,t,length;/從個(gè)位開始轉(zhuǎn)換dostringBufi=0+value%10;value=value/10;i+;while(value!=0);length=i;/將字符串顛倒順序for(i=0;i(length/2);i+)t=stringBufi;stringBufi=stringBuflength-i-1;stringBuflength-i-1=t;stringBuflength=0;return length;/蜂鳴器void Beep(uchar time)uchar i;for(i=0;i100;i+)BEEP=!BEEP;DelayMS(time); BEEP=0;
17、 DelayMS(100);/延時(shí)函數(shù) 毫秒 12.000MHzvoid DelayMS(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/延時(shí)函數(shù) 20微秒 12.000MHzvoid Delay20us()uchar i;_nop_();i = 7;while (-i);/定時(shí)器0中斷void Timer0() interrupt 1DS18B20代碼:/*-* 程序功能: DS18B20溫度檢測程序* 單片機(jī)型號:STC89C52 12MHz* 晶振: 12Mhz-*/*包含頭文件*/#
18、include #include /*宏定義*/#define ucharunsigned char/無符號8位#define uintunsigned int /無符號16位/定義DS18B20端口DS18B20_DQsbit DS18B20_DQ = P27;/當(dāng)前采集的溫度值整數(shù)部分int xdata CurTempInteger; /當(dāng)前采集的溫度值小數(shù)部分int xdata CurTempDecimal;/*-* 功能:延時(shí)函數(shù) STC89C52 12MHz 12T模式* 參數(shù):無* 返回:無-*/void Delayus(uint count)while (-count);/*-*
19、 功能:DS18B20復(fù)位及狀態(tài)檢測* 參數(shù):無* 返回:0或1,1表示未準(zhǔn)備好,0表示準(zhǔn)備好-*/uchar Reset_DS18B20()uchar status;DS18B20_DQ=1;Delayus(1);/開始復(fù)位過程DS18B20_DQ=0;/數(shù)據(jù)線拉低Delayus(100);/延時(shí)480us-960usDS18B20_DQ=1;/數(shù)據(jù)線拉高Delayus(10);/延時(shí)15us-60usstatus=DS18B20_DQ;/讀取數(shù)據(jù)線上的狀態(tài)Delayus(120);return status;/*-* 功能:寫一字節(jié)到DS18B20中* 參數(shù):dat=數(shù)據(jù)* 返回:無-*/
20、void WriteByteToDS18B20(uchar dat)uchar i;for(i=0;i=1;/準(zhǔn)備下一位數(shù)據(jù)/*-* 功能:從DS18B20中讀一字節(jié)* 參數(shù):無* 返回:讀取的數(shù)據(jù)-*/uchar ReadByteFromDS18B20()uchar i,dat=0;for(i=0;i=1;DS18B20_DQ=1;/釋放總線,準(zhǔn)備讀1位數(shù)據(jù)Delayus(2);/延時(shí)4usif(DS18B20_DQ) dat|=0x80;/合并每位數(shù)據(jù)Delayus(15);/延時(shí)60usDS18B20_DQ=1;/拉高總線,準(zhǔn)備讀下1位數(shù)據(jù)return dat;/*-* 功能:讀取溫度值
21、并轉(zhuǎn)換成有符號的數(shù)值形式* 參數(shù):無* 返回:無-*/void ReadTemperatureFromDS18B20()uchar flag=0;/正負(fù)符號標(biāo)志/存儲當(dāng)前采集的溫度值uchar TempValue=0,0; if(Reset_DS18B20()CurTempInteger=255;CurTempDecimal=0;elseWriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS18B20(0x44);/溫度轉(zhuǎn)換命令Reset_DS18B20();/復(fù)位WriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS
22、18B20(0xBE);/讀取溫度暫存器命令TempValue0=ReadByteFromDS18B20();/先讀低字節(jié)溫度值TempValue1=ReadByteFromDS18B20();/后讀高字節(jié)溫度值Reset_DS18B20();/復(fù)位/計(jì)算溫度值/先進(jìn)行正溫度與負(fù)溫度判斷,高5位全為1(0xF8)則為負(fù)數(shù)if(TempValue1&0xF8)=0xF8)/負(fù)溫度計(jì)算:取反加1,低字節(jié)為0時(shí),高字節(jié)取反加1,否則不需要。TempValue1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;fla
23、g=1;/負(fù)數(shù)標(biāo)志/將溫度值分為整數(shù)和小數(shù)兩部分存儲(默認(rèn)為12位精度)CurTempInteger=(TempValue1&0x07)4);if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;LCD1602程序代碼:/*-* 程序功能:1602液晶顯示程序* 單片機(jī)型號:STC89C52 12MHz-*/#include #include /*宏定義*/#define ucharunsigned char#define uint unsigned int#define Delay4us()_
24、nop_();_nop_();_nop_();_nop_();/*1602液晶顯示器控制端口分配,數(shù)據(jù)使用P0端口*/sbit LCD_RS=P20;sbit LCD_RW=P21;sbit LCD_EN=P22;/*-* 功能:毫秒級延時(shí)函數(shù)* 參數(shù):ms=毫秒數(shù)值* 返回:無-*/void LCDDelay(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/*-* 功能:1602液晶忙狀態(tài)檢測* 參數(shù):無* 返回:0或1,1表示狀態(tài)忙,0表示狀態(tài)閑-*/bit LCD_Busy_Check
25、()bit result;LCD_RS=0;LCD_RW=1;LCD_EN=1;Delay4us();result=(bit)(P0&0x80);LCD_EN=0;return result;/*-* 功能:1602液晶寫指令* 參數(shù):cmd=1602LCD指令* 返回:無-*/void Write_LCD_Command(uchar cmd)while(LCD_Busy_Check();LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;Delay4us();LCD_EN=1;Delay4us();LCD_EN=0;/*-* 功能:1602液晶寫數(shù)據(jù)* 參數(shù):dat=一個(gè)字節(jié)數(shù)據(jù)* 返回:無-*/void Write_LCD_Data(uchar dat)while(LCD_Busy_Check();LCD_RS=1;LCD_RW=0;LCD_EN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車主與司機(jī)智能駕駛培訓(xùn)合同
- 大型金屬礦產(chǎn)采礦權(quán)抵押擔(dān)保合同范本
- 星球美術(shù)教學(xué)課件
- 醫(yī)療專業(yè)常見病癥診斷與處理知識測試試卷
- 2024-2025學(xué)年安徽省江南十校高一下學(xué)期5月份聯(lián)考化學(xué)試題及答案(人教B卷)
- 保險(xiǎn)客戶關(guān)系管理培訓(xùn)體系構(gòu)建考核試卷
- 3D打印在助聽器制造中的應(yīng)用考核試卷
- 原料配比對人造板抗變形性能的影響考核試卷
- 中草藥養(yǎng)生與四季養(yǎng)生搭配考核試卷
- 在職護(hù)士考試試題及答案
- 學(xué)生宿舍管理服務(wù)方案
- 宣傳錄音制作合同范本
- 高校實(shí)驗(yàn)室安全基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《安全隱患排查整改》主題班會
- DL∕T 1919-2018 發(fā)電企業(yè)應(yīng)急能力建設(shè)評估規(guī)范
- 2023-2024學(xué)年四川省南充市儀隴縣五年級數(shù)學(xué)第二學(xué)期期末經(jīng)典試題含解析
- 育苗協(xié)議書各類合同范本
- DB11/T 1135-2014-供熱管線有限空間高溫高濕作業(yè)安全技術(shù)規(guī)程
- (完整版)100以內(nèi)加減法豎式計(jì)算題
- 《客艙安全與應(yīng)急處置》-課件:應(yīng)急撤離的原因和原則
- 設(shè)備維保的預(yù)防性維修與預(yù)防性管理
評論
0/150
提交評論