版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Word 格式基于 51 單片機帶溫度補償的HC-SR04超聲波測距系統(tǒng)利用從網上購買的HC-SR04超聲波模塊制作了一個測距裝置,HC-SR04自身不帶溫度補償功能,所以加上一個使用DS18B20做的溫度測量模塊。整個系統(tǒng)包括:51 單片機最小系統(tǒng),超聲波測距模塊、溫度測量模塊、液晶顯示模塊。使用了如下主要元器件:元件說明數量STC90C516RC51 單片機1HC-SR04超聲波測距模塊1DS18B20溫度測量模塊1lcd1602液晶顯示模塊1系統(tǒng)電路圖51 單片機最小系統(tǒng)單片機型號:STC90C516,晶振:12Mhz。自己動手焊接的最小系統(tǒng)板。LCD1602A液晶顯示模塊:HC-SR0
2、4超聲波測距模塊HC-SR04超聲波測距模塊可提供2cm至 400cm的非接觸式距離感測功能,測距精度可達3mm;模塊自身包括超聲波發(fā)射器、接收器與控制電路。實物正反兩面圖HC-SR04電氣參數:HC-SR04工作原理及說明:1、 給 Trig 觸發(fā)控制信號IO 端口至少10us 的高電平信號;2、 模塊自動發(fā)送8 個 40khz 的方波,并自動檢測是否有信號返回;3、 有信號返回時,Echo回響信號輸出端口輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間;4、 兩次測距時間間隔最少在60ms以上,以防止發(fā)射信號對回響信號的影響;超聲波時序圖單片機控制HC-SR04超聲波測距說明:
3、原理圖中,單片機的P1.7 口接HC-SR04的 Trig 端口, P1.6 口接HC-SR04的Echo端口,超聲波在傳播時碰到障礙物即返回,HC-SR04模塊收到回波信號后Echo 口輸出一個高電平,單片機檢測到高電平后即啟動計數器開始計數,直到單片機檢測到Echo 口變成低電平后結束計數,計數器的計數值乘以單片機計數周期就是超聲波從發(fā)射到接收的往返時間,即距離S=v*t/2 ;由于在室溫下,聲速受溫度的影響,其變化關系為:V=334.1+T*0.61(T 為當前溫度),利用 DS18B20溫度傳感器可以得到環(huán)境溫度,補償溫度對聲速的影響。當溫度高于26 度或低于14 度時,上述公式不能完
4、全滿足對測量的修正了,所以高于26 度時取 26 度,低于14 度時取 14 度。距離計算公式為:S=(334.1+T*0.61)*N*T 0/2T:當前環(huán)境溫度值N:計數值T0:單片機計數周期=晶振頻率/12( 微秒 )HC-SR04測量存在不穩(wěn)定性,所在對同一距離進行多次測量,并對測量結果排序,去除最大和最小值,將余下的求平均值。程序流程圖:完美整理程序代碼:/* 程序:基于HC-SR04的超聲波測距系統(tǒng)* 單片機型號:STC90C516 12MHz* 說明:按下K1 鍵后,指示燈點亮,開始連續(xù)進行7 次超聲波測距,每次測距間隔80ms,完成后對7 次結果排序并將最大的2 個數值和最小的2
5、 個數值去除,對剩余的* 3 個數值取平均值。完成后指示燈滅,輸出結果到LCD1602上。測量超出范圍則發(fā)出報警聲。使用兩個IO 端口控制HC-SR04觸發(fā)信號輸入和回響信號輸出,T0 定時器用于時間計數。使用DS18B20測量環(huán)境溫度,聲速公式:V=334.1m/s+Temperature*0.61 ,單片機晶振為12Mhz(11.953M) ,計數時為T=1us計算公式:S=(334.1m/s+Temperature*0.61)*N*T/2, N為計數值=TH0*256+TL0*/* 包含頭文件*/#include <reg51.h>#include <intrins.h
6、>#define Delay4us()_nop_();_nop_();_nop_();_nop_();/ 無符號 8 位/ 無符號16 位/ 無符號32 位/* 宏定義 */#define uchar#define uint#define ulongunsigned charunsigned intunsigned long/ 測量的距離值/ 聲速/ 單片機計數周期/ 數值轉字符串緩沖/* 全局變量定義*/sbit K1=P10;/ 按下 K1 后,開始測距sbit LEDRed=P11;/ 測距指示燈,亮表示正在測距,滅表示測距完成sbit BEEP=P15;/ 報警測量超出范圍sbi
7、t Trig=P17;/HC-SR04 觸發(fā)信號輸入sbit Echo=P16;/HC-SR04 回響信號輸出float xdata DistanceValue=0.0;float xdata SPEEDSOUND;float xdata XTALTIME;uchar xdata stringBuf6;/LCD1602 提示信息 uchar code Prompts16= "Measure Distance", "- Out of Range -", "MAX range 400cm ", "MIN range 2cm &q
8、uot;, ""," Press K1 Start " ;uchar xdata DistanceText="Range:uchar xdata TemperatureText="Temperature:/ 測量距離/ 超出測量范圍/ 測距最大值400cm/ 測距最小值2cm/ 清屏/ 按鍵開始測量"/"/測量結果字符串測量溫度值/* 外部函數聲明*/extern void LCD_Initialize();extern void LCD_Display_String(uchar *, uchar);extern
9、void ReadTemperatureFromDS18B20();extern int xdata CurTempInteger;/ 毫秒延時函數void DelayMS(uint ms);/20 微秒延時函數void Delay20us();/HCSR04 初始化void HCSR04_Initialize();/ 測量距離float MeasuringDistance();/ 測距的數值排序求平均float DistanceStatistics();/ 輸出距離值到LCD1602上void DisplayDistanceValue(float dat);/ 將無符號的整數轉成字符串,返回
10、字符串長度,不包括'0' 結束符uchar UnsigedIntToString(uint value);/ 蜂鳴器void Beep(uchar time);/ 顯示溫度值void DisplayTemperatureValue();/ 測量距離float MeasuringDistance()/ 最大定時時間約65msTH0=0;TL0=0;/ 生成 20us 的脈沖寬度的觸發(fā)信號Trig=1;Delay20us();Trig=0;/ 等待回響信號變高電平while(!Echo);TR0=1;/ 啟動定時器0/ 等待回響信號變低電平while(Echo);TR0=0;/ 關
11、閉定時器0/ 返回距離值(mm)return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000; /HCSR04 初始化void HCSR04_Initialize()/ 計算單片機計數周期晶振 =11.953M 單位 usXTALTIME=12/11.953;/ 溫度 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 va
12、lue;value=(uint)dat;/ 范圍檢查大于4000mm和小于20mm都為超出測量范圍if(value>4000) LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts2,0x40); Beep(2);else if(value<20)LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts3,0x40); Beep(2); else/ 將數值轉換成字符串 len=UnsigedIntToString(value);/ 保留 1 位小數wh
13、ile(stringBufi!='0') if(len-j=1)DistanceText6+j='.' j+; else DistanceText6+j=stringBufi; i+;j+;DistanceText6+j='c'j+;DistanceText6+j='m'i=7+j;/ 剩余位置補空格while(i<16)DistanceTexti=' 'i+;/LCD_Display_String(Prompts0,0x00);LCD_Display_String(DistanceText,0x40);/
14、顯示溫度值void DisplayTemperatureValue()TemperatureText13=CurTempInteger/10+'0'TemperatureText14=CurTempInteger%10+'0'TemperatureText15='C'LCD_Display_String(TemperatureText,0x00);/ 將無符號的整數轉成字符串,返回字符串長度uchar UnsigedIntToString(uint value)uchar i=0,t,length;/ 從個位開始轉換dostringBufi=
15、39;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;i<100;i+)BEEP=!BEEP;DelayMS(time);BEEP=0;DelayM
16、S(100);/ 延時函數毫秒 12.000MHzvoid DelayMS(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/ 延時函數20 微秒 12.000MHzvoid Delay20us()uchar i;_nop_();i = 7; while (-i);/ 定時器 0 中斷void Timer0() interrupt 1 /DS18B20 代碼:/* 程序功能:DS18B20 溫度檢測程序* 單片機型號:STC89C52 12MHz* 晶振:12Mhz*/* 包含頭文件*/#in
17、clude <reg51.h>#include <intrins.h>/ 無符號 8 位/ 無符號 16 位/* 宏定義 */#define ucharunsigned char#define uintunsigned int/ 定義DS18B20端口DS18B20_DQsbit DS18B20_DQ = P37;/ 當前采集的溫度值整數部分int xdata CurTempInteger;/ 當前采集的溫度值小數部分int xdata CurTempDecimal;/* 功能:延時函數STC89C52 12MHz 12T模式* 參數:無* 返回:無*/ void De
18、layus(uint count) while (-count);/* 功能:DS18B20復位及狀態(tài)檢測* 參數:無* 返回: 0 或 1, 1 表示未準備好,0 表示準備好*/ uchar Reset_DS18B20()uchar status;DS18B20_DQ=1;Delayus(1);/ 數據線拉低/ 延時480us-960us/ 數據線拉高/ 延時15us-60us/ 讀取數據線上的狀態(tài)/ 開始復位過程DS18B20_DQ=0;Delayus(100);DS18B20_DQ=1;Delayus(10);status=DS18B20_DQ;Delayus(120);return s
19、tatus;/* 功能:寫一字節(jié)到DS18B20中* 參數: dat= 數據* 返回:無*/ void WriteByteToDS18B20(uchar dat) uchar i;for(i=0;i<8;i+)/ 發(fā)送 1 位數據/ 延時 60us 以上/ 釋放總線,等待總線恢復/ 準備下一位數據DS18B20_DQ=0;DS18B20_DQ=dat&0x01;Delayus(15);DS18B20_DQ=1;dat>>=1;/* 功能:從DS18B20中讀一字節(jié)* 參數:無* 返回:讀取的數據*/uchar ReadByteFromDS18B20() uchar i
20、,dat=0;for(i=0;i<8;i+) DS18B20_DQ=0;/ 拉低總線,產生讀信號dat>>=1;DS18B20_DQ=1;/ 釋放總線,準備讀1 位數據Delayus(2);/ 延時 4usif(DS18B20_DQ) dat|=0x80;/ 合并每位數據Delayus(15);/ 延時 60usDS18B20_DQ=1;/ 拉高總線,準備讀下1 位數據 return dat; /* 功能:讀取溫度值并轉換成有符號的數值形式* 參數:無* 返回:無*/ void ReadTemperatureFromDS18B20() uchar flag=0;/ 正負符號標
21、志/ 存儲當前采集的溫度值uchar TempValue=0,0;if(Reset_DS18B20()CurTempInteger=255;CurTempDecimal=0;跳過ROM命令溫度轉換命令跳過ROM命令讀取溫度暫存器命令elseWriteByteToDS18B20(0xCC);/WriteByteToDS18B20(0x44);/Reset_DS18B20();/ 復位WriteByteToDS18B20(0xCC);/WriteByteToDS18B20(0xBE);/TempValue0=ReadByteFromDS18B20();/ 先讀低字節(jié)溫度值TempValue1=Re
22、adByteFromDS18B20();/ 后讀高字節(jié)溫度值Reset_DS18B20();/ 復位/ 計算溫度值/ 先進行正溫度與負溫度判斷,高5 位全為 1( 0xF8)則為負數if(TempValue1&0xF8)=0xF8)/ 負溫度計算:取反加1,低字節(jié)為0 時,高字節(jié)取反加1,否則不需要。TempValue1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+; flag=1;/ 負數標志/ 將溫度值分為整數和小數兩部分存儲( 默認為 12 位精度 )CurTempInteger=(TempV
23、alue1&0x07)<<4)|(TempValue0&0xF0)>>4); if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;/LCD1602程序代碼:/* 程序功能:1602 液晶顯示程序* 單片機型號:STC90C160 12MHz*/P0 端口 */*1602 液晶顯示器控制端口分配,數據使用sbit LCD_RS=P26;sbit LCD_RW=P25;sbit LCD_EN=P27;/* 功能:毫秒級延時函數* 參數:ms=毫秒數值
24、* 返回:無*/void LCDDelay(uint ms)uchar i, j;while(ms-)_nop_();1 = 2;j = 239;dowhile (-j);while (-i);/* 功能: 1602 液晶忙狀態(tài)檢測* 參數:無* 返回: 0 或 1, 1 表示狀態(tài)忙,0 表示狀態(tài)閑*/bit LCD_Busy_Check()bit result;LCD_RS=0; LCD_RW=1; LCD_EN=1;Delay4us();result=(bit)(P0&0x80);LCD_EN=0;return result;/* 功能:1602 液晶寫指令* 參數:cmd=160
25、2LCD指令* 返回:無*/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 液晶寫數據* 參數:dat= 一個字節(jié)數據* 返回:無*/void Write_LCD_Data(uchar dat) while(LCD_Busy_Check();LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay
26、4us();LCD_EN=1;Delay4us();LCD_EN=0;/* 功能:設置1602 液晶顯示位置* 參數: pos=位置地址值* 返回:無*/void LCD_Set_POS(uchar pos)Write_LCD_Command(pos|0x80);/* 功能: 1602 液晶初始化* 參數:無* 返回:無*/ void LCD_Initialize()LCDDelay(5);LCDDelay(5);LCDDelay(5);LCDDelay(5);Write_LCD_Command(0x01);Write_LCD_Command(0x38);Write_LCD_Command(0
27、x0C);Write_LCD_Command(0x06);/* 功能:在1602 液晶指定的行上顯示字符串( 共兩行,一行16 個字符 )* 參數: *str= 字符串指針,LineNo= 行首地址( 第一行 0x00,第二行0x40)* 返回:無*/void LCD_Display_String(uchar *str, uchar LineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k<16;k+) Write_LCD_Data(strk);/* 功能:在1602 液晶指定位置顯示一個字符( 共兩行,一行16 個字符 )* 參數: Dat=一個字符,X= 列位置 (0-15)Y=行位置(0 , 1)* 返回:無*/void LCD_Display_OneChar(uchar Dat, uchar X, uchar Y)Y &= 0x01;/ 限制Y不能大于1(2 行, 0-1)X &= 0x0F; / 限制X不能大于15(16 個字符,0-15)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024全新物流信息化項目居間服務合同下載3篇
- 教育行業(yè)人才流失原因
- 數據分析行業(yè)美工工作總結分享
- 精細化管理推動財務效能提升
- 2024年房產證辦理全程委托代理服務合同3篇
- 數據分析應用總結
- 2024年度知識產權抵押貸款合同公證及知識產權保護合同3篇
- 婚慶布置設計師的主題策劃與舞臺布置
- 2024年大型宴會廳慶典活動場地租賃合同書2篇
- 碼頭合作協(xié)議書
- 部編版五年級語文上冊第八單元主題閱讀含答案
- 連鑄工藝講義
- 企業(yè)合并案例分析資料課件
- 臘八國旗下演講稿2篇
- 大學語文莊子·秋水(課堂)課件
- 尋覓沉睡的寶船 南海一號 華光礁一號
- 中藥材及飲片性狀鑒別1總結課件
- DB32-T 2948-2016水利工程卷揚式啟閉機檢修技術規(guī)程-(高清現(xiàn)行)
- 公司EHS(安全、環(huán)保、職業(yè)健康)檢查表
- 《模擬電子技術基礎》課程設計-心電圖儀設計與制作
- 公司治理(馬連福 第2版) 課后答案及案例分析 第2章
評論
0/150
提交評論