帶溫度補(bǔ)償?shù)某暡y(cè)距程序_第1頁
帶溫度補(bǔ)償?shù)某暡y(cè)距程序_第2頁
帶溫度補(bǔ)償?shù)某暡y(cè)距程序_第3頁
帶溫度補(bǔ)償?shù)某暡y(cè)距程序_第4頁
帶溫度補(bǔ)償?shù)某暡y(cè)距程序_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、/* 程序:基于HC-SR04的超聲波測(cè)距系統(tǒng)* 單片機(jī)型號(hào):STC90C516 12MHz* 說明:開始連續(xù)進(jìn)行7次超聲波測(cè)距,每次測(cè)距間隔80ms,* 完成后對(duì)7次結(jié)果排序并將最大的2個(gè)數(shù)值和最小的2個(gè)數(shù)值去除,對(duì)剩余的* 3個(gè)數(shù)值取平均值。完成后指示燈滅,輸出結(jié)果到LCD1602上。測(cè)量超出范圍則發(fā)出報(bào)警聲。* 使用兩個(gè)IO端口控制HC-SR04觸發(fā)信號(hào)輸入和回響信號(hào)輸出,* 以及一個(gè)T0定時(shí)器用于時(shí)間計(jì)數(shù)。* 使用DS18B20測(cè)量環(huán)境溫度,聲速公式:V=334.1m/s+Temperature*0.61,* 單片機(jī)晶振為12Mhz(11.953M),計(jì)數(shù)時(shí)為T=1us* 計(jì)算公式:S

2、=(334.1m/s+Temperature*0.61)*N*T/2,N為計(jì)數(shù)值=TH0*256+TL0*/*包含頭文件*/#include #include #define Delay4us()_nop_();_nop_();_nop_();_nop_();/*宏定義*/#define ucharunsigned char/無符號(hào)8位#define uintunsigned int /無符號(hào)16位#define ulongunsigned long /無符號(hào)32位/*全局變量定義*/sbit BEEP=P15;/報(bào)警測(cè)量超出范圍sbit Trig=P34;/HC-SR04觸發(fā)信號(hào)輸入sbit

3、 Echo=P32;/HC-SR04回響信號(hào)輸出float xdata DistanceValue=0.0;/測(cè)量的距離值float xdata SPEEDSOUND;/聲速float xdata XTALTIME;/單片機(jī)計(jì)數(shù)周期uchar xdata stringBuf6;/數(shù)值轉(zhuǎn)字符串緩沖/LCD1602提示信息uchar code Prompts16=Measure Distance,/測(cè)量距離- Out of Range -,/超出測(cè)量范圍MAX range 400cm ,/測(cè)距最大值400cmMIN range 2cm ,/測(cè)距最小值2cm ,/清屏;uchar xdata Dis

4、tanceText=Range: ;/測(cè)量結(jié)果字符串uchar xdata TemperatureText=Temperature: ;/測(cè)量溫度值/*外部函數(shù)聲明*/extern void LCD_Initialize();/LCD初始化extern void LCD_Display_String(uchar *, uchar);extern void ReadTemperatureFromDS18B20();extern int xdata CurTempInteger; void DelayMS(uint ms);/毫秒延時(shí)函數(shù)void Delay20us();/20微秒延時(shí)函數(shù)void

5、 HCSR04_Initialize(); /HCSR04初始化float MeasuringDistance();/測(cè)量距離float DistanceStatistics(); /測(cè)距的數(shù)值排序求平均void DisplayDistanceValue(float dat); /輸出距離值到LCD1602上uchar UnsigedIntToString(uint value); /將無符號(hào)的整數(shù)轉(zhuǎn)成字符串,返回字符串長度,不包括0結(jié)束符void Beep(uchar time); /蜂鳴器void DisplayTemperatureValue();/顯示溫度值/*測(cè)量距離*/float

6、MeasuringDistance() /最大定時(shí)時(shí)間約65msTH0=0;TL0=0;/生成20us的脈沖寬度的觸發(fā)信號(hào)Trig=1;Delay20us();Trig=0;while(!Echo);/等待回響信號(hào)變高電平TR0=1;/啟動(dòng)定時(shí)器0 while(Echo);/等待回響信號(hào)變低電平TR0=0;/關(guān)閉定時(shí)器0 return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000;/返回距離值(mm)/*HCSR04初始化*/void HCSR04_Initialize()XTALTIME=12/12; /計(jì)算單片機(jī)計(jì)數(shù)周期 晶振=1

7、2M單位usSPEEDSOUND=334.1+25*0.61;/溫度25度時(shí)聲速的值Trig=0;Echo=0;TMOD=0x01;/*輸出距離值到LCD1602上*/void DisplayDistanceValue(float dat)uchar i=0,j=0,len;uint value;value=(uint)dat;/范圍檢查大于4000mm和小于20mm都為超出測(cè)量范圍if(value4000)LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts2,0x40);Beep(2);else if(value20)LC

