带温度补偿的超声波测距程序_第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* 计算公式:

2、s=(334.1m/s+temperature*0.61)*n*t/2,n为计数值=th0*256+tl0*/*包含头文件*/#include #include #define delay4us()_nop_();_nop_();_nop_();_nop_();/*宏定义*/#define ucharunsigned char/无符号8位#define uintunsigned int /无符号16位#define ulongunsigned long /无符号32位/*全局变量定义*/sbit beep=p15;/报警测量超出范围sbit trig=p34;/hc-sr04触发信号输入sbi

3、t 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 400cm ,/测距最大值400cmmin range 2cm ,/测距最小值2cm ,/清屏;uchar xdata di

4、stancetext=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(uint ms);/毫秒延时函数void delay20us();/20微秒延时函数

5、void hcsr04_initialize(); /hcsr04初始化float measuringdistance();/测量距离float distancestatistics(); /测距的数值排序求平均void displaydistancevalue(float dat); /输出距离值到lcd1602上uchar unsigedinttostring(uint value); /将无符号的整数转成字符串,返回字符串长度,不包括0结束符void beep(uchar time); /蜂鸣器void displaytemperaturevalue();/显示温度值/*测量距离*/fl

6、oat measuringdistance() /最大定时时间约65msth0=0;tl0=0;/生成20us的脉冲宽度的触发信号trig=1;delay20us();trig=0;while(!echo);/等待回响信号变高电平tr0=1;/启动定时器0 while(echo);/等待回响信号变低电平tr0=0;/关闭定时器0 return (speedsound*xtaltime*(float)th0*256+(float)tl0)/2000;/返回距离值(mm)/*hcsr04初始化*/void hcsr04_initialize()xtaltime=12/12; /计算单片机计数周期

7、晶振=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);lcd_display_string(prompts2,0x40);beep(2);else if(val

8、ue20)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+;distancetext6+j=m;i=7+j;/剩余位置补空格while(i16)distancetexti=

9、;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(temperaturetext,0x00);/*将无符号的整数转成字符串,返回字符串长度*/uchar unsigedinttos

10、tring(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;/*蜂鸣器*/void beep(uchar time)uchar i;for(i=0;i100;i+)beep=!b

11、eep;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() interrupt 1/ds18b20代码:/*-* 程序功能: ds18b20温度检测程序* 单片机型号:stc8

12、9c52 12mhz* 晶振: 12mhz-*/*包含头文件*/#include #include /*宏定义*/#define ucharunsigned char/无符号8位#define uintunsigned int /无符号16位sbit ds18b20_dq = p33; /定义ds18b20端口ds18b20_dqint xdata curtempinteger; /当前采集的温度值整数部分int xdata curtempdecimal; /当前采集的温度值小数部分精品./*功能:延时函数 stc89c52 12mhz 12t模式 参数:无 返回:无*/void delayu

13、s(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);/延时15us-60usstatus=ds18b20_dq;/读取数据线上的状态delayus(120);return status;/*功能:写一字节到ds18

14、b20中 参数: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);/延时4usif(ds18b20_dq) dat|=0x80;/合并每位数据delayus(15);/延时60usds18b20_dq=1;/拉高总线,准备读下1位数据retur

15、n dat;/*功能:读取温度值并转换成有符号的数值形式 参数:无 返回:无*/void readtemperaturefromds18b20()uchar flag=0;/正负符号标志/存储当前采集的温度值uchar tempvalue=0,0; if(reset_ds18b20() /ds18b20复位curtempinteger=255;curtempdecimal=0;elsewritebytetods18b20(0xcc);/跳过rom命令writebytetods18b20(0x44);/温度转换命令reset_ds18b20();/复位writebytetods18b20(0xc

16、c);/跳过rom命令writebytetods18b20(0xbe);/读取温度暂存器命令tempvalue0=readbytefromds18b20();/先读低字节温度值tempvalue1=readbytefromds18b20();/后读高字节温度值reset_ds18b20();/复位/计算温度值:先进行正温度与负温度判断,高5位全为1(0xf8)则为负数if(tempvalue1&0xf8)=0xf8)/负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。tempvalue1=tempvalue1;tempvalue0=tempvalue0+1;if(tempvalu

17、e0=0x00) tempvalue1+;flag=1;/负数标志/将温度值分为整数和小数两部分存储(默认为12位精度)curtempinteger=(tempvalue1&0x07)4);if(flag) curtempinteger=-curtempinteger;curtempdecimal=(tempvalue0&0x0f)*625;精品./lcd1602程序代码:/* 程序功能:1602液晶显示程序 单片机型号:stc90c160 12mhz*/*1602液晶显示器控制端口分配,数据使用p0端口*/sbit lcd_rs=p20;sbit lcd_rw=p21;sbit lcd_en

18、=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表示状态闲*/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液晶写指令 参数:

19、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(uchar dat)精品.while(lcd_busy_check();lcd_rs=1;lcd_rw=0;lcd_en=0;p0=dat;delay4us(

20、);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(0x38);lcddelay(5);write_lcd_command(0x0c);lcddelay(5);write_lcd_command(0x06

21、);lcddelay(5);/*功能:在1602液晶指定的行上显示字符串(共两行,一行16个字符)参数:*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液晶指定位置显示一个字符(共两行,一行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_comma

温馨提示

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

评论

0/150

提交评论