帶溫度補償的超聲波測距程序數據參考_第1頁
帶溫度補償的超聲波測距程序數據參考_第2頁
帶溫度補償的超聲波測距程序數據參考_第3頁
帶溫度補償的超聲波測距程序數據參考_第4頁
帶溫度補償的超聲波測距程序數據參考_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、/* 程序:基于hc-sr04的超聲波測距系統* 單片機型號:stc90c516 12mhz* 說明:開始連續進行7次超聲波測距,每次測距間隔80ms,* 完成后對7次結果排序并將最大的2個數值和最小的2個數值去除,對剩余的* 3個數值取平均值。完成后指示燈滅,輸出結果到lcd1602上。測量超出范圍則發出報警聲。* 使用兩個io端口控制hc-sr04觸發信號輸入和回響信號輸出,* 以及一個t0定時器用于時間計數。* 使用ds18b20測量環境溫度,聲速公式:v=334.1m/s+temperature*0.61,* 單片機晶振為12mhz(11.953m),計數時為t=1us* 計算公式:s

2、=(334.1m/s+temperature*0.61)*n*t/2,n為計數值=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 /無符號32位/*全局變量定義*/sbit beep=p15;/報警測量超出范圍

3、sbit trig=p34;/hc-sr04觸發信號輸入sbit echo=p32;/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 4

4、00cm ",/測距最大值400cm"min range 2cm ",/測距最小值2cm" ",/清屏;uchar xdata distancetext="range: "/測量結果字符串uchar xdata temperaturetext="temperature: "/測量溫度值/*外部函數聲明*/extern void lcd_initialize();/lcd初始化extern void lcd_display_string(uchar *, uchar);extern void readtem

5、peraturefromds18b20();extern int xdata curtempinteger; void delayms(uint ms);/毫秒延時函數void delay20us();/20微秒延時函數void hcsr04_initialize(); /hcsr04初始化float measuringdistance();/測量距離float distancestatistics(); /測距的數值排序求平均void displaydistancevalue(float dat); /輸出距離值到lcd1602上uchar unsigedinttostring(uint v

6、alue); /將無符號的整數轉成字符串,返回字符串長度,不包括'0'結束符void beep(uchar time); /蜂鳴器void displaytemperaturevalue();/顯示溫度值/*測量距離*/float measuringdistance() /最大定時時間約65msth0=0;tl0=0;/生成20us的脈沖寬度的觸發信號trig=1;delay20us();trig=0;while(!echo);/等待回響信號變高電平tr0=1;/啟動定時器0 while(echo);/等待回響信號變低電平tr0=0;/關閉定時器0 return (speeds

7、ound*xtaltime*(float)th0*256+(float)tl0)/2000;/返回距離值(mm)/*hcsr04初始化*/void hcsr04_initialize()xtaltime=12/12; /計算單片機計數周期 晶振=12m單位usspeedsound=334.1+25*0.61;/溫度25度時聲速的值trig=0;echo=0;tmod=0x01;/*輸出距離值到lcd1602上*/void displaydistancevalue(float dat)uchar i=0,j=0,len;uint value;value=(uint)dat;/范圍檢查大于4000

8、mm和小于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);elselen=unsigedinttostring(value);/將數值轉換成字符串/保留1位小數while(stringbufi!='0')if(len-j=1) d

9、istancetext6+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);/*顯示溫度值*/void displaytemperaturevalue()temperat

10、uretext13=curtempinteger/10+'0'temperaturetext14=curtempinteger%10+'0'temperaturetext15='c'lcd_display_string(temperaturetext,0x00);/*將無符號的整數轉成字符串,返回字符串長度*/uchar unsigedinttostring(uint value)uchar i=0,t,length;/從個位開始轉換dostringbufi='0'+value%10;value=value/10;i+;while

11、(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; delayms(100);/*延時函數 毫秒 12.000mhz*/void delayms(

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

13、h>/*宏定義*/#define ucharunsigned char/無符號8位#define uintunsigned int /無符號16位sbit ds18b20_dq = p33; /定義ds18b20端口ds18b20_dqint xdata curtempinteger; /當前采集的溫度值整數部分int xdata curtempdecimal; /當前采集的溫度值小數部分/*功能:延時函數 stc89c52 12mhz 12t模式 參數:無 返回:無*/void delayus(uint count)while (-count); /*功能:ds18b20復位及狀態檢測

14、 參數:無 返回:0或1,1表示未準備好,0表示準備好*/uchar reset_ds18b20()uchar status;ds18b20_dq=1;delayus(1);/開始復位過程ds18b20_dq=0;/數據線拉低delayus(100);/延時480us-960usds18b20_dq=1;/數據線拉高delayus(10);/延時15us-60usstatus=ds18b20_dq;/讀取數據線上的狀態delayus(120);return status;/*功能:寫一字節到ds18b20中 參數:dat=數據 返回:無*/void writebytetods18b20(uch

15、ar dat)uchar i;for(i=0;i<8;i+)ds18b20_dq=0;ds18b20_dq=dat&0x01;/發送1位數據delayus(15);/延時60us以上ds18b20_dq=1;/釋放總線,等待總線恢復dat>>=1;/準備下一位數據/*功能:從ds18b20中讀一字節 參數:無 返回:讀取的數據*/uchar readbytefromds18b20()uchar i,dat=0;for(i=0;i<8;i+)ds18b20_dq=0; /拉低總線,產生讀信號dat>>=1;ds18b20_dq=1;/釋放總線,準備讀1

16、位數據 delayus(2);/延時4usif(ds18b20_dq) dat|=0x80;/合并每位數據delayus(15);/延時60usds18b20_dq=1;/拉高總線,準備讀下1位數據return dat;/*功能:讀取溫度值并轉換成有符號的數值形式 參數:無 返回:無*/void readtemperaturefromds18b20()uchar flag=0;/正負符號標志/存儲當前采集的溫度值uchar tempvalue=0,0; if(reset_ds18b20() /ds18b20復位curtempinteger=255;curtempdecimal=0;elsewr

17、itebytetods18b20(0xcc);/跳過rom命令writebytetods18b20(0x44);/溫度轉換命令reset_ds18b20();/復位writebytetods18b20(0xcc);/跳過rom命令writebytetods18b20(0xbe);/讀取溫度暫存器命令tempvalue0=readbytefromds18b20();/先讀低字節溫度值tempvalue1=readbytefromds18b20();/后讀高字節溫度值reset_ds18b20();/復位/計算溫度值:先進行正溫度與負溫度判斷,高5位全為1(0xf8)則為負數if(tempvalu

18、e1&0xf8)=0xf8)/負溫度計算:取反加1,低字節為0時,高字節取反加1,否則不需要。tempvalue1=tempvalue1;tempvalue0=tempvalue0+1;if(tempvalue0=0x00) tempvalue1+;flag=1;/負數標志/將溫度值分為整數和小數兩部分存儲(默認為12位精度)curtempinteger=(tempvalue1&0x07)<<4)|(tempvalue0&0xf0)>>4);if(flag) curtempinteger=-curtempinteger;curtempdecima

19、l=(tempvalue0&0x0f)*625;/lcd1602程序代碼:/* 程序功能:1602液晶顯示程序 單片機型號:stc90c160 12mhz*/*1602液晶顯示器控制端口分配,數據使用p0端口*/sbit lcd_rs=p20;sbit lcd_rw=p21;sbit lcd_en=p22;/* 功能:毫秒級延時函數 參數:ms=毫秒數值 返回:無*/void lcddelay(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/*功能:1602液晶忙狀態檢測 參數:無返

20、回:0或1,1表示狀態忙,0表示狀態閑*/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=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

21、=1;delay4us();lcd_en=0;/*功能:1602液晶寫數據 參數:dat=一個字節數據 返回:無*/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_en=0;/*功能:設置1602液晶顯示位置 參數:pos=位置地址值 返回:無*/void lcd_set_pos(uchar pos)write_lcd_command(pos|0x80);/*功能:1602液晶初始化 參數:無 返回:

22、無*/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液晶指定的行上顯示字符串(共兩行,一行16個字符)參數:*str=字符串指針,lineno=行首地址(第一行0x00,第二行0x40)返回:無*/void lcd_display_string(uchar *str, uchar lineno)

23、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)if(y) x|= 0x40; /當要在第二行顯示時地址碼+0x40;x|=0x80; /算出指令碼write_lcd_command(x);writ

溫馨提示

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

評論

0/150

提交評論