带温度补偿的超声波测距程序_第1页
带温度补偿的超声波测距程序_第2页
带温度补偿的超声波测距程序_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、./*程序:基于HC-SR04 的超声波测距系统* 单片机型号: STC90C51612MHz* 说明:开始连续进行7 次超声波测距,每次测距间隔80ms,*完成后对7 次结果排序并将最大的2 个数值和最小的2 个数值去除,对剩余的*3 个数值取平均值。完成后指示灯灭,输出结果到LCD1602 上。测量超出范围则发出报警声。* 使用两个 IO 端口控制 HC-SR04 触发信号输入和回响信号输出,* 以及一个 T0 定时器用于时间计数。*使用 DS18B20 测量环境温度,声速公式:V=334.1m/s+Temperature*0.61 ,*单片机晶振为12Mhz(11.953M) ,计数时为

2、T=1us* 计算公式: S=(334.1m/s+Temperature*0.61)*N*T/2 , N 为计数值 =TH0*256+TL0*/* 包含头文件 */#include #include #define Delay4us()_nop_();_nop_();_nop_();_nop_();/* 宏定义 */#define uchar unsigned char/无符号 8 位#define uintunsigned int/ 无符号 16 位#define ulong unsigned long/无符号 32 位/* 全局变量定义 */ sbit BEEP=P15; sbit Tri

3、g=P34; sbit Echo=P32;/ 报警测量超出范围/HC-SR04 触发信号输入/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 ,/ 测距最大值400cmMIN

4、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 ReadTemperatureFromDS18B20();extern int xdata CurTempInteger;void DelayMS(uin

5、t ms); /毫秒延时函数void Delay20us();/20 微秒延时函数void HCSR04_Initialize(); /HCSR04初始化float MeasuringDistance();/测量距离float DistanceStatistics();/测距的数值排序求平均void DisplayDistanceValue(float dat); /输出距离值到LCD1602 上uchar UnsigedIntToString(uint value);/ 将无符号的整数转成字符串,返回字符串长度,不包括0结束符void Beep(uchar time);/ 蜂鸣器void D

6、isplayTemperatureValue();/ 显示温度值/* 测量距离 */float MeasuringDistance()/最大定时时间约65msTH0=0;TL0=0;/生成 20us 的脉冲宽度的触发信号Trig=1;Delay20us();Trig=0;while(!Echo);/ 等待回响信号变高电平TR0=1;/启动定时器0while(Echo);/ 等待回响信号变低电平TR0=0;/关闭定时器0return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000;/ 返回距离值 (mm)/*HCSR04初始化 */voi

7、d 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;./范围检查大于4000mm 和小于 20mm 都为超出测量范围if(value4000)LCD_Display_String(Prompts1,0x00

8、);LCD_Display_String(Prompts2,0x40);Beep(2);else if(value20)LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts3,0x40);Beep(2);elselen=UnsigedIntToString(value);/ 将数值转换成字符串/保留 1 位小数while(stringBufi!=0)if(len-j=1)DistanceText6+j=.;j+;elseDistanceText6+j=stringBufi;i+;j+;DistanceText6+j=c;j+;

9、DistanceText6+j=m;i=7+j;/剩余位置补空格while(i16)DistanceTexti= ;i+;LCD_Display_String(DistanceText,0x40); /LCD_Display_String(Prompts0,0x00);/* 显示温度值 */void DisplayTemperatureValue().TemperatureText13=CurTempInteger/10+0;TemperatureText14=CurTempInteger%10+0;TemperatureText15=C;LCD_Display_String(Temperat

10、ureText,0x00);/* 将无符号的整数转成字符串,返回字符串长度*/uchar UnsigedIntToString(uint value)uchar i=0,t,length;/从个位开始转换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;/

11、* 蜂鸣器 */void Beep(uchar time)uchar i;for(i=0;i100;i+)BEEP=!BEEP;DelayMS(time);BEEP=0;DelayMS(100);/* 延时函数毫秒 12.000MHz*/void DelayMS(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(

12、) interrupt 1/DS18B20 代码:/*-* 程序功能: DS18B20 温度检测程序* 单片机型号: STC89C52 12MHz* 晶振:12Mhz-*/* 包含头文件 */#include #include /* 宏定义 */#define uchar unsigned char/ 无符号 8 位#define uintunsigned int/无符号 16 位sbit DS18B20_DQ = P33;/定义 DS18B20 端口 DS18B20_DQint xdata CurTempInteger;/当前采集的温度值整数部分int xdata CurTempDecima

13、l; / 当前采集的温度值小数部分./* 功能:延时函数STC89C52 12MHz 12T模式 参数:无返回:无 */void Delayus(uint count)while (-count);/* 功能: DS18B20 复位及状态检测参数:无返回: 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);/

14、延时 15us-60usstatus=DS18B20_DQ;/读取数据线上的状态Delayus(120);return status;/* 功能:写一字节到 DS18B20 中 参数: dat=数据 返回:无 */ void WriteByteToDS18B20(uchar dat) uchar i;for(i=0;i=1;/ 准备下一位数据/* 功能:从DS18B20 中读一字节参数:无返回:读取的数据*/uchar ReadByteFromDS18B20()uchar i,dat=0;for(i=0;i=1;DS18B20_DQ=1;/释放总线,准备读1 位数据.Delayus(2);/延

15、时 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;elseWriteByteToDS1

16、8B20(0xCC);/ 跳过 ROM 命令WriteByteToDS18B20(0x44);/ 温度转换命令Reset_DS18B20();/ 复位WriteByteToDS18B20(0xCC);/ 跳过 ROM 命令WriteByteToDS18B20(0xBE);/读取温度暂存器命令TempValue0=ReadByteFromDS18B20();/ 先读低字节温度值TempValue1=ReadByteFromDS18B20();/ 后读高字节温度值Reset_DS18B20();/ 复位/计算温度值:先进行正温度与负温度判断,高5 位全为 1( 0xF8)则为负数if(TempVa

17、lue1&0xF8)=0xF8)/ 负温度计算:取反加 1,低字节为 0 时,高字节取反加 1,否则不需要。TempValue1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;flag=1;/ 负数标志/将温度值分为整数和小数两部分存储 (默认为 12 位精度 ) CurTempInteger=(TempValue1&0x07)4); if(flag) CurTempInteger=-CurTempInteger; CurTempDecimal=(TempValue0&0x0F)*625;/ LCD1602

18、 程序代码:./* 程序功能: 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 液晶忙状态检测参数:无返回:0 或 1, 1 表示状态忙, 0 表示状态闲 */b

19、it 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=1;Delay4us();LCD

20、_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 液晶初始化参数:无返回:无 */void L

21、CD_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

22、 LineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k16;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; /当要在第二行显示时地址

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论