超声波测距程序
超声波测距程序
超声波测距程序超声波程序如下:/**********************************包含头文件**********************************/#include#include "1602.h"/************************************宏定义************************************/#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;/************************************位定义************************************/sbit INPUT = P3^2; //回声接收端口sbit OUTPUT = P1^0; //超声触发端口sbit Beep = P2^0 ; // 蜂鸣器/********************************定义变量和数组********************************/long int distance=0; //距离变量uchar table[]=" Welcome to ";uchar table0[]=" chaoshengbo ";uchar table1[]="There's no echo.";uchar table2[]=" csbcj ";uchar table3[]="Distance:";uchar count;/***********************************函数声明***********************************/extern void initLCD();extern void write_date(uchar date);extern void write_com(uchar com);extern void delay(uint x);/************************************************************** ****************//* 函数名称 : Delay_xMs *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void Delay_xMs(unsigned int x){unsigned int i,j;for(i = 0;i < x;i++ ){for(j = 0;j < 3;j++ ){;}}}/************************************************************** ****************//* 函数名称 : Alarm *//* 函数描述 : 蜂鸣器发声函数 *//* 输入参数 : t *//* 参数描述 : 发声的次数 *//* 返回值 : 无 *//************************************************************** ****************/void Alarm(uchar t){uchar i;for(i = 0;i < t;i++){Beep = 1;Delay_xMs(1000);Beep = 0;Delay_xMs(1000);}}/************************************************************** ****************//* 函数名称 : delayt *//* 函数描述 : 延时函数 *//* 输入参数 : x*//* 参数描述 : 延时时间数据 *//* 返回值 : 无 *//************************************************************** ****************/void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}/************************************************************** ****************//* 函数名称 : Init_MCU *//* 函数描述 : 初始化单片机函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Init_MCU(void){TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式TL0 = 0x66;TH0 = 0xfc; //1msET0 = 1; //开定时器2EA = 1; //总中断使能}/************************************************************** ****************//* 函数名称 : Init_Parameter *//* 函数描述 : 初始化参数和IO口函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//******************************************************************************/void Init_Parameter(void){OUTPUT =1;INPUT = 1;count = 0;distance = 0;}/************************************************************** ****************//* 函数名称 : display_char *//* 函数描述 : 显示字符串函数 *//* 输入参数 : point,address *//* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */ /* 返回值 : 无 *//************************************************************** ****************/void display_char(uchar *point,uchar address){uchar i;write_com(0x80 + address);for(i = 0;i < 16; i++){write_date(*point);point++;}}/************************************************************** ****************//* 函数名称 : display *//* 函数描述 : 显示数字*//* 输入参数 : number,address *//* 参数描述 : number写入的数据,address地址 *//* 返回值 : 无 *//************************************************************** ****************/void display(int number,uchar address){uchar b,c,d,e;b= (number / 1000);c= (number / 100) % 10;d = (number / 10) % 10;e = number % 10;write_com(0x80 + address);write_date(b + 48);write_date(c + 48);write_date(d + 48);write_date(46); //小数点的ASCIIwrite_date(e + 48);write_date(99); //"c"的ASCIIwrite_date(109); //"m"的ASCII}/************************************************************** ****************//* 函数名称 : Trig_SuperSonic *//* 函数描述 : 发出声波函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Trig_SuperSonic(void)//出发声波{OUTPUT = 1;delayt(1);OUTPUT = 0;}/************************************************************** ****************//* 函数名称 : Measure_Distance *//* 函数描述 : 计算距离函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void Measure_Distance(void){uchar l;uint h,y;TR0 = 1;while(INPUT){;}TR0 = 0;l = TL0;h = TH0;y = (h << 8) + l;y = y - 0xfc66;//us部分distance = y + 1000 * count;//计算总时间TL0 = 0x66;TH0 = 0xfc;delayt(30);distance = VELOCITY_30C * distance / 20000;}/************************************************************** ****************//* 函数名称 : main *//* 函数描述 : 主函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void main(void){Beep = 0;rw = 0;initLCD();Init_MCU();Init_Parameter();Alarm(2);display_char(table,0x00);display_char(table0,0x40);Delay_xMs(30000);display_char(table2,0x00);display_char(table1,0x40);while(1){Trig_SuperSonic(); //触发超声波发射while(INPUT == 0) //等待回声{;}Measure_Distance(); //计算脉宽并转换为距离display_char(table3,0x40);display(distance,0x49); //显示距离Init_Parameter(); // 参数重新初始化delayt(100); //延时,两次发射之间要至少有10ms间隔}}/************************************************************** ****************//* 函数名称 : timer0 *//* 函数描述 : T0中断处理函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void timer0 (void) interrupt 1{TF0 = 0;TL0 = 0x66;TH0 = 0xfc;count++;if(count == 18)//超声波回声脉宽最多18ms{TR0 =0;TL0 = 0x66;TH0 = 0xfc;count = 0;}}/************************************************************** ****************/1602程序如下:/************************************宏定义************************************/#define uchar unsigned char#define uint unsigned int/************************************位定义************************************/sbit dula = P2^6;sbit wela = P2^7;sbit rs = P2^3;sbit rw = P2^4;sbit lcden = P2^5;/************************************************************** ****************//* 函数名称 : delay *//* 函数描述 : 延时函数 *//* 输入参数 : x *//* 参数描述 : 延时时间 *//* 返回值 : 无 *//************************************************************** ****************/void delay(uint x){uint a,b;for(a = x;a > 0;a--){for(b = 10;b > 0;b--){;}}}/************************************************************** ****************//* 函数名称 : write_com *//* 函数描述 : 1602写命令函数 *//* 输入参数 : com*//* 参数描述 : 控制命令 *//* 返回值 : 无 *//************************************************************** ****************/void write_com(uchar com){P0 = com;rs = 0;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : write_date *//* 函数描述 : 1602写数据函数 *//* 输入参数 : date *//* 参数描述 : 要写入的数据 *//* 返回值 : 无 *//******************************************************************************/void write_date(uchar date){P0 = date;rs = 1;lcden = 0;delay(10);lcden = 1;delay(10);lcden = 0;}/************************************************************** ****************//* 函数名称 : initLCD *//* 函数描述 : 1602初始化函数 *//* 输入参数 : 无 *//* 参数描述 : 无 *//* 返回值 : 无 *//************************************************************** ****************/void initLCD(void){dula = 0;wela = 0;write_com(0x38);delay(20);write_com(0x0f);delay(20);write_com(0x06);delay(20);write_com(0x01);delay(20);}/************************************************************** ****************/51程序如下:#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */ sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82; sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5;sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5; sbit T0 = 0xB4; sbit INT1 = 0xB3; sbit INT0 = 0xB2; sbit TXD = 0xB1; sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F; sbit SM1 = 0x9E; sbit SM2 = 0x9D; sbit REN = 0x9C; sbit TB8 = 0x9B; sbit RB8 = 0x9A; sbit TI = 0x99; sbit RI = 0x98;#endif。
超声波测距仪使用方法说明书
超声波测距仪使用方法说明书1. 概述超声波测距仪是一种常用的测量仪器,通过发射超声波脉冲并接收其回波来测量距离。
本说明书将详细介绍超声波测距仪的使用方法,以便用户能够正确、高效地操作该仪器。
2. 准备工作在开始测量之前,确保以下准备工作已经完成:2.1 确认超声波测距仪的电源已经连接,并处于正常工作状态。
2.2 确认被测物体与测距仪之间没有遮挡物,以保证测量的准确性。
2.3 选择合适的工作模式和单位,根据实际需要进行相应的设置。
3. 测量步骤3.1 启动仪器按下电源开关,待超声波测距仪正常启动后,屏幕上将显示相关的操作提示。
3.2 定位测量目标将测距仪对准待测物体,使其成为屏幕上的测量目标。
可以通过调整测距仪的方向和角度来精确定位。
3.3 发射超声波脉冲按下“发射”按钮,超声波测距仪将发射一组超声波脉冲,并记录下发送时刻。
3.4 接收回波当超声波脉冲遇到物体并被反射回来时,测距仪将接收到回波,并记录下接收时刻。
3.5 计算距离根据发送和接收时刻之差,超声波测距仪可以计算出测量目标与仪器之间的距离。
4. 测量注意事项4.1 避免测量目标表面有较强的光照或强烈的声音,以免影响超声波的传播和接收。
4.2 在测量长距离时,要保持仪器与测量目标之间的直线视线,以减小测量误差。
4.3 对于不规则形状的物体,建议进行多次测量并取平均值,以提高测量结果的准确性。
4.4 定期检查超声波测距仪的探头是否清洁,避免灰尘或其他杂质的影响。
5. 故障排除在使用超声波测距仪过程中,可能会遇到一些常见的故障情况,以下是一些常见问题的排除方法:5.1 无法启动或显示异常:检查电源连接是否正常,试试更换电池或充电。
5.2 测距不准确:确认测量目标与测距仪之间没有遮挡物,并确保仪器正确定位。
5.3 回波信号弱:检查探头是否干净,并调整适当的增益和灵敏度。
5.4 其他问题:如有其他问题,请参考产品说明书或联系售后服务。
6. 常见应用场景超声波测距仪在多个领域具有广泛的应用,包括建筑工程、机械制造、物流仓储等。
超声波测距仪操作指南说明书
超声波测距仪操作指南说明书一、产品概述超声波测距仪是一种使用超声波技术进行测距的仪器。
该仪器可以广泛应用于建筑、工程、仓储、物流等领域,用于测量物体与测距仪之间的距离。
二、产品特点1. 高精度测量:超声波测距仪采用先进的超声波技术,能够精确测量物体与测距仪之间的距离,并具备高精确度。
2. 快速响应:该测距仪具有快速响应的能力,可以及时给出测量结果。
3. 多功能设计:超声波测距仪尤其适用于需要进行反复测量的环境,它不仅可以测量距离,还可以提供体积、面积等其他相关数据。
4. 易于操作:该测距仪采用简单的操作界面,用户可以轻松进行操作,并能够快速上手。
三、产品使用步骤1. 打开超声波测距仪:按下开关按钮,开启测距仪。
2. 进行初步设置:进入设置菜单,根据实际需求选择测量单位(如厘米、米)以及其他设置选项。
3. 对准测量目标:将测距仪对准待测量的目标物体,确保无遮挡物干扰,距离尽量垂直测量。
4. 进行测量:按下“测量”按钮,测距仪将向目标物体发出超声波信号,并通过测量回波时间计算出距离。
5. 查看测量结果:测距仪会在显示屏上显示测得的距离数值,并可在菜单中设置是否显示其他相关数据,如体积、面积。
6. 关闭超声波测距仪:在使用完毕后,按下开关按钮,关闭测距仪。
四、使用注意事项1. 避免使用在极端环境下:超声波测距仪对于极端高温、低温、潮湿等环境不适用,应避免在此类环境中使用。
2. 避免测量透明物体:超声波无法准确测量透明物体的距离,应避免对透明物体进行测量。
3. 避免测量不规则形状物体:对于形状不规则的物体,测量结果可能存在误差,应注意。
4. 避免测量过程中晃动:在测量过程中,避免手部晃动或移动,以确保测量结果的准确性。
5. 定期校准:为了确保测量结果的准确性,定期进行校准是必要的。
五、常见问题解答1. 为什么测量结果不准确?可能是测距仪与目标物之间存在遮挡物,或者测量时手部晃动等原因导致测量结果不准确。
超声波测距程序_代码全
/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。
3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。
超声波测距正确程序
/*-----------------------------------------------内容:通过标准程序静态显示字符引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^0; //定义端口sbit RW = P2^1;sbit EN = P2^2;sbit echo=P1^1; //接收端sbit trig=P1^0; //发射端sbit Beap=P2^3; //蜂鸣器sbit Key_Data=P2^4; //按键发射#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};unsigned char disbuff[4] ={ 0,0,0,0,};unsigned long S=0;unsigned char Flag;unsigned int time;unsigned int t=500;/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*-------------------------------------------------初始化超声波测距仪,定时器,中断---------------------------------------------------*/void init(){echo=0;trig=0;Flag=1;LCD_Write_Char(7,0,'o');LCD_Write_Char(8,0,'k');TMOD=0x01; //设T0为方式1 TH0=0;TL0=0;ET0=1; //允许T0中断TR0=0;EA=1; //开启总中断}/*------------------------------------------------定时器0中断函数--------------------------------------------------*/void timer0() interrupt 1{TH0=0;TL0=0;Flag=0; //标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要}/*------------------------------------------------超声波测距仪触发模块-------------------------------------------------*/void startmodule(){trig=1; //15us 启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();trig=0;}/*------------------------------------------------键盘扫描函数--------------------------------------------------*/unsigned char KeyScan(void){if(!Key_Data) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!Key_Data) //再次确认按键是否按下,没有按下则退出{while(!Key_Data);//如果确认按下按键等待按键释放,没有则退出{return 1;}}}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){LCD_Init();LCD_Clear();//清屏init();while (1){if(KeyScan()){ t=500;startmodule();while(!echo); //起始为0,当为1时,开始计时TR0=1; //开启计数while(echo&&Flag); //当echo为1计数并等待//flag标志位,当检测超过65ms退出等待回波,继续下一次检测TR0=0; //停止计时time=(TH0*256+TL0)*(12/11.0592);TH0=0;TL0=0; //关闭计数S=(time*1.7)/100;if((S<1)||(S>400)||(Flag==0)) //小于1cm大于4m超出测量范围显示'----'{Flag=1;LCD_Write_Char(0, 1, ASCII[11]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[11]);LCD_Write_Char(3, 1, ASCII[11]);LCD_Write_Char(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100; //把s的1-3位数存在disbuffdisbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;LCD_Write_Char(0, 1, ASCII[disbuff[0]]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[disbuff[1]]);LCD_Write_Char(3, 1, ASCII[disbuff[2]]);LCD_Write_Char(4, 1, ASCII[12]); //显示MDelayMs(500);}while(t){t--;DelayMs(1); //发出大约500Hz的方波频率越大声音越尖Beap=!Beap;}}}}。
超声波测距程序设计
超声波测距程序设计超声波测距是一种常用的非接触式测距技术,其原理是利用超声波在空气中传播的特性进行测量。
在超声波测距程序设计中,需要考虑到硬件设备的选择、信号处理算法的设计以及数据分析与显示等方面。
下面是一份超声波测距程序设计的详细介绍。
首先,硬件设备的选择是超声波测距程序设计的第一步。
通常情况下,超声波测距传感器包括超声波发射器和接收器两部分。
超声波发射器发射出特定频率的超声波脉冲,接收器接收到反射的超声波并进行信号放大和处理。
根据具体的应用需求,可以选择适当的超声波测距传感器。
其次,需要设计合适的信号处理算法来处理接收到的超声波信号。
根据超声波的传播速度和回波时间差,可以计算出被测物体与传感器之间的距离。
常用的信号处理算法包括时间差测量法和周期测量法。
时间差测量法是一种基于超声波的往返时间计算距离的方法。
具体实现时,首先通过发射器发射出超声波脉冲,然后通过接收器接收到反射的超声波脉冲。
利用计时器记录下超声波发射和接收的时刻,然后通过时间差换算为距离。
周期测量法是一种基于超声波的周期计算距离的方法。
具体实现时,通过发射器发射出连续的超声波信号,接收器接收到反射的超声波信号。
通过计算接收到的超声波信号的周期,然后通过周期与传播速度计算得到距离。
在信号处理算法的设计中,需要考虑到测量误差的问题。
超声波信号在传播过程中会受到多种因素的影响,例如温度、湿度、气压等。
因此,需要进行一定的误差校正,以提高测量的准确性。
最后,数据分析与显示是超声波测距程序设计中的一个重要环节。
通过采集到的测量数据,可以对被测物体的距离进行分析和显示。
通常情况下,可以通过串口或者其他通信方式将测量数据传输到上位机,然后通过上位机进行分析和显示,以便用户进行观察和判断。
综上所述,超声波测距程序设计通常包括硬件设备的选择、信号处理算法的设计以及数据分析与显示等方面。
通过合理设计和实现,可以实现对被测物体距离的准确测量,并开发出符合实际需求的超声波测距应用系统。
超声波测距 程序
//晶振=8M//MCU=STC10F04XE//P0.0-P0.6共阴数码管引脚//Trig = P1^0//Echo = P3^2#include <reg52.h> //包括一个52标准内核的头文件#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned longsbit Trig = P1^0; //产生脉冲引脚sbit Echo = P3^2; //回波引脚sbit test = P1^1; //测试用引脚sbit wei =P2^6;sbit duan=P2^7;uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//,0x77,0x7c,//0x39,0x5e,0x79,0x71};//数码管0-9uint distance[4]; //测距接收缓冲区uchar ge,shi,bai,qian,temp,flag,outcomeH,outcomeL,i; //自定义寄存器bit succeed_flag; //测量成功标志//********函数声明void conversion(uint temp_data);void delay_20us();void delay(uint m);void main(void) // 主程序{ uint distance_data,a,b;uchar CONT_1;i=0;flag=0;test =0;Trig=0; //首先拉低脉冲输入引脚TMOD=0x11; //定时器0,定时器1,16位工作方式TR0=1; //启动定时器0IT0=0; //由高电平变低电平,触发外部中断ET0=1; //打开定时器0中断EX0=0; //关闭外部中断EA=1; //打开总中断0while(1) //程序循环{EA=0;Trig=1;delay_20us();Trig=0; //产生一个20us的脉冲,在Trig引脚while(Echo==0); //等待Echo回波引脚变高电平succeed_flag=0; //清测量成功标志EX0=1; //打开外部中断TH1=0; //定时器1清零TL1=0; //定时器1清零TF1=0; //TR1=1; //启动定时器1EA=1;while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)TR1=0; //关闭定时器1EX0=0; //关闭外部中断if(succeed_flag==1){distance_data=outcomeH; //测量结果的高8位distance_data<<=8; //放入16位的高8位distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据distance_data*=12; //因为定时器默认为12分频distance_data/=58; //微秒的单位除以58等于厘米} //为什么除以58等于厘米,Y米=(X秒*344)/2 // X秒=(2*Y米)/344 ==》X秒=0.0058*Y米==》厘米=微秒/58if(succeed_flag==0){distance_data=0; //没有回波则清零test = !test; //测试灯变化}a=distance_data;if(b==a) CONT_1=0;if(b!=a) CONT_1++;if(CONT_1>=3){ CONT_1=0;b=a;conversion(b);}delay(150);}}//***************************************************************//外部中断0,用做判断回波电平INTO_() interrupt 0 // 外部中断是0号{outcomeH =TH1; //取出定时器的值outcomeL =TL1; //取出定时器的值succeed_flag=1; //至成功测量的标志EX0=0; //关闭外部中断}//**************************************************************** //定时器0中断,用做显示timer0() interrupt 1 // 定时器0中断是1号{TH0=0xfd; //写入定时器0初始值TL0=0x77;switch(flag){case 0x00:wei=1;P0=0xfe;wei=0;duan=1;P0=ge;duan=0;flag++;break;case 0x01:wei=1;P0=0xfd;wei=0;duan=1;P0=shi;duan=0;flag++;break;case 0x02:wei=1;P0=0xfb;wei=0;duan=1;P0=bai;duan=0;flag++;break;case 0x03:wei=1;P0=0xf7;wei=0;duan=1;P0=qian;duan=0;flag=0;break;}}//显示数据转换程序void conversion(uint temp_data){uchar ge_data,shi_data,bai_data,qian_data ;qian_data=temp_data/1000;temp_data=temp_data%1000;bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;qian_data=SEG7[qian_data];bai_data=SEG7[bai_data];shi_data=SEG7[shi_data];ge_data =SEG7[ge_data];EA=0;qian=qian_data;bai = bai_data;shi = shi_data;ge = ge_data ;EA=1;}//****************************************************************** void delay_20us(){ uchar bt ;for(bt=0;bt<100;bt++);}void delay(uint m){uchar i,j;for(i=0;i<m;i++)for(j=0;j<124;j++);}。
超声波测距程序(LCD1602液晶显示)
#include<reg52.h>#include<intrins.h>#define uint unsignedint#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;//------超声波引脚-------sbitTx=P3^3; //触发控制信号输入Trigsbit Rx=P3^2; //回响信号输出Echouchar code table[]={"Distance Test:"}; //LCD第一行显示uchartemp_dis[]= {"000.0 cm"}; //LCD第二行longintt,distance;uchar cache[4]={0,0,0,0};//--------延时-------void delay(uintms){uint t;while(ms--)for(t=0;t<120;t++);}//-------读LCD状态-------ucharread_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------voidlcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------voidlcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------voidlcd_write_data(uchardat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------voidlcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1 lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------voidset_lcd_pos(uchar p){lcd_write_com(p|0x80);}//---------液晶显示程序----------voidlcd_print(ucharp,uchar *s,uint low){uintnum;set_lcd_pos(p);for(num=0;num<low;num++){lcd_write_data(s[num]);delay(1);}}void HC05_Init(){Tx=1; //触发脉冲NOP();NOP();NOP();NOP();Tx=0;distance=0.17*t; //距离计算}voiddistance_convert(long intdat){cache[0]=dat/1000;cache[1]=dat/100%10;cache[2]=dat/10%10;cache[3]=dat%10;temp_dis[0]=cache[0]+'0';temp_dis[1]=cache[1]+'0';temp_dis[2]=cache[2]+'0';temp_dis[4]=cache[3]+'0';}//------------主程序-----------void main(){lcd_init();delay(5);TMOD=0x19;EA=1; //开总中断TR0=1; //启动定时器EX0=1; //开外部中断IT0=1; //设置为下降沿中断方式while(1){HC05_Init();distance_convert(distance);lcd_print(0x01,table,14);lcd_print(0x44,temp_dis,8);}}//外部中断0void int0() interrupt 0{t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时TH0=0;TL0=0;}。
超声波测距原理及调试程序
一、按如下图示连接好电缆线:1:VCC 电源+5V输入2:ECHO 计数(计时)管脚3:TRIG 触发输入4:DQ 温度传感器IO口(暂不提供本功能,不连接)5:GND 电源地6:PCW RS232通讯接口TXD,RS232电平(暂不提供本功能,不连接)7:PCR RS232通讯接口RXD,RS232电平(暂不提供本功能,不连接)二、程序处理单片机程序处理时,只要将TRIG脚给一段时间的高电平,模块自动就会发送40K的方波,发送完毕ECHO脚为高电平,模块自动检测是否有信号返回,如有信号返回,ECHO脚变为低电平,ECHO脚的高电平时间就是超声波走过的时间,测试简单方便。
身长转换公式:L=(331.5+0.6*T)*b*js+offset;其中L为测量长度,T为当前温度,b为长度转换系数(不同单片机该系数不同,需要自行测试得出该值),js为ECHO脚的高电平时计数值(可参考以下子程序),offset为偏移值(对测量精度要求不高时,此项可省略)各变量定义为:unsigned long L ; unsigned char T; float b;unsigned int js; float offset;对测量精度要求很高时,可对超声波测量距离进行校长标定处理,即在两个不同的点分别进行校正,校正时L、T、js都是已知量,可以求出长度转换系数b和偏移量offset,然后再根据每次测量的js值,可以求出实际的长度。
三、调用子程序注意:以下程序已经是成功运用到产品中的子程序,请放心调用,不要随意外传已成功的超声波测距程序~~室温25摄氏度。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intvoid udelay(int a);sbit echo=P1^0;sbit trig=P1^2;uint i;unsigned long js=0;float l;uint ll;uint height[5];uint table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};uint led[]={0x00,0x01,0x02,0x03,0x04};void fdelay(int a);void display();void main(){echo=1;while(1){trig=1;udelay(50);trig=0;while(echo==0) ;while(echo==1) js++;l=0.3035*js+9.5;ll=(uint)(l*10);display();i=0;while(i<5){P2=led[i];P0=table[height[i]];fdelay(10);i++;}js=0;}}void display(){height[0]=( ll/1000);height[1]=(( ll/100)%10); height[2]=((ll/10)%10);height[3]=10;height[4]=(ll%10);}void fdelay(int a){uint ii=0;uint jj=0;for(jj=0;jj<a;jj++)for(ii=0;ii<=120;ii++); }void udelay(int a){uint ii=0;for(ii=0;ii<=a;ii++); }。
超声波测距正确程序
内容:通过标准程序静态显示字符引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^0; //定义端口sbit RW = P2^1;sbit EN = P2^2;sbit echo=P1^1; //接收端sbit trig=P1^0; //发射端sbit Beap=P2^3; //蜂鸣器sbit Key_Data=P2^4; //按键发射#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};unsigned char disbuff[4] ={ 0,0,0,0,};unsigned long S=0;unsigned char Flag;unsigned int time;unsigned int t=500;/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/ void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}/*------------------------------------------------LCD初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------- 初始化超声波测距仪,定时器,中断---------------------------------------------------*/ void init(){echo=0;trig=0;Flag=1;LCD_Write_Char(7,0,'o');LCD_Write_Char(8,0,'k');TMOD=0x01; //设T0为方式1 TH0=0;TL0=0;ET0=1; //允许T0中断 TR0=0;EA=1; //开启总中断}/*------------------------------------------------定时器0中断函数--------------------------------------------------*/void timer0() interrupt 1{TH0=0;TL0=0;Flag=0; //标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要}/*------------------------------------------------超声波测距仪触发模块-------------------------------------------------*/void startmodule(){trig=1; //15us 启动一次模块_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();trig=0;}/*------------------------------------------------键盘扫描函数--------------------------------------------------*/unsigned char KeyScan(void){if(!Key_Data) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!Key_Data) //再次确认按键是否按下,没有按下则退出 {while(!Key_Data);//如果确认按下按键等待按键释放,没有则退出 {return 1;}}}}/*------------------------------------------------主函数------------------------------------------------*/void main(void){LCD_Init();LCD_Clear();//清屏init();while (1){if(KeyScan()){ t=500;startmodule();while(!echo); //起始为0,当为1时,开始计时TR0=1; //开启计数while(echo&&Flag); //当echo为1计数并等待//flag标志位,当检测超过65ms退出等待回波,继续下一次检测TR0=0; //停止计时time=(TH0*256+TL0)*(12/11.0592);TH0=0;TL0=0; //关闭计数S=(time*1.7)/100;if((S<1)||(S>400)||(Flag==0)) //小于1cm大于4m超出测量范围显示'----'{Flag=1;LCD_Write_Char(0, 1, ASCII[11]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[11]);LCD_Write_Char(3, 1, ASCII[11]);LCD_Write_Char(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100; //把s的1-3位数存在disbuffdisbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;LCD_Write_Char(0, 1, ASCII[disbuff[0]]);LCD_Write_Char(1, 1, ASCII[10]); //显示点LCD_Write_Char(2, 1, ASCII[disbuff[1]]);LCD_Write_Char(3, 1, ASCII[disbuff[2]]);LCD_Write_Char(4, 1, ASCII[12]); //显示MDelayMs(500);}while(t){t--;DelayMs(1); //发出大约500Hz的方波频率越大声音越尖Beap=!Beap;}}}}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
超声波测距汇编程序
超声波测距仪的软件设计1超声波测距仪的软件规划超声波测距仪的程序主要包括以下功能模块:(1) DS18B20温度传感器接口模块,分为初始化子程序、写入子程序及读取子程序等部分;(2)基于MAX7219的显示模块,分为MAX7219初始化子程序、写入子程序及显示子程序等部分;(3)温度补偿与距离计算模块,分为超声波发射控制程序、接收处理子程序、温度补偿子程序及距离计算子程序等部分;(4)主模块,分为系统的初始化、按键处理及各子程序的调度管理等部分。
系统流程图4-1形象地描述了各模块功能及相互之间的关系。
图4-1系统流程图2DS18B20的接口程序设计DS18B20的一线工作协议流程是,初始化→ROM操作指令→存储器操作指令→数据传输。
其工作时序包括:初始化时序、写时序和读时序。
每种工作时序都有相应的要求,这在进行DS18B20接口程序设计时必须足够重视。
2.1DS18B20的初始化DS18B20初始化的实质是使DS18B20复位,主要是通过判断存在脉冲的形式来实现的。
首先,主机发复位脉冲,即宽度范围为480us≤t≤960us的负脉冲,拉高15~90us以延时等待,然后通过输入/输出线读出存在脉冲,为低则说明存在,复位成功;否则说明不存在,复位失败,必须对DS18B20重新初始化。
;************************************************************; DS18B20初始化(复位)子程序;如果存在,则EXIST=1,否则=0;************************************************************DS18B20_RST:CLR WDIOMOV R7, #32LCALL DELAY15USSETB WDIOMOV R7, #4LCALL DELAY15USCLR EXISTJB WDOP, DS18B20_RST_0SETB EXISTMOV R7, #28LCALL DELAY15USDS18B20_RST_0:RST字节写的时序是拉低输入/输出线至少15us以作为起始信号,按从低位到高位顺序取出预写字节中的1位数据,写入输入/输出线,延时等待15us后将输入/输出线拉高作为停止信号,以等待下一位的写入。
超声波测距流程
超声波测距流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!超声波测距流程超声波测距流程概述如下:超声波测距流程主要包括以下几个步骤:一、超声波发射1.1 超声波发射器产生超声波1.2 超声波通过发射器传播二、超声波接收2.1 超声波遇到障碍物后产生回波2.2 回波被接收器接收三、信号处理3.1 接收到的信号经过放大和滤波处理3.2 计算出回波传播时间四、距离计算4.1 根据声速计算出距离4.2 距离计算结果输出五、数据处理5.1 对距离结果进行平滑处理5.2 判断距离是否在合理范围内六、显示输出6.1 将距离结果显示在显示屏上6.2 根据距离结果进行相应控制总结:超声波测距流程涵盖了从超声波发射、接收、信号处理、距离计算、数据处理到显示输出的完整过程,通过精确计算距离,实现了对障碍物距离的准确测量。
超声波测距程序(详细C语言数码管显示)
超声波测距程序(详细C语言数码管显示)#include<reg52.h> //头文件#include<intrins.h>// _nop_() 函数延时1US用#include <stdio.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define nop _nop_()sbit csb=P1^0;//超声波发送端口为P1.0sbit bai=P2^2;//数码管百位sbit shi=P2^1;//数码管十位sbit ge=P2^0;//数码管个位uchar flag;//超声波接收标志float juli1;//距离变量,用来数码管显示用int juli;uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0到9的代码int xianshi[3];void delayshow(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void ledshow(void){xianshi[0]=juli/100;xianshi[1]=((juli%100)/10);xianshi[2]=juli%10;bai=0;P0=table[xianshi[0]];delayshow(2);bai=1;delayshow(2);shi=0;P0=table[xianshi[1]];delayshow(2);shi=1;delayshow(2);ge=0;P0=table[xianshi[2]];delayshow(2);ge=1;delayshow(2);}/***************n个ms函数*******************/ void delay_nms(uint ms) //delay ms 函数{uchar i;while(ms--){for(i=0;i<123;i++);}}/************************************************ 延时100us函数***********************************************/ void delay100us(){uchar j;for(j=50;j>0;j--);}/********************************************** 发送超声波函数,实测为38KHz信号,4个这样的方波***********************************************/ void tran(){uchar i;for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;//关超声波发送ET0=1;EA=1;delay100us();//延时100us左右后再开中断,避免直接回来的回波//理论上可以测量的最小距离为:0.0001×344=0.0344M=3.44CMEX0=1;//打开外部中断1TR0=1;//开定时0}void main(){uchar i;delay_nms(10);//等待单片机复位TMOD=0x11;//定时器0方式1用于计时TL0=0;TH0=0;IT0=0;//中断0下降沿有效EA=1;while(1){tran();//发送超声波while(flag==0);//等待接收if(flag==1){juli1*=17.2;//计算距离,因为时间是来回的时间,声速为344M/S 除以2就为172juli1=juli1/1000;juli=(int)(juli1);flag=0;for(i=0;i<50;i++)ledshow();juli=0;}else{juli=0;//超出距离显示000for(i=0;i<10;i++)ledshow();flag=0;}}}/*超声接收程序(外中断0)*/void cs_r() interrupt 0{EX0 = 0;//关闭外部中断0,也就是超声波接收中断TR0 = 0;//关闭定时器0EA=0;juli1=TH0*256+TL0-100;//减去开始延时的100usTL0=0;//清定时0TH0=0;flag= 1;//成功接收标志置1}/*超时清除程序(定时器中断T0)*/void overtime() interrupt 1{EA=0;TL0=0;//清定时0TH0=0;EX0 = 0;//关闭定时器0的中断TR0 = 0;//关闭定时器0ET0 = 0;//关闭定时器0的中断flag= 2;//接收标志置2}。
超声波测距正确程序
超声波测距正确程序摘要超声波测距是一种常见的测量距离的方法,其原理是利用超声波在空气中传播的特性来测量距离。
然而,在实际使用中,由于各种因素的影响,常常会出现距离测量不准确的情况。
本文将介绍一种超声波测距的正确程序,以确保测距结果的准确性。
超声波测距是通过发射超声波并检测回波来测量距离的一种技术。
一般来说,超声波测距的整个过程包括以下几个步骤:1.发射超声波:通过发射器将超声波发射出去。
2.接收回波:当超声波遇到物体时,会反射回来。
通过接收器接收这些回波。
3.计算距离:根据回波的时间差来计算距离。
正确程序要确保超声波测距的准确性,需要注意以下几点:1. 选择合适的发射器和接收器在选择超声波发射器和接收器时,需要考虑其频率、灵敏度和信噪比等参数。
一般来说,频率较高的超声波在空气中传播的距离较短,但灵敏度较高,能够检测到较小的物体。
信噪比也是一个重要的参数,它决定了回波信号和噪声之间的比例,直接影响到测量结果的精度。
2. 稳定的电源超声波测距需要稳定的电源来提供能量,所以需要使用稳定的电源供电。
如果电源不稳定,可能会导致超声波发射不稳定或接收器失灵等问题,进而导致测量结果不准确。
3. 校准在使用之前,需要校准超声波发射器和接收器,以确定它们的工作状态。
校准通常包括调节发射器和接收器的角度、位置和距离等参数,以确保超声波能够正常传播并被接收器接收到。
此外,还需要根据具体的应用场景调整参数,比如根据测量距离要求调整超声波的频率。
4. 环境因素环境因素也会影响超声波的传播和接收。
比如在室内测量时,可能会出现多次反射、折射和干扰等现象,影响超声波的传播。
因此,需要在测量之前进行环境调查,并根据实际情况选择合适的参数进行测量。
超声波测距是一种常见的测量距离的方法。
然而,要确保测量结果的准确性,需要选择合适的发射器和接收器、稳定的电源、正确的校准和考虑环境因素等。
只有在以上各个方面都做到到位,才能够获得准确可靠的测距结果。
超声波测距_C程序
超声波测距 C程序本探头是自带晶振的那种,只需发出一个脉冲,探头发出方波,等待回波并计时,液晶显示。
能避免超出测量距离的死等待,请大家完善。
//超声波模块程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned int time;unsigned int S,s_false;unsigned long num1;bit flag ;sbit Trig =P3^6;//定义引脚sbit Echo=P3^7;sbit lcdrs=P2^0;//命令数据sbit lcdrw=P2^1;//读写sbit lcde=P2^2;//能sbit led=P3^5;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*void delay_20us(){uchar a ;for(a=0;a<100;a++);}*///***************************************************************void write_com(unsigned char com) {lcdrs=0;P0=com;delay(5);lcde=1;delay(5);lcde=0;}void write_data(unsigned char zifu) {lcdrs=1;P0=zifu;delay(5);lcde=1;delay(5);lcde=0;}void write_temp(uint t_emp){uchar qian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80);write_data(0x30+qian);delay(1);write_data(0x30+bai);delay(1);write_data(0x30+shi);delay(1);write_data(0x30+ge); delay(1);delay(100);}/********************************************************/void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {flag=0; //中断溢出标志,失败TH0=0;TL0=0;TR0=0; //关闭计数}/********************************************************/void T1_timer() interrupt 3 //中断{TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1++;if (num1==20){num1=0;led=~led;}}void StartModule() //启动模块{Trig=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;}/********************************************************/void Count(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif(((S<8)||(S>=600))||flag==0) //超出测量范围显示“-”失败 {// flag=1;s_false=1000;write_com(0x80);write_data('e');delay(5);write_data('r');delay(5);write_data('r');delay(5);write_data('o');delay(5);write_data('r');delay(5);// write_temp(s_false);else{write_temp(S);}}/********************************************************//********************************************************/void init(){lcde=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);lcdrw=0;}//*************************************************************** void main(){// unsigned char TempCyc;delay(500); //启动等待,等LCM讲入工作状态lcdrw=0;init(); //LCM初始化delay(500); //延时片刻(可不要)while(1){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断ET1=1;TR1=1;EA=1; //开启总中断Trig=0;Echo=0;while(1){StartModule();flag=1;// while(!Echo); //当echo为零时等待while((!Echo)&&flag); //当echo为零时等待,中断flag跳出等待 TR0=1; //开启计数while(Echo&&flag); //当echo为1计数并等待TR0=0; //关闭计数Count(); //计算delay(120); //80MS}}}。
超声波测距程序
temp=high_time*256+low_time; //temp-2000; temp=(temp/1000)/2; temp*=344; temp=temp/10; return temp; } /************************************** 外部中断服务函数 **************************************/ void TT() interrupt 2 { ui tmp; TR0=0;//关定时器0 ET1=0;//关外部中断 flag=1;//外部中断标志位 tmp=TH0*256+TL0; if((tmp>0)&&(tmp<60000)) { high_time=TH0; low_time=TL0; } else { high_time=0; low_time=0*****************/ void delay100us() { uc j; for(j=50;j>0;j--); } /**************************************** 发码播放函数;add为语音地址 *****************************************/ void send_com(uc add) { uc i; RST=1; RST=0; delay_nms(3); RST=1; delay_nms(20); CS1=0; delay_nms(5); for(i=0;i<8;i++) { CLK=0; if(add&1) DAT=1; else DAT=0; delay100us(); CLK=1; delay100us(); add=add>>1; } CS1=1; } /****************************************** *****************************************/ void sound(ui soud) { ui i,j,k;
超声波测距程序(有备注)
#include<reg51.h>#define uchar unsigned char#define uint unsigned intsfr P4 = 0xC0; //P4口定义sfr P4SW = 0XBB; //P4口寄存器定义void InitLCD(); //OLED初始化void LCD_P6x8Str(unsigned char x,unsigned char y,uint c); //OLED写函数sbit buzzer=P3^7; //蜂鸣器控制端.写0响sbit relay=P3^6; //继电器控制端.写0拨动//sbit led=P0^6; //LED控制端.写0亮sbit trig=P1^0; //超声波控制端sbit echo=P3^2; //超声波接收端uchar flag_succeed; //超声波回波标志uchar flag_move=0; //电机启动标志,1为相对前一个状态未启动uint h,l,time,distance; //时间、距离变量void delay20us() //20微妙延时函数{uchar k;for(k=0;k<100;k++);}void delay(uint z) //简单延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void motor() //电机驱动函数{if(distance>=130) //水用至限定水位{relay=1; //启动电机flag_move=1; //标记电机为启动过的状态}if(distance<=30 && flag_move==1)//水加至限定水位{relay=0; //关闭电机flag_move=0; //取消标记状态}}void main(){relay=0; //关闭电机P4SW=0xff; //P4口全设置成I/O口InitLCD(); //初始化清屏trig=0; //拉低控制脚TMOD=0x01; //定时器工作方式1EA=1; //开总中断while(1){EA=0; //关中断trig=1; //给高电平发送delay20us();//延时trig=0; //发送完毕while(echo==0); //等待回波引脚变高电平flag_succeed=0; //清除成功标志EA=1; //开总中断EX0=1; //开外部中断0TH0=0; //定时器0计数清零TL0=0;TF0=0; //定时器0中断标志清除TR0=1; //开定时器0中断delay(30); //简单延时,等待高电平结束TR0=0; //关定时器0中断EX0=0; //关外部中断0if(flag_succeed==1) //回波成功{time=h*256+l; //时间计算distance=time*0.172; //距离计算LCD_P6x8Str(1,1,distance); //距离显示motor(); //电机控制}if(flag_succeed==0) //回波失败{distance=0; //距离清零buzzer=0; //蜂鸣器报警}delay(90); //延时,防止回波混乱buzzer=1; //关闭蜂鸣器}}void int0() interrupt 0 //外部中断0中断函数{h=TH0; //提取计数数据l=TL0;flag_succeed=1; //回波接收成功EX0=0; //关外部中断0}void t0() interrupt 1 //定时器0中断函数{TH0=0; //计数清零TL0=0;}。
超声波测距编程步骤
超声波测距编程步骤介绍超声波测距是一种常用的测量距离的技术,通过发射超声波并接收其反射信号来计算距离。
本文将介绍超声波测距的编程步骤,包括硬件准备、软件编程和数据处理等内容。
硬件准备在进行超声波测距之前,我们需要准备以下硬件设备: 1. 超声波传感器:用于发射和接收超声波信号。
2. 微控制器:如Arduino、树莓派等,用于控制超声波传感器和进行测距计算。
3. 连接线:用于连接超声波传感器和微控制器。
软件编程下面是超声波测距的软件编程步骤:步骤一:引入库文件首先,我们需要引入超声波测距所需的库文件。
在Arduino中,可以使用Ultrasonic库来完成这一步骤。
步骤二:定义引脚接下来,我们需要定义超声波传感器的引脚。
通常,超声波传感器有两个引脚,一个用于发射超声波信号,一个用于接收反射信号。
在Arduino中,可以使用#define语句来定义引脚。
步骤三:初始化超声波传感器在进行测距之前,我们需要初始化超声波传感器。
在Arduino中,可以在setup()函数中调用Ultrasonic库的初始化函数来完成这一步骤。
步骤四:测量距离现在,我们可以开始进行距离测量了。
在Arduino中,可以使用Ultrasonic库的read()函数来获取超声波传感器返回的距离值。
步骤五:显示结果最后,我们可以将测量结果显示出来。
在Arduino中,可以使用Serial库的print()函数将距离值输出到串口监视器,或者使用LCD显示屏等外部设备来显示测量结果。
数据处理在进行超声波测距后,我们可能需要对测量数据进行进一步的处理。
以下是一些常见的数据处理方法:滤波处理由于超声波测距存在一定的误差,我们可以使用滤波算法对测量数据进行平滑处理,以提高测量的精确性和稳定性。
常用的滤波算法包括移动平均滤波、中值滤波等。
单位转换超声波测距通常返回的是时间值,我们可以将其转换为距离值。
根据超声波的传播速度和时间值,可以使用简单的公式将时间转换为距离,例如距离(cm)=时间(μs)*传播速度(cm/μs)。
超声波测距程序
//超声波测距程序#define uint unsigned int#define uchar unsigned charsbit rs=P2^6; //1602的数据/指令选择控制线sbit rw=P2^5; //1602的读写控制线sbit en=P2^7; //1602的使能控制线sbit trig=P2^0; //超声波测距模块Trigsbit echo=P2^1; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离uchar code table1[]=" distance: " ; //定义字符数组显示数字void delay(uint n){uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void delayt(uint x){uchar j;while(x-- > 0){for(j = 0;j < 125;j++){;}}}void lcd_wcom(uchar com){rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay(5); //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要en=0;}/*------------------------------------------------1602写数据函数------------------------------------------------*/void lcd_wdat(uchar dat){rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//超声波测距程序#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^6; //1602的数据/指令选择控制线sbit rw=P2^5; //1602的读写控制线
sbit en=P2^7; //1602的使能控制线
sbit trig=P2^0; //超声波测距模块Trig
sbit echo=P2^1; //超声波测距模块Echo
bit flag1; //触发信号标志位//
uchar count; //中断累加变量
long int distance; //测量所得距离
unsigned char code table[ ]={"0123456789"};
uchar code table1[]=" distance: " ; //定义字符数组显示数字
void delay(uint n) {
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
void lcd_wcom(uchar com)
{
rs=0; //选择指令寄存器
rw=0; //选择写
P0=com; //把命令字送入P0
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要
en=0;
}
/*------------------------------------------------
1602写数据函数
------------------------------------------------*/
void lcd_wdat(uchar dat)
{
rs=1; //选择数据寄存器
rw=0; //选择写
P0=dat; //把要显示的数据送入P0
delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
en=1; //使能线电平变化,数据送入1602的8位数据口
en=0;
}
void lcd_init()
{
lcd_wcom(0x38); //8位数据,双列,5*7字形,用到功能设定指令
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令
lcd_wcom(0x01); //清屏,用到了清屏指令
}
void lcd_xianshi()
{
uchar i ;
lcd_wcom(0x80);
for(i=0;i<13;i++)
{
lcd_wdat (table1[i]) ;
}
lcd_wcom(0xcc);
lcd_wdat('.');
lcd_wcom(0xce);//单位是厘米//
lcd_wdat('c');
lcd_wdat('m');
}
/*------------------------------------------------ 定时器0初始化,用于计算响应信号时间
------------------------------------------------*/ void init_t0()
{
TMOD=0x01;
TL0=0x66;
TH0=0xfc; //1ms
ET0=1;
EA=1;
}
/*------------------------------------------------ 超声波模块触发信号
------------------------------------------------*/ void trigger()
{
trig=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=1;
}
/*------------------------------------------------ 超声波模块相应端口初始化函数
------------------------------------------------*/ void init_measuring()
{
trig=1;
echo=1;
count=0;
}
/*------------------------------------------------ 超声波模块距离测试函数
------------------------------------------------*/ void measuring()
{
uchar l;
uint h,y;
TR0 = 1;
while(echo==1)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间,单位是微秒
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//
}
/*------------------------------------------------ 超声波模块测量结果显示函数
------------------------------------------------*/
void display(uint x)
{
uchar qian,bai,shi,ge;
qian=x/1000;
bai=(x/100)%10;
shi=(x/10)%10;
ge=x%10;
lcd_wcom(0x80+0x49);//单位是厘米//
lcd_wdat(table[qian]);
lcd_wdat(table[bai]);
lcd_wdat(table[shi]);
lcd_wcom(0x80+0x4d);
lcd_wdat(table[ge]);
}
/*------------------------------------------------
主函数
------------------------------------------------*/ void main()
{ lcd_init(); //液晶初始化
init_t0(); //定时器0初始化
init_measuring(); //超声波相应端口初始化
while(1)
{
lcd_xianshi(); //液晶显示特定字符
trigger(); //触发超声波启动
while(echo==0) //等待回声
{
;
}
measuring(); //进行距离测量
display(distance); //对测量结果进行显示 init_measuring(); //超声波相应端口初始化 delayt(600); //每次测量间隔60ms
}
}
//……………………………………………中断服务函数…………………………………………………//
void T_0()interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count==18)
{
TR0 =0;
TL0 = 0x66; TH0 = 0xfc; count = 0; }
}。