基于51單片機(jī)的HC-SR04超聲波測(cè)距系統(tǒng)制作_第1頁
基于51單片機(jī)的HC-SR04超聲波測(cè)距系統(tǒng)制作_第2頁
基于51單片機(jī)的HC-SR04超聲波測(cè)距系統(tǒng)制作_第3頁
基于51單片機(jī)的HC-SR04超聲波測(cè)距系統(tǒng)制作_第4頁
基于51單片機(jī)的HC-SR04超聲波測(cè)距系統(tǒng)制作_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

基于51單片機(jī)帶溫度補(bǔ)償?shù)腍C-SR04超聲波測(cè)距系統(tǒng)利用從網(wǎng)上購買的HC-SR04超聲波模塊制作了一個(gè)測(cè)距裝置,HC-SR04自身不帶溫度補(bǔ)償功能,所以加上一個(gè)使用DS18B20做的溫度測(cè)量模塊。整個(gè)系統(tǒng)包括:51單片機(jī)最小系統(tǒng),超聲波測(cè)距模塊、溫度測(cè)量模塊、液晶顯示模塊。使用了如下主要元器件:元件說明數(shù)量STC90C516RC51單片機(jī)1HC-SR04超聲波測(cè)距模塊1DS18B20溫度測(cè)量模塊1lcd1602液晶顯示模塊1系統(tǒng)電路圖51單片機(jī)最小系統(tǒng)單片機(jī)型號(hào):STC90C516,晶振:12Mhz。自己動(dòng)手焊接的最小系統(tǒng)板。LCD1602A液晶顯示模塊:#defineDelay4us(){_nop_();_nop_();_nop_();_nop_();}/*宏定義*/#defineuchar unsignedchar //無符號(hào)8位#defineuint unsignedint //無符號(hào)16位#defineulong unsignedlong //無符號(hào)32位/*全局變量定義*/sbitK1=P1^0; //按下K1后,開始測(cè)距sbitLEDRed=P1^1; //測(cè)距指示燈,亮表示正在測(cè)距,滅表示測(cè)距完成sbitBEEP=P1^5; //報(bào)警測(cè)量超出范圍sbitTrig=P1^7; //HC-SR04觸發(fā)信號(hào)輸入sbitEcho=P1^6; //HC-SR04回響信號(hào)輸出floatxdataDistanceValue=0.0; //測(cè)量的距離值floatxdataSPEEDSOUND; //聲速floatxdataXTALTIME; //單片機(jī)計(jì)數(shù)周期ucharxdatastringBuf[6]; //數(shù)值轉(zhuǎn)字符串緩沖 //LCD1602提示信息ucharcodePrompts[][16]={ {"MeasureDistance"}, //測(cè)量距離 {"-OutofRange-"}, //超出測(cè)量范圍 {"MAXrange400cm"}, //測(cè)距最大值400cm {"MINrange2cm"}, //測(cè)距最小值2cm {""}, //清屏 {"PressK1Start"} //按鍵開始測(cè)量};ucharxdataDistanceText[]="Range:";//測(cè)量結(jié)果字符串ucharxdataTemperatureText[]="Temperature:";//測(cè)量溫度值/*外部函數(shù)聲明*/externvoidLCD_Initialize();externvoidLCD_Display_String(uchar*,uchar);externvoidReadTemperatureFromDS18B20();externintxdataCurTempInteger;//毫秒延時(shí)函數(shù)voidDelayMS(uintms);//20微秒延時(shí)函數(shù)voidDelay20us();//HCSR04初始化voidHCSR04_Initialize();//測(cè)量距離floatMeasuringDistance();//測(cè)距的數(shù)值排序求平均floatDistanceStatistics();//輸出距離值到LCD1602上voidDisplayDistanceValue(floatdat);//將無符號(hào)的整數(shù)轉(zhuǎn)成字符串,返回字符串長度,不包括'\0'結(jié)束符ucharUnsigedIntToString(uintvalue);//蜂鳴器voidBeep(uchartime);//顯示溫度值voidDisplayTemperatureValue();//測(cè)量距離floatMeasuringDistance(){ //最大定時(shí)時(shí)間約65ms TH0=0; TL0=0; //生成20us的脈沖寬度的觸發(fā)信號(hào) Trig=1; Delay20us(); Trig=0; //等待回響信號(hào)變高電平 while(!Echo); TR0=1; //啟動(dòng)定時(shí)器0 //等待回響信號(hào)變低電平 while(Echo); TR0=0; //關(guān)閉定時(shí)器0 //返回距離值(mm) return(SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000;}//HCSR04初始化voidHCSR04_Initialize(){ //計(jì)算單片機(jī)計(jì)數(shù)周期晶振=11.953M 單位us XTALTIME=12/11.953; //溫度25度時(shí)聲速的值 SPEEDSOUND=334.1+25*0.61; Trig=0; Echo=0; TMOD=0x01;}//輸出距離值到LCD1602上voidDisplayDistanceValue(floatdat){ uchari=0,j=0,len; uintvalue; value=(uint)dat; //范圍檢查大于4000mm和小于20mm都為超出測(cè)量范圍 if(value>4000) { LCD_Display_String(Prompts[1],0x00); LCD_Display_String(Prompts[2],0x40); Beep(2); } elseif(value<20) { LCD_Display_String(Prompts[1],0x00); LCD_Display_String(Prompts[3],0x40); Beep(2); } else { //將數(shù)值轉(zhuǎn)換成字符串 len=UnsigedIntToString(value); //保留1位小數(shù) while(stringBuf[i]!='\0') { if(len-j==1) { DistanceText[6+j]='.'; j++; }else { DistanceText[6+j]=stringBuf[i]; i++; j++; } } DistanceText[6+j]='c'; j++; DistanceText[6+j]='m'; i=7+j; //剩余位置補(bǔ)空格 while(i<16) { DistanceText[i]=''; i++; } //LCD_Display_String(Prompts[0],0x00); LCD_Display_String(DistanceText,0x40); }}//顯示溫度值voidDisplayTemperatureValue(){ TemperatureText[13]=CurTempInteger/10+'0'; TemperatureText[14]=CurTempInteger%10+'0'; TemperatureText[15]='C'; LCD_Display_String(TemperatureText,0x00); }//將無符號(hào)的整數(shù)轉(zhuǎn)成字符串,返回字符串長度ucharUnsigedIntToString(uintvalue){ uchari=0,t,length; //從個(gè)位開始轉(zhuǎn)換 do { stringBuf[i]='0'+value%10; value=value/10; i++; }while(value!=0); length=i; //將字符串顛倒順序 for(i=0;i<(length/2);i++) { t=stringBuf[i]; stringBuf[i]=stringBuf[length-i-1]; stringBuf[length-i-1]=t; } stringBuf[length]='\0'; returnlength;}//蜂鳴器voidBeep(uchartime){ uchari; for(i=0;i<100;i++) { BEEP=!BEEP; DelayMS(time); } BEEP=0; DelayMS(100);}//延時(shí)函數(shù)毫秒@12.000MHzvoidDelayMS(uintms){ uchari,j; while(ms--) { _nop_(); i=2; j=239; do { while(--j); }while(--i); }}//延時(shí)函數(shù)20微秒@12.000MHzvoidDelay20us(){ uchari; _nop_(); i=7; while(--i);}//定時(shí)器0中斷voidTimer0()interrupt1{} //DS18B20代碼:/*----------------------------------------------*程序功能:DS18B20溫度檢測(cè)程序*單片機(jī)型號(hào):STC89C5212MHz*晶振:12Mhz------------------------------------------------*//*包含頭文件*/#include<reg51.h>#include<intrins.h>/*宏定義*/#defineuchar unsignedchar //無符號(hào)8位#defineuint unsignedint //無符號(hào)16位//定義DS18B20端口DS18B20_DQsbitDS18B20_DQ=P3^7;//當(dāng)前采集的溫度值整數(shù)部分intxdataCurTempInteger;//當(dāng)前采集的溫度值小數(shù)部分intxdataCurTempDecimal;/*----------------------------------------------------------------*功能:延時(shí)函數(shù)STC89C52@12MHz12T模式*參數(shù):無*返回:無----------------------------------------------------------------*/voidDelayus(uintcount) { while(--count);}/*----------------------------------------------------------------*功能:DS18B20復(fù)位及狀態(tài)檢測(cè)*參數(shù):無*返回:0或1,1表示未準(zhǔn)備好,0表示準(zhǔn)備好----------------------------------------------------------------*/ucharReset_DS18B20(){ ucharstatus; DS18B20_DQ=1; Delayus(1); //開始復(fù)位過程 DS18B20_DQ=0; //數(shù)據(jù)線拉低 Delayus(100); //延時(shí)480us-960us DS18B20_DQ=1; //數(shù)據(jù)線拉高 Delayus(10); //延時(shí)15us-60us status=DS18B20_DQ; //讀取數(shù)據(jù)線上的狀態(tài) Delayus(120); returnstatus;}/*----------------------------------------------------------------*功能:寫一字節(jié)到DS18B20中*參數(shù):dat=數(shù)據(jù)*返回:無----------------------------------------------------------------*/voidWriteByteToDS18B20(uchardat){ uchari; for(i=0;i<8;i++) { DS18B20_DQ=0; DS18B20_DQ=dat&0x01; //發(fā)送1位數(shù)據(jù) Delayus(15); //延時(shí)60us以上 DS18B20_DQ=1; //釋放總線,等待總線恢復(fù) dat>>=1; //準(zhǔn)備下一位數(shù)據(jù) }}/*----------------------------------------------------------------*功能:從DS18B20中讀一字節(jié)*參數(shù):無*返回:讀取的數(shù)據(jù)----------------------------------------------------------------*/ucharReadByteFromDS18B20(){ uchari,dat=0; for(i=0;i<8;i++) { DS18B20_DQ=0; //拉低總線,產(chǎn)生讀信號(hào) dat>>=1; DS18B20_DQ=1; //釋放總線,準(zhǔn)備讀1位數(shù)據(jù) Delayus(2); //延時(shí)4us if(DS18B20_DQ)dat|=0x80; //合并每位數(shù)據(jù) Delayus(15); //延時(shí)60us DS18B20_DQ=1; //拉高總線,準(zhǔn)備讀下1位數(shù)據(jù) } returndat;}/*----------------------------------------------------------------*功能:讀取溫度值并轉(zhuǎn)換成有符號(hào)的數(shù)值形式*參數(shù):無*返回:無----------------------------------------------------------------*/voidReadTemperatureFromDS18B20(){ ucharflag=0;//正負(fù)符號(hào)標(biāo)志 //存儲(chǔ)當(dāng)前采集的溫度值 ucharTempValue[]={0,0}; if(Reset_DS18B20()) { CurTempInteger=255; CurTempDecimal=0; } else { WriteByteToDS18B20(0xCC);//跳過ROM命令 WriteByteToDS18B20(0x44);//溫度轉(zhuǎn)換命令 Reset_DS18B20();//復(fù)位 WriteByteToDS18B20(0xCC);//跳過ROM命令 WriteByteToDS18B20(0xBE);//讀取溫度暫存器命令 TempValue[0]=ReadByteFromDS18B20();//先讀低字節(jié)溫度值 TempValue[1]=ReadByteFromDS18B20();//后讀高字節(jié)溫度值 Reset_DS18B20();//復(fù)位 //計(jì)算溫度值 //先進(jìn)行正溫度與負(fù)溫度判斷,高5位全為1(0xF8)則為負(fù)數(shù) if((TempValue[1]&0xF8)==0xF8) { //負(fù)溫度計(jì)算:取反加1,低字節(jié)為0時(shí),高字節(jié)取反加1,否則不需要。 TempValue[1]=~TempValue[1]; TempValue[0]=~TempValue[0]+1; if(TempValue[0]==0x00)TempValue[1]++; flag=1;//負(fù)數(shù)標(biāo)志 } //將溫度值分為整數(shù)和小數(shù)兩部分存儲(chǔ)(默認(rèn)為12位精度) CurTempInteger=((TempValue[1]&0x07)<<4)|((TempValue[0]&0xF0)>>4); if(flag)CurTempInteger=-CurTempInteger; CurTempDecimal=(TempValue[0]&0x0F)*625; }}// LCD1602程序代碼:/*----------------------------------------------*程序功能:1602液晶顯示程序*單片機(jī)型號(hào):STC90C16012MHz------------------------------------------------*//*1602液晶顯示器控制端口分配,數(shù)據(jù)使用P0端口*/sbitLCD_RS=P2^6;sbitLCD_RW=P2^5;sbitLCD_EN=P2^7;/*--------------------------------------------*功能:毫秒級(jí)延時(shí)函數(shù)*參數(shù):ms=毫秒數(shù)值*返回:無--------------------------------------------*/voidLCDDelay(uintms){ uchari,j; while(ms--) { _nop_(); i=2; j=239; do { while(--j); }while(--i); } }/*--------------------------------------------*功能:1602液晶忙狀態(tài)檢測(cè)*參數(shù):無*返回:0或1,1表示狀態(tài)忙,0表示狀態(tài)閑--------------------------------------------*/bitLCD_Busy_Check(){ bitresult; LCD_RS=0; LCD_RW=1; LCD_EN=1; Delay4us(); result=(bit)(P0&0x80); LCD_EN=0; returnresult;}/*--------------------------------------------*功能:1602液晶寫指令*參數(shù):cmd=1602LCD指令*返回:無--------------------------------------------*/voidWrite_LCD_Command(ucharcmd){ 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ù)*返回:無--------------------------------------------*/voidWrite_LCD_Data(uchardat){ while(LCD_Busy_Check()); LCD_RS=1;LCD_RW=0;LCD_EN=0; P0=dat;Delay4us(); LCD_EN=1;Delay4us();LCD_EN=0;}/*--------------------------------------------*功能:設(shè)置1602液晶顯示位置*參數(shù):pos=位置地址值*返回:無--------------------------------------------*/voidLCD_Set_POS(ucharpos){ Write_LCD_Command(pos|0x80);}/*--------------------------------------------*功能:1602液晶初始化*參數(shù):無*返回:無--------------------------------------------*/voidLCD_Initialize(){ Write_LCD_Command(0x01); LCDDelay(5); Write_LCD_Command(0x38); LCDDelay(5); Write_LCD_Command(0x0C); LCDDelay(5); Write_LCD_Command(0x06); LCDDelay(5);}/*--------------------------------------------*功能:在1602液晶指定的行上顯示字符串(共兩行,一行16個(gè)字符)*參數(shù):*str=字符串指針,LineNo=行首地址(第一行0x00,第二行0x40)*返回:無--------------------------------------------*/voidLCD_Display_String(uchar*str,ucharLineNo){ uchark; LCD_Set_POS(LineNo); for(k=0;k<16;k++) { Write_LCD_Data(str[k]); } }/*--------------------------------------------*功能:在1602液晶指定位置顯示一個(gè)字符(共兩行,一行16個(gè)字符)*參數(shù):Dat=一個(gè)字符,X=列位置(0-15) Y=行位置(0,1)*返回:無--------------------------------------------*/voidLCD_Display_OneChar(ucharDat,ucharX,ucharY){ Y&=0x01; //限制Y不能大于1(2行,0-1) X&=0x0F; //限制X不能大于15(16個(gè)字符,0-15) if(Y){X|=0x40;}//當(dāng)要在第二行顯示時(shí)地址碼+0x40; X|=0x80;//算出指令碼 Write

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論