8、D_Display_String(Prompts1,0x00);LCD_Display_String(Prompts3,0x40);Beep(2);elselen=UnsigedIntToString(value);/將數(shù)值轉(zhuǎn)換成字符串/保留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

9、_Display_String(DistanceText,0x40); /LCD_Display_String(Prompts0,0x00);/*顯示溫度值*/void DisplayTemperatureValue()TemperatureText13=CurTempInteger/10+0;TemperatureText14=CurTempInteger%10+0;TemperatureText15=C;LCD_Display_String(TemperatureText,0x00);/*將無符號(hào)的整數(shù)轉(zhuǎn)成字符串,返回字符串長度*/uchar UnsigedIntToString(uint

10、 value)uchar 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;DelayM

11、S(time); BEEP=0; DelayMS(100);/*延時(shí)函數(shù) 毫秒 12.000MHz*/void DelayMS(uint ms)uchar i, j;while(ms-)_nop_();i=2;j=239;dowhile (-j);while (-i);/*延時(shí)函數(shù) 20微秒 12.000MHz*/void Delay20us()uchar i;_nop_();i=7;while (-i);/*定時(shí)器0中斷*/void Timer0() interrupt 1/DS18B20代碼:/*-* 程序功能: DS18B20溫度檢測(cè)程序* 單片機(jī)型號(hào):STC89C52 12MHz* 晶

12、振: 12Mhz-*/*包含頭文件*/#include #include /*宏定義*/#define ucharunsigned char/無符號(hào)8位#define uintunsigned int /無符號(hào)16位sbit DS18B20_DQ = P33; /定義DS18B20端口DS18B20_DQint xdata CurTempInteger; /當(dāng)前采集的溫度值整數(shù)部分int xdata CurTempDecimal; /當(dāng)前采集的溫度值小數(shù)部分/*功能:延時(shí)函數(shù) STC89C52 12MHz 12T模式 參數(shù):無 返回:無*/void Delayus(uint count)whi

13、le (-count); /*功能:DS18B20復(fù)位及狀態(tài)檢測(cè) 參數(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ù) 返

14、回:無*/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;/*功能:讀取溫度值并轉(zhuǎn)換

15、成有符號(hào)的數(shù)值形式 參數(shù):無 返回:無*/void ReadTemperatureFromDS18B20()uchar flag=0;/正負(fù)符號(hào)標(biāo)志/存儲(chǔ)當(dāng)前采集的溫度值uchar TempValue=0,0; if(Reset_DS18B20() /DS18B20復(fù)位CurTempInteger=255;CurTempDecimal=0;elseWriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS18B20(0x44);/溫度轉(zhuǎn)換命令Reset_DS18B20();/復(fù)位WriteByteToDS18B20(0xCC);/跳過ROM命令WriteByt

16、eToDS18B20(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

17、+;flag=1;/負(fù)數(shù)標(biāo)志/將溫度值分為整數(shù)和小數(shù)兩部分存儲(chǔ)(默認(rèn)為12位精度)CurTempInteger=(TempValue1&0x07)4);if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;/LCD1602程序代碼:/* 程序功能:1602液晶顯示程序 單片機(jī)型號(hào):STC90C160 12MHz*/*1602液晶顯示器控制端口分配,數(shù)據(jù)使用P0端口*/sbit LCD_RS=P20;sbit LCD_RW=P21;sbit LCD_EN=P22;/* 功能:毫秒級(jí)延時(shí)函數(shù) 參數(shù):

18、ms=毫秒數(shù)值 返回:無*/void LCDDelay(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/*功能:1602液晶忙狀態(tài)檢測(cè) 參數(shù):無返回: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液晶寫指令 參數(shù):cmd=1602LCD指令 返回:無*/vo

19、id 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=0;P0=dat;Delay4us();LCD_EN=1;Delay4us();LCD

20、_EN=0;/*功能:設(shè)置1602液晶顯示位置 參數(shù):pos=位置地址值 返回:無*/void LCD_Set_POS(uchar pos)Write_LCD_Command(pos|0x80);/*功能:1602液晶初始化 參數(shù):無 返回:無*/void LCD_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液

21、晶指定的行上顯示字符串(共兩行,一行16個(gè)字符)參數(shù):*str=字符串指針,LineNo=行首地址(第一行0x00,第二行0x40)返回:無*/void LCD_Display_String(uchar *str, uchar LineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k16;k+) Write_LCD_Data(strk); /*功能:在1602液晶指定位置顯示一個(gè)字符(共兩行,一行16個(gè)字符)參數(shù):Dat=一個(gè)字符,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個(gè)字符,0-15)if(Y) X|= 0x40; /當(dāng)要在第二行顯示時(shí)地址碼+0x40;X|=0x80

溫馨提示

  • 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)論