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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

2、(11.953M),計數(shù)時為T=1us* 計 算公 式 : S=(334.1m/s+Temperature*0.61)*N*T/2, N 為 計 數(shù) 值=TH0*256+TL0*/* 包含頭文件 */#include <reg51.h>#include <intrins.h>#define Delay4us()_nop_();_nop_();_nop_();_nop_();/* 宏定義 */#define ucharunsigned char/ 無符號8位#define uintunsigned int/ 無符號16位#define ulongunsigned long

3、/ 無符號 32 位/* 全局變量定義*/sbit BEEP=P1A5;/報警丈量超出范圍sbit Echo二P3八2;/HC-SR04 回響信號輸出float xdataDistanceValue=0.0;/ 丈量的距離值float xdata SPEEDSOUND; /聲速float xdata XTALTIME;/ 單片機計數(shù)周期ucharxdatastringBuf6;/ /數(shù)值轉字符串緩沖/LCD1602 提示信息uchar code Prompts16="Measure Distance", "- Out of Range -",/ 丈量距離

4、/ 超出丈量范圍"MAX range 400cm ",/ 測距最大值 400cm"MIN range 2cm ",/ 測距最小值 2cm" ",/ 清屏;丈量結果字符串丈量溫度值ucharxdataDistanceText="Range:"/ucharxdataTemperatureText="Temperature: "/ /* 外部函數(shù)聲明 */extern void LCD_Initialize();/LCD 初始化extern void LCD_Display_String(uchar

5、*, uchar);extern void ReadTemperatureFromDS18B20(); externintxdataCurTempInteger;void DelayMS(uintms); / 毫秒延時函數(shù)void Delay20us(); /20 微秒延時函數(shù)返回字/ 返float DistanceStatistics(); / 測距的數(shù)值排序求平均void DisplayDista nceValue(float dat); /輸出距離值到 LCD1602上ucharUnsigedIntToString(uint value);/ 將無符號的整數(shù)轉成字符串,符串長度,不包含

6、'0' 結束符void Beep(uchar time); / 蜂鳴器void DisplayTemperatureValue(); / 顯示溫度值丈量距離 */ floatMeasuringDistance()/ 最大定時時間約 65msTH0=0;TL0=0;/ 生成 20us 的脈沖寬度的觸發(fā)信號Trig=1;Delay20us();Trig=0; while(!Echo);/ 等待回響信號變高電平TR0=1;/ 啟動定時器 0while(Echo);/ 等待回響信號變低電平TR0=0;/ 關閉定時器 0return (SPEEDSOUND*XTALTIME*(float

7、)TH0*256+(float)TL0)/2000;回距離值 (mm)/*HCSR04 初始化 */void HCSR04_Initialize()usXTALTIME=12/12; /計算單片機計數(shù)周期晶振 =12M單位SPEEDSOUND=334.1+25*0.61; / 溫度 25 度時聲速的值 Trig=0;Echo=0;TMOD=0x01;/*輸出距離值到 LCD1602上*/ voidDisplayDistanceValue(float dat) uchari=0,j=0,len; uint value; value=(uint)dat;/范圍檢查大于4000mm和小于20mm都為

8、超出丈量范圍 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);elselen=UnsigedIntToString(value); / 將數(shù)值轉換成字符串/ 保存 1 位小數(shù)while(stringBufi!='0')if(len-j=1)Distanc

9、eText6+j='.'j+;elseDistanceText6+j=stringBufi;i+;j+;DistanceText6+j='c'j+;DistanceText6+j='m'i=7+j;/ 剩余位置補空格while(i<16)DistanceTexti=' 'i+;LCD_Display_String(DistanceText,0x40);/LCD_Display_String(Prompts0,0x00);/* 顯示溫度值 */voidDisplayTemperatureValue()TemperatureTe

10、xt13=CurTempInteger/10+'0'TemperatureText14=CurTempInteger%10+'0'TemperatureText15='C'LCD_Display_String(TemperatureText,0x00);/* 將無符號的整數(shù)轉成字符串,返回字符串長度 *ucharUnsigedIntToString(uint value)uchari=0,t,length;/ 從個位開始轉換do stringBufi='0'+value%10;value=value/10;i+;while(val

11、ue!=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) uchari;for(i=0;i<100;i+)BEEP=!BEEP;DelayMS(time);BEEP=0;DelayMS(100);/* 延時函數(shù)毫秒 12.000MHz*/voidDelayMS(uintms

12、)uchari, j;while(ms-)_nop_();i=2;j=239;dowhile (-j);while (-i);/* 延時函數(shù) 20 微秒 12.000MHz*/void Delay20us()_nop_();i=7;while (-i);/* 定時器 0 中斷*/void Timer0() interrupt 1/DS18B20 代碼:/* 程序功能: DS18B20 溫度檢測程序* 單片機型號: STC89C52 12MHz* 晶振: 12Mhz */* 包含頭文件 */#include <reg51.h>#include <intrins.h>/*

13、宏定義 */#define ucharunsigned char/ 無符號 8 位#define uintunsigned int/ 無符號 16 位sbit DS18B20_DQ = P3八3;/ 定義 DS18B20端 口 DS18B20_DQintxdataCurTempInteger; / 當前收集的溫度值整數(shù)部分 intxdataCurTempDecimal; / 當前收集的溫度值小數(shù)部分/*功能:延時函數(shù) STC89C52 12MHz 12T模式參數(shù):無返回:無voidDelayus(uint count)while (-count);0暗/*功能:DS18B20復位及狀態(tài)檢測參數(shù)

14、:無返回:0或1,1暗示未準備好,示準備好 */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ù)返回:無*/void WriteByteToDS18

15、B20(uchardat)for(i=0;i<8;i+)DS18B20_DQ=0;DS18B20_DQ=dat&0x01;/ 發(fā)送 1 位數(shù)據(jù) Delayus(15); / 延時 60us 以上DS18B20_DQ=1; / 釋放總線,等待總線恢復 dat>>=1; / 準備下一位數(shù)據(jù)/*功能:從DS18B20中讀一字節(jié)參數(shù):無返回:讀取的數(shù)據(jù)*uchar ReadByteFromDS18B20()uchari,dat=0;for(i=0;i<8;i+)DS18B20_DQ=0; / 拉低總線,發(fā)生讀信號 dat>>=1;DS18B20_DQ=1;

16、/ 釋放總線,準備讀 1 位數(shù)據(jù) Delayus(2); / 延時 4usif(DS18B20_DQ) dat|=0x80; / 合并每位數(shù)據(jù)Delayus(15); / 延時 60usDS18B20_DQ=1; / 拉高總線,準備讀下 1 位數(shù)據(jù)returndat;*/* 功能:讀取溫度值并轉換成有符號的數(shù)值形式參數(shù):無返回:無void ReadTemperatureFromDS18B20()uchar flag=0;/ 正負符號標記/ 存儲當前收集的溫度值 ucharTempValue=0,0;if(Reset_DS18B20() /DS18B20 復位 CurTempInteger=25

17、5; CurTempDecimal=0;elseWriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS18B20(0x44);/溫度轉換命令Reset_DS18B20();/ 復位WriteByteToDS18B20(0xCC);/跳過ROM命令WriteByteToDS18B20(0xBE);/讀取溫度暫存器命令TempValue0=ReadByteFromDS18B20();/ 先讀低字節(jié)溫度值TempValue1=ReadByteFromDS18B20();/ 后讀高字節(jié)溫度值Reset_DS18B20();/ 復位/計算溫度值:先進行正溫度與負溫度

18、判斷,高5位全為1 ( 0xF8)則為負數(shù)if(TempValue1&0xF8)=0xF8)/ 負溫度計算:取反加 1,低字節(jié)為 0 時,高字節(jié)取反加 1,否則不需要 TempValue1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;flag=1;/ 負數(shù)標記/ 將溫度值分為整數(shù)和小數(shù)兩部分存儲 (默認為 12位精度 )CurTempInteger=(TempValue1&0x07)<<4)|(TempValue0&0xF0)>>4); if(flag) C

19、urTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;/ LCD1602 程序代碼:/* 程序功能: 1602液晶顯示程序單片機型號: STC90C160 12MHz*/*1602液晶顯示器控制端口分配,數(shù)據(jù)使用P0端口 */sbit LCD_RS=P2A0;sbit LCD_RW二卩2八1;sbit LCD_EN=P2A2;/* 功能:毫秒級延時函數(shù)參數(shù):ms=g秒數(shù)值返回:無*/voidLCDDelay(uintms)uchari, j; while(ms-)_nop_();i = 2;j = 239;

20、dowhile (-j);while (-i);0 暗示狀態(tài)/* 功能: 1602 液晶忙狀態(tài)檢測參數(shù):無返回: 0或 1,1 暗示狀態(tài)忙, 閑*/bitLCD_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=1602LCDf令返回:無*/ voidWrite_LCD_Command(ucharcmd)while(LCD_Busy_Check();LCD_RS=0; LCD_RW

21、=0; LCD_EN=0; _nop_(); _nop_(); P0=cmd;Delay4us();LCD_EN=1;Delay4us(); LCD_EN=0;/* 功能: 1602 液晶寫數(shù)據(jù)參數(shù): dat= 一個字節(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;/*功能:設置1602液晶顯示位置參數(shù):pos=位置地址值返回:無*/ voidLCD_Set_POS(uc

22、harpos) 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個字符 )參數(shù):*str=字符串指針,LineNo二行首地址(第一行0

23、x00,第二行0x40) 返回:無 */voidLCD_Display_String(uchar *str, ucharLineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k<16;k+)Write_LCD_Data(strk);/* 功能:在 1602液晶指定位置顯示一個字符 (共兩行,一行 16個字符 ) 參數(shù):Dat二一個字符,X二列位置(0-15)Y 行位置(0 , 1)返回:無*/ voidLCD_Display_OneChar(ucharDat, uchar X, uchar Y)Y&=0x01; /限制Y不克不及大于1(2行,0-1)X&=0x0F;/限制X不克不及大于15(16個字符,0-15)if(Y) X|= 0x40; / 當要在第二行顯示時地址碼 +0x40;X|=0x80; / 算出指令碼Write_LCD_Command(X

溫馨提示

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

評論

0/150

提交評論