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

下载本文档

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

文档简介

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

2、erature*N*T/2 , N 为计数值=TH0*256+TL0*/ /* 包含头文件 */#include #include #define Delay4us()_nop_();_nop_();_nop_();_nop_();/* 宏定义 */#define uchar unsigned char;j+;elseDistanceText6+j=stringBufi;i+;j+;DistanceText6+j=c;j+;DistanceText6+j=m;i=7+j;/ 剩余位置补空格while(i16)DistanceTexti= ;i+;LCD_Display_String(Dista

3、nceText,0x40); /LCD_Display_String(Prompts0,0x00);/* 显示温度值 */void DisplayTemperatureValue()TemperatureText13=CurTempInteger/10+0;TemperatureText14=CurTempInteger%10+0;TemperatureText15=C;LCD_Display_String(TemperatureText,0x00);/* 将无符号的整数转成字符串,返回字符串长度 */uchar UnsigedIntToString(uint value)uchar i=0,

4、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;/*蜂鸣器 */void Beep(uchar time)uchar i;for(i=0;i100;i+)BEEP=!BEEP;DelayMS(time);BEEP=0

5、;DelayMS(100);/* 延时函数 毫秒 */ void DelayMS(uint ms) uchar i, j;while(ms-)_nop_();i=2; j=239;dowhile (-j);while (-i);/* 延时函数 20 微秒 */void Delay20us() uchar i;_nop_();i=7;while (-i);/* 定时器 0 中断 */void Timer0() interrupt 1/DS18B20 代码:/* 程序功能: DS18B20 温度检测程序* 单片机型号: STC89C52 12MHz* 晶振:12Mhz*/* 包含头文件 */#in

6、clude #include /* 宏定义 */#define uchar unsigned char / 无符号 8 位#define uint unsigned int / 无符号 16 位sbit DS18B20_DQ = P3A3; / 定义 DS18B20端口 DS18B20_DQint xdata CurTempInteger; /当前采集的温度值整数部分int xdata CurTempDecimal; /当前采集的温度值小数部分/*功能:延时函数 STC89C52 12MHz 12T模式 参数:无 返回:无*/void Delayus(uint count)while (-co

7、unt);/*功能:DS18B20复位及状态检测 参数:无 返回:0或1 , 1表示未准备好,0表示准备好*/ uchar Reset_DS18B20()uchar status;DS18B20_DQ=1;Delayus(1);/ 开始复位过程/ 数据线拉低/ 延时 480us-960us/ 数据线拉高/ 延时 15us-60us/ 读取数据线上的状态DS18B20_DQ=0;Delayus(100);DS18B20_DQ=1;Delayus(10);status=DS18B20_DQ;Delayus(120);return status;/*功能:写一字节到 DS18B20中 参数:dat=

8、数据 返回:无*/void WriteByteToDS18B20(uchar dat) uchar i;for(i=0;i=1;/*功能:从 DS18B20中读一字节uchar ReadByteFromDS18B20()/ 发送 1 位数据/ 延时 60us 以上/ 释放总线,等待总线恢复/ 准备下一位数据参数:无 返回:读取的数据 */uchar i,dat=0;for(i=0;i=1;DS18B20_DQ=1;/ 释放总线,准备读 1 位数据Delayus(2);/ 延时 4usif(DS18B20_DQ) dat|=0x80;/ 合并每位数据Delayus(15);/ 延时 60usDS

9、18B20_DQ=1;/ 拉高总线,准备读下 1 位数据return dat;/* 功能:读取温度值并转换成有符号的数值形式 参数:无 返回:无 */ void ReadTemperatureFromDS18B20()uchar flag=0;/ 正负符号标志/ 存储当前采集的温度值uchar TempValue=0,0;if(Reset_DS18B20() /DS18B20 复位CurTempInteger=255;CurTempDecimal=0; elseWriteByteToDS18B20(0xCC);/跳过ROM命令WriteByteToDS18B20(0x44);/温度转换命令Re

10、set_DS18B20();/ 复位WriteByteToDS18B20(0xCC);/跳过ROM命令WriteByteToDS18B20(0xBE);/读取温度暂存器命令TempValue0=ReadByteFromDS18B20();/ 先读低字节温度值TempValue1=ReadByteFromDS18B20();/ 后读高字节温度值Reset_DS18B20();/ 复位/计算温度值:先进行正温度与负温度判断,高5位全为1 (0xF8)则为负数if(TempValue1&0xF8)=0xF8)/ 负温度计算:取反加 1,低字节为 0时,高字节取反加 1 ,否则不需要。TempValu

11、e1=TempValue1;TempValue0=TempValue0+1;if(TempValue0=0x00) TempValue1+;flag=1;/ 负数标志/ 将温度值分为整数和小数两部分存储 (默认为 12 位精度 )CurTempInteger=(TempValue1&0x07)4);if(flag) CurTempInteger=-CurTempInteger;CurTempDecimal=(TempValue0&0x0F)*625;/LCD1602程序代码:/* 程序功能: 1602 液晶显示程序 单片机型号: STC90C160 12MHz*/*1602液晶显示器控制端口分

12、配,数据使用P0端口 */sbit LCD_RS=P2A0;sbit LCD_RW=P2A1;sbit LCD_EN=P2A2;/* 功能:毫秒级延时函数参数:ms=S秒数值返回:无*/void LCDDelay(uint ms)uchar i, j;while(ms-)_nop_();i = 2;j = 239;dowhile (-j);while (-i);/* 功能: 1602 液晶忙状态检测 参数:无返回: 0 或 1,1 表示状态忙, 0表示状态闲 */ bit LCD_Busy_Check()bit result;LCD_RS=0; LCD_RW=1; LCD_EN=1;Delay

13、4us();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_EN=0;/*功能:1602液晶写数据 参数:dat= 一个字节数据 返回:无*/void Write_LCD_Data(uch

14、ar 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 LCD_Initialize()Write_LCD_Command(0x01);LCDDelay(5);Write_LCD_Command

15、(0x38);LCDDelay(5);Write_LCD_Command(0x0C);LCDDelay(5);Write_LCD_Command(0x06);LCDDelay(5);/* 功能:在 1602液晶指定的行上显示字符串 (共两行,一行 16个字符 ) 参数: *str= 字符串指针, LineNo= 行首地址 ( 第一行 0x0 0 ,第二行 0x40) 返回:无 */void LCD_Display_String(uchar *str, uchar LineNo)uchar k;LCD_Set_POS(LineNo);for(k=0;k16;k+)Write_LCD_Data(s

16、trk);/* 功能:在 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);Write_LCD_Data(Dat);/* 主函数 */void

17、main()LCD_Initialize();/1602 初始化LCD_Display_String(Prompts0,0x00);LCD_Display_String(Prompts5,0x40);ReadTemperatureFromDS18B20();/ 测温度HCSR04_Initialize();/HC-SR04 初始化while(1)Beep(1);ReadTemperatureFromDS18B20();/ 测温度DisplayTemperatureValue(); if(CurTempInteger26)CurTempInteger=26;SPEEDSOUND=+CurTempl nteger*;/ 计算声速DistanceValue=DistanceStatistics();/测距并返回距离值显示距离值DisplayDist

温馨提示

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

评论

0/150

提交评论