




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、帶溫度補償?shù)腍C-SR04超聲波測距系統(tǒng)利用從網上購買的HC-SR04超聲波模塊制作了一個測距裝置,HC-SR04自身不帶溫度補償功能,所以加上一個使用DS18B20做的溫度測量模塊。整個系統(tǒng)包括:51單片機最小系統(tǒng),超聲波測距模塊、溫度測量模塊、液晶顯示模塊。使用了如下主要元器件:元件說明數(shù)量STC89C52RC51單片機1HC-SR04超聲波測距模塊1DS18B20溫度測量模塊11602液晶顯示模塊1系統(tǒng)電路圖完成接線后的測距系統(tǒng)實物圖51單片機最小系統(tǒng)單片機型號:STC89C52RC,晶振:12Mhz。自己動手焊接的最小系統(tǒng)板。LCD1602A液晶顯示模塊:HC-SR04超聲波測距模塊H
2、C-SR04超聲波測距模塊可提供2cm至400cm的非接觸式距離感測功能,測距精度可達3mm;模塊自身包括超聲波發(fā)射器、接收器與控制電路。實物正反兩面圖HC-SR04電氣參數(shù):HC-SR04工作原理及說明:1、 給Trig觸發(fā)控制信號IO端口至少10us的高電平信號;2、 模塊自動發(fā)送8個40khz的方波,并自動檢測是否有信號返回;3、 有信號返回時,Echo回響信號輸出端口輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間;4、 兩次測距時間間隔最少在60ms以上,以防止發(fā)射信號對回響信號的影響;超聲波時序圖單片機控制HC-SR04超聲波測距說明:原理圖中,單片機的P2.5口接HC
3、-SR04的Trig端口,P2.6口接HC-SR04的Echo端口,超聲波在傳播時碰到障礙物即返回,HC-SR04模塊收到回波信號后Echo口輸出一個高電平,單片機檢測到高電平后即啟動計數(shù)器開始計數(shù),直到單片機檢測到Echo口變成低電平后結束計數(shù),計數(shù)器的計數(shù)值乘以單片機計數(shù)周期就是超聲波從發(fā)射到接收的往返時間,即距離S=v*t/2;由于在室溫下,聲速受溫度的影響,其變化關系為:V=334.1+T*0.61(T為當前溫度),利用DS18B20溫度傳感器可以得到環(huán)境溫度,補償溫度對聲速的影響。當溫度高于26度或低于14度時,上述公式不能完全滿足對測量的修正了,所以高于26度時取26度,低于14度
4、時取14度。距離計算公式為:S=(334.1+T*0.61)*N*T0/2T:當前環(huán)境溫度值N:計數(shù)值T0:單片機計數(shù)周期=晶振頻率/12(微秒)HC-SR04測量存在不穩(wěn)定性,所在對同一距離進行多次測量,并對測量結果排序,去除最大和最小值,將余下的求平均值。程序流程圖:程序代碼:主程序代碼:/* 程序:基于HC-SR04的超聲波測距系統(tǒng)* 單片機型號:STC89C52 12MHz* 說明:按下K1鍵后,指示燈點亮,開始連續(xù)進行7次超聲波測距,每次測距間隔80ms,* 完成后對7次結果排序并將最大的2個數(shù)值和最小的2個數(shù)值去除,對剩余的* 3個數(shù)值取平均值。完成后指示燈滅,輸出結果到LCD16
5、02上。測量超出范圍則發(fā)出報警聲。* 使用兩個IO端口控制HC-SR04觸發(fā)信號輸入和回響信號輸出,* 以及一個T0定時器用于時間計數(shù)。* 使用DS18B20測量環(huán)境溫度,聲速公式:V=334.1m/s+Temperature*0.61,* 單片機晶振為12Mhz(11.953M),計數(shù)時為T=1us* 計算公式:S=(334.1m/s+Temperature*0.61)*N*T/2,N為計數(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;/報警測量超出范圍sbit Trig=P25;/HC-SR04觸發(fā)信號輸入sbit Echo=P26;/HC-SR04回響信號輸出float xdata DistanceValue=0.0;/測量的距離值float xdata SPEEDSOUND;/聲速float xdata XTALTIME;/單片機計數(shù)周期uchar xdata st
7、ringBuf6;/數(shù)值轉字符串緩沖/LCD1602提示信息uchar code Prompts16=Measure Distance,/測量距離- Out of Range -,/超出測量范圍MAX range 400cm ,/測距最大值400cmMIN range 2cm ,/測距最小值2cm ,/清屏 Press K1 Start /按鍵開始測量;uchar xdata DistanceText=Range: ;/測量結果字符串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ù)void DelayMS(uint ms);/20微秒延時函數(shù)void Delay20us();/HCSR04初始化void HCSR04_Initialize();/測量距離float MeasuringDistance();/測距的數(shù)值排序求平均float DistanceStatistics();/輸出距離值到LCD1602
9、上void DisplayDistanceValue(float dat);/將無符號的整數(shù)轉成字符串,返回字符串長度,不包括0結束符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;/計算聲速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()/最大定時時間約65msTH0=0;TL0=0;/生成20us的脈沖寬度的觸發(fā)信號Trig=1;Delay20us();Trig=0;/等待回響信號變高電平while(!Echo);TR0=1;/啟動定時器0/等待回響信號變低電平while(Echo);TR0=0;/關閉定時器0/返回距離值(mm)return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000;/HCSR04初始化void HCSR04_Initialize()/計算單片機計數(shù)周期 晶振=11.953M單位usXTALTIME=12/11.9
13、53;/溫度25度時聲速的值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ù)值轉換成字符串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;/剩余位置補空格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ù)轉成字符串,返回字符串長度uchar UnsigedIntToString(uint value)uchar
16、i=0,t,length;/從個位開始轉換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ù) 毫秒 12.000MHzvoid DelayMS(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/延時函數(shù) 20微秒 12.000MHzvoid Delay20us()uchar i;_nop_();i = 7;while (-i);/定時器0中斷void Timer0() interrupt 1DS18B20代碼:/*-* 程序功能: DS18B20溫度檢測程序* 單片機型號:STC89C52 12MHz* 晶振: 12Mhz-*/*包含頭文件*/#
18、include #include /*宏定義*/#define ucharunsigned char/無符號8位#define uintunsigned int /無符號16位/定義DS18B20端口DS18B20_DQsbit DS18B20_DQ = P27;/當前采集的溫度值整數(shù)部分int xdata CurTempInteger; /當前采集的溫度值小數(shù)部分int xdata CurTempDecimal;/*-* 功能:延時函數(shù) STC89C52 12MHz 12T模式* 參數(shù):無* 返回:無-*/void Delayus(uint count)while (-count);/*-*
19、 功能:DS18B20復位及狀態(tài)檢測* 參數(shù):無* 返回:0或1,1表示未準備好,0表示準備好-*/uchar Reset_DS18B20()uchar status;DS18B20_DQ=1;Delayus(1);/開始復位過程DS18B20_DQ=0;/數(shù)據(jù)線拉低Delayus(100);/延時480us-960usDS18B20_DQ=1;/數(shù)據(jù)線拉高Delayus(10);/延時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;/準備下一位數(shù)據(jù)/*-* 功能:從DS18B20中讀一字節(jié)* 參數(shù):無* 返回:讀取的數(shù)據(jù)-*/uchar ReadByteFromDS18B20()uchar i,dat=0;for(i=0;i=1;DS18B20_DQ=1;/釋放總線,準備讀1位數(shù)據(jù)Delayus(2);/延時4usif(DS18B20_DQ) dat|=0x80;/合并每位數(shù)據(jù)Delayus(15);/延時60usDS18B20_DQ=1;/拉高總線,準備讀下1位數(shù)據(jù)return dat;/*-* 功能:讀取溫度值
21、并轉換成有符號的數(shù)值形式* 參數(shù):無* 返回:無-*/void ReadTemperatureFromDS18B20()uchar flag=0;/正負符號標志/存儲當前采集的溫度值uchar TempValue=0,0; if(Reset_DS18B20()CurTempInteger=255;CurTempDecimal=0;elseWriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS18B20(0x44);/溫度轉換命令Reset_DS18B20();/復位WriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS
22、18B20(0xBE);/讀取溫度暫存器命令TempValue0=ReadByteFromDS18B20();/先讀低字節(jié)溫度值TempValue1=ReadByteFromDS18B20();/后讀高字節(jié)溫度值Reset_DS18B20();/復位/計算溫度值/先進行正溫度與負溫度判斷,高5位全為1(0xF8)則為負數(shù)if(TempValue1&0xF8)=0xF8)/負溫度計算:取反加1,低字節(jié)為0時,高字節(jié)取反加1,否則不需要。TempValue1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;fla
23、g=1;/負數(shù)標志/將溫度值分為整數(shù)和小數(shù)兩部分存儲(默認為12位精度)CurTempInteger=(TempValue1&0x07)4);if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;LCD1602程序代碼:/*-* 程序功能:1602液晶顯示程序* 單片機型號: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ù):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=一個字節(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 5009.247-2025食品安全國家標準食品中紐甜的測定
- 鄭州食品工程職業(yè)學院《藥理學C》2023-2024學年第一學期期末試卷
- 天津師范大學《業(yè)設計》2023-2024學年第二學期期末試卷
- 山東師范大學附中2025年高三4月質量檢測試題物理試題含解析
- 銅川職業(yè)技術學院《國際投資學》2023-2024學年第二學期期末試卷
- 山東藥品食品職業(yè)學院《酒文化概論》2023-2024學年第一學期期末試卷
- 豫章師范學院《酒店前廳與客房管理》2023-2024學年第二學期期末試卷
- 清徐縣2024-2025學年三年級數(shù)學第二學期期末調研模擬試題含解析
- 邵陽學院《專業(yè)英語(運輸)》2023-2024學年第一學期期末試卷
- 重慶傳媒職業(yè)學院《法律英語》2023-2024學年第一學期期末試卷
- 醫(yī)院心理危機干預預案
- 二年級下冊數(shù)學口算綜合練習題 (每頁100題)
- 湖北公務員面試模擬64
- 2024年中國燕窩八寶粥市場調查研究報告
- GB/T 2624.6-2024用安裝在圓形截面管道中的差壓裝置測量滿管流體流量第6部分:楔形裝置
- 信息安全意識培訓課件
- 人教版數(shù)學八年級上冊:14-整式的乘法與因式分解-專題練習(附答案)
- Python試題庫(附參考答案)
- AIGC視域下非遺文創(chuàng)產品的數(shù)字化轉型升級路徑研究
- 推廣綠色用電活動方案
- 先天性巨結腸遠期療效評估與隨訪
評論
0/150
提交評論