超声波测距程序
超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//***********************************************************************************///具有模式选择.*include<reg52.h>*define UC unsigned char*define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进展模式切换(K1、K4键)void *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进展测量{while(1) /*先进展模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //完毕测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0*00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示完毕}}/***********************************************************************************/ void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。
超声波测距程序_代码全

/*----------------------------------超声波子程序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。
stm32超声波测距程序

s t m32超声波测距程序(总3页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--stm32超声波测距程序单片机用的是STM32F103VC系列,超声波是淘宝买的一个模块,只有5个引脚,用起来很方便。
用的时候只需要其中4个脚,VCC,GND,TRIG,ECHO。
TRIG接PA8,OUT_PP模式;ECHO接PA9,IN_FLOATING模式。
#include ""#include ""#include ""void Tim2_Init(void);void TIM2_IRQHandler(void){if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)==0)GPIO_SetBits(GPIOE,GPIO_Pin_12);elseGPIO_ResetBits(GPIOE,GPIO_Pin_12);TIM_ClearFlag(TIM2, TIM_FLAG_Update);}int main(void){u16 count;float length;BSP_Init();Tim2_Init();//定时器初始化函数LCM_Init();delay_nms(5);GPIO_ResetBits(GPIOA,GPIO_Pin_8);Display_List_Char(1,0,"distance:"); //PA8:Trig PA0:Echowhile (1){GPIO_SetBits(GPIOA,GPIO_Pin_8);delay_nus(20);//拉高超过10us,发射超声波GPIO_ResetBits(GPIOA,GPIO_Pin_8);TIM2->CNT=0;//计数器清0while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0);//等待ECHO脚高电平TIM_Cmd(TIM2, ENABLE);// TIM2 enable counter [允许tim2计数]while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==1)&&(TIM2->CNT<TIM2->ARR-10));TIM_Cmd(TIM2, DISABLE);count=TIM2->CNT;//ECHO脚低电平后读取计数器的值,从而算出往返时间length=count/;Display_List_Char(1,9," ");Display_List_Float(1,9,length);delay_nms(200);}}void Tim2_Init(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_DeInit(TIM2);//复位TIM2定时器= 49999;= 71;= 0x0;= TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);}。
HC-SR04超声波测距的51单片机程序

lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void chushihua1602()
{
lcden=0;
write_order(0x38);
write_order(0x0c);
write_order(0x06);
write_order(0x01);
void zd3() interrupt 3//T1中断用来扫描数L1=0x30;
timer++;
if(timer>=400)
{
timer=0;
trig=1;//800MS启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
{
write_date(a[n]);
delay(3);
}
}
}
a[11]=(s%10000%1000/100)+0x30;
a[12]=(s%10000%1000%100/10)+0x30;
a[13]=(s%10000%1000%100%10)+0x30;
}
else//超出测量范围显示
{
flag=0;
a[9]='w';
a[10]='r';
a[11]='o';
a[12]='n';
write_date(a[0]);
write_date(a[1]);
write_date(a[2]);
write_date(a[3]);
超声波测距 程序

//晶振=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++);}。
超声波测距C程序

#include<AT89X51.H>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断,接CX20106的脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄灭0x00 //自定义};void delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/ void display(uint dat){uchar i,j,k;//分别为百十个位的缓存i=dat/100;//百位j=dat%100/10;//十位k=dat%100%10;//个位s3=1;s2=0;s1=1;s0=1;seg=~leddata[i];dp=0;delay_nms(2);dp=1;s2=1;s3=1;s2=1;s1=0;s0=1;seg=~leddata[j];delay_nms(2);s1=1;s3=1;s2=1;s1=1;s0=0;seg=~leddata[k];delay_nms(2);s0=1;}/**********************************函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/ void tran(void){uchar i;float temp;TH0=0;TL0=0;//清定时TR0=1;//开定时for(i=8;i>0;i--){csb=!csb;nop;nop;nop;nop;nop;nop;nop;nop;nop;}csb=1;delay_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 0{uint tmp;TR0=0;//关定时器ET0=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;}}。
超声波测距原理及调试程序

一、按如下图示连接好电缆线: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++); }。
超声波测距程序说明书

#include<reg51.h>#include<string.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit shizhong=P0^1; //164 时钟线sbit shuju=P0^0; //164 数据线sbit chufa=P2^0; //触发信号输入端unsigned int PWMBJ,i,m,j,k,juli,juli1,juli2;unsigned char code szi[]={0XEE,0X82,0XDC,0XD6,0XB2,0X76,0X7E, 0XC2,0XFE,0XF6};//控制字 0~9uint T;void delay(uint z)//延时子程序 { uint x,y; for(x=10;x>0;x--) for(y=z;y>0;y--); }void xianshi(uint x,uint y) //显示子程序{ char aa; int c; m=y%10;//个位k=y/10;//十位j=x%10;//次高位i=x/10;//最高位for (c=0;c<4;c++)//送四个数{ if(c==0) aa=szi[i];else if(c==1) aa=szi[j];else if(c==2)aa=szi[k]&0xFE;else aa=szi[m];for(i=0;i<8;i++) //每个数送八位{ shizhong=0; //产生下降沿shuju=aa&1;aa=aa>>1; //右移一位shizhong=1; }}delay(2000); }void main(){TMOD=0x19;EA=1; //开总中断TR0=1;//启动定时器 0EX0=1; //开外部中断 0IT0=1; //下降沿中断while(1){ chufa=1;_nop_();_nop_(); _nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); chufa=0;juli=0.17*T;//计算距离()juli1=juli/100;//高二位juli2=juli%100;//第二位xianshi(juli1,juli2);//调用现实函数}}/*-----------------------------------------------内容:通过标准程序静态显示字符引脚定义如下: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为方式1TH0=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;}}}}。
超声波测距程序详解

超声波测距程序详解根据上节课的内容,我们知道超声波模块具有很强的方向性,并且传播过程是直线传播,根据该特点,我们从“空心大萝卜运用题”推导出了超声波测距的计算公式为:•距离=时间×速度=时间(μs)×0.017(cm/μs)好了现在来编程,在上述公式中,我们仅需要确定“时间”,就可以获得测量点与实际物体的距离,那么时间怎么算?让我们先来回顾一下我们之前介绍的超声波模块的知识:•超声波测距的基本原理:通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时;•由于触到被测物体后返回,故其实际的返回时间应除以2后,才能计算出正确的时间。
•模块的四个输出引脚及功能分别为:▪VCC:超声波模块电源供电端,接阿板的+5V;▪GND:接阿板的GND;▪Trig:控制端,输入10us的触发脉冲信号后,超声波模块向外发射超声波;▪Echo:接收端,超声波发射时,该脚同时变为高电平,待超声波接收器收到到反射波后,变为低电平,通过测量该高电平的时间,即可算出测量点到当前位置的距离。
让我们再来回顾一下测量脉冲时间的阿板函数——pulseIn():pulseIn()函数:作用:用于测量脉冲持续时间格式:pulseIn(pin,HIGH/LOW,timeout)•pin:要测量的引脚;•HIGH/LOW:当选择HIGH时,引脚脉冲由低电平变为高电平时,计时器开始计时,当引脚由高电平变为低电平时,计时器停止计时;若选择LOW时,引脚脉冲由高电平变为低电平时,计时器开始及时,当引脚由低电平变为高电平时,计时器停止计时。
从而可以得到脉冲宽度;•Timeout:可选项,在该时间内若无变化,则返回测量时长为零;返回值:返回测量时长,单位为μs(微秒)。
超声波测距程序

超声波测距仪源程序代码:#include <AT89X51.H>#include <intrins.h>#include <STDIO.H>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define L_W_D XBYTE[0X9Fff]#define L_W_C XBYTE[0X1Fff]#define L_R_C XBYTE[0X5Fff]sbit RX=P1^2 ;sbit TX=P1^3;sbit beep=P1^0;sbit en=P3^2;sbit d=P1^7;char table[]="cmX";char name[]="ZhangFengJun";unsigned char flag1=1;unsigned int time=0;unsigned int timer=0;float S=0;bit flag =0;void wait();/***********************1602写命令程序******************************************************/void send_command(uint command){wait();L_W_C=command;}/***************************1602********************************* *************/void delay(){uint i,j;for(i=0;i<50;i++)for(j=0;j<50;j++);}/**************************读忙程序**************************************************/void wait(){uchar x;do{x=L_R_C;}while(x&0x80);delay();}/*************************1602写数据程序*****************************************************/void send_data(uint sdata){wait();L_W_D=sdata;}/********************************************************/void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.87)/100; //算出来是CMif(flag==1) //超出测量{beep=!beep;delay();delay();delay();delay();delay();beep=!beep;}}/********************************************************/void delayms(unsigned int ms){unsigned char i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/ void StartModule() //T1中断用来扫描数码管和计800MS启动模块{TX=1; //800MS 启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}void key(){en=1;if(en==0){flag1=0;send_command(0x01);while(!en);}}/********************************************************/ void main(void){uchar OUT_PUT,i;flag=0;TMOD=0x21; //设T0为方式1,GATE=1;SCON=0x50;TH1=0xFD;TL1=0xFD;TH0=0;TL0=0;TR0=1;ET0=1; //允许T0中断TR1=1; //开启定时器TI=1;EA=1; //开启总中断send_command(0x38);send_command(0x0c);send_command(0x06);send_command(0x01);for(i=0;i<12;i++){send_command(0x80+i);send_data(name[i]);}while(1){key();if(flag1==0){StartModule();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delayms(100); //100MSif(flag==0){OUT_PUT=S;send_command(0x82);send_data(OUT_PUT/100+0x30);send_command(0x83);send_data((OUT_PUT%100)/10+0x30);send_command(0x84);send_data(OUT_PUT%10+0x30);send_command(0x85);send_data(table[0]);send_command(0x86);send_data(table[1]);}else if(flag==1){send_command(0x82);send_data(table[2]);send_command(0x83);send_data(table[2]);send_command(0x84);send_data(table[2]);}flag=0;}}}。
超声波测距流程

超声波测距流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!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 根据距离结果进行相应控制总结:超声波测距流程涵盖了从超声波发射、接收、信号处理、距离计算、数据处理到显示输出的完整过程,通过精确计算距离,实现了对障碍物距离的准确测量。
超声波测距正确程序

超声波测距正确程序摘要超声波测距是一种常见的测量距离的方法,其原理是利用超声波在空气中传播的特性来测量距离。
然而,在实际使用中,由于各种因素的影响,常常会出现距离测量不准确的情况。
本文将介绍一种超声波测距的正确程序,以确保测距结果的准确性。
超声波测距是通过发射超声波并检测回波来测量距离的一种技术。
一般来说,超声波测距的整个过程包括以下几个步骤:1.发射超声波:通过发射器将超声波发射出去。
2.接收回波:当超声波遇到物体时,会反射回来。
通过接收器接收这些回波。
3.计算距离:根据回波的时间差来计算距离。
正确程序要确保超声波测距的准确性,需要注意以下几点:1. 选择合适的发射器和接收器在选择超声波发射器和接收器时,需要考虑其频率、灵敏度和信噪比等参数。
一般来说,频率较高的超声波在空气中传播的距离较短,但灵敏度较高,能够检测到较小的物体。
信噪比也是一个重要的参数,它决定了回波信号和噪声之间的比例,直接影响到测量结果的精度。
2. 稳定的电源超声波测距需要稳定的电源来提供能量,所以需要使用稳定的电源供电。
如果电源不稳定,可能会导致超声波发射不稳定或接收器失灵等问题,进而导致测量结果不准确。
3. 校准在使用之前,需要校准超声波发射器和接收器,以确定它们的工作状态。
校准通常包括调节发射器和接收器的角度、位置和距离等参数,以确保超声波能够正常传播并被接收器接收到。
此外,还需要根据具体的应用场景调整参数,比如根据测量距离要求调整超声波的频率。
4. 环境因素环境因素也会影响超声波的传播和接收。
比如在室内测量时,可能会出现多次反射、折射和干扰等现象,影响超声波的传播。
因此,需要在测量之前进行环境调查,并根据实际情况选择合适的参数进行测量。
超声波测距是一种常见的测量距离的方法。
然而,要确保测量结果的准确性,需要选择合适的发射器和接收器、稳定的电源、正确的校准和考虑环境因素等。
只有在以上各个方面都做到到位,才能够获得准确可靠的测距结果。
超声波测距源程序

#include <SST89x5x4.H>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit dp1=P2^4;sbit dp2=P2^5;sbit dp3=P2^6;sbit dp4=P2^7;sbit beeper=P3^5;sbit SquareOut=P1^0;sbit ReceiveInt=P3^3;uchar code dplib[11]={0x18,0x7B,0x2C,0x29,0x4B,0x89,0x88,0x3B,0x08,0x09,0x0EF}; uchar dpbuf[4];uchar dnt,cnt,Pn;bit dply,rcv,flag;long time;uint distance;void init();void send();void convert();void delay1ms();void delay10ms();void delay();void delayus();void main(){init();while(1){if(dply){dply=0;if(rcv){convert();}else{dpbuf[0]=dpbuf[1]=dpbuf[2]=dpbuf[3]=10;Pn=20;}}}}//void timer0(void) interrupt 1 using 2 {TH0=0xee;TL0=0x00;if(dnt>3) dnt=0;P0=dplib[dpbuf[dnt]];switch(dnt++){case 0:dp2=dp3=dp4=1;dp1=0;break;case 1:dp1=dp3=dp4=1;dp2=0;break;case 2:dp1=dp2=dp4=1;dp3=0;break;case 3:dp1=dp2=dp3=1;dp4=0;}if(cnt<100) cnt++;else{cnt=0;dply=1;TH1=TL1=0;TR1=1;if(flag==0) rcv=1;else rcv=0;beeper=0;send();beeper=1;flag=1;delay();EX1=1;}}//void exint1(void) interrupt 2 using 3 {_nop_(); //延时1usif(ReceiveInt==0){TR1=0;EX1=0;time=TH1<<8;time=time+TL1;flag=0;// while(ReceiveInt==0);}}void init(){cnt=dnt=time=distance=0;Pn=4;dply=rcv=flag=0;dpbuf[0]=10;dpbuf[1]=10;dpbuf[2]=10;dpbuf[3]=10;TMOD=0x11;TH0=0xee;TL0=0x00;TH1=0;TL1=0;PT0=0;PX1=1;ET0=1;ET1=0;EX1=0;EA=1 ;TR0=1;TR1=0;}void send(){uchar k,n;for(n=0;n<Pn;n++){SquareOut=1;for(k=5;k>0;k--);SquareOut=0;SquareOut=0;SquareOut=0;}}void convert (void){distance=(uint)(time/54)-4;Pn=4+(uchar)(distance/10);dpbuf[0]=(uchar)(distance%10);distance/=10;dpbuf[1]=(uchar)(distance%10);distance/=10;dpbuf[2]=(uchar)(distance%10);distance/=10;dpbuf[3]=(uchar)distance;}//延时xmsvoid delay1ms () //延时约1ms,经调试,延时时间受j影响很大{uint j;for(j=110;j>0;j--);}void delay(){uchar i,k;for(i=Pn;i>0;i--)for(k=50;k>0;k--);}void delayus() //延时266us,防绕射波,延时时间不能太长,否则影响死区,使死区变大{uchar i;for(i=120;i>0;i--);}void delay10ms(){uchar i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}。
超声波测距程序

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;}。
超声波测距仪程序

void offmsd();
void main() //主函数
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
}
制作的超声波测距源程序
#include <REG2051.H>
#define k1 P3_4
#define csbout P3_5 //超声波发送
#define csbint P3_7 //超声波接收
P3=~digit&opto; //依次显示各位数
P1=~buffer; //显示数据送P1口
delay(20); //延时处理
P1=0xff; //P1口置高电平(关闭)
}
else timeToBuffer(); //将值转换成LED段码
offmsd();
scanLED(); //显示函数
if(s<sj2)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
else if(s<sj1)
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
超声波测距程序

//超声波测距程序#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准备接收数据,也就是检测忙信号,这点非常重要。
超声波三维测距程序.doc资料

//采用的芯片为STC15系列#include"reg51.h"#include "math.h"sfr INT_CLKO=0x8F;//外部中断与时钟输出控制寄存器sfr P_SW1= 0xA2; //外设功能切换寄存器1sfr AUXR = 0x8e; //辅助寄存器sfr T2H = 0xd6; //定时器2高8位sfr T2L = 0xd7; //定时器2低8位#define CCP_S0 0x10 //P_SW1.4#define CCP_S1 0x20 //P_SW1.5#define S1_S0 0x40 //P_SW1.6#define S1_S1 0x80 //P_SW1.7sfr CCON=0xD8; //PCA控制寄存器sbit CCF0=CCON^0; //PCA模块0中断标志sbit CCF1=CCON^1; //PCA模块1中断标志sbit CR=CCON^6; //PCA定时器运行控制位sbit CF=CCON^7; //PCA定时器溢出标志sfr CMOD=0xD9; //PCA模式寄存器sfr CL=0xE9; //PCA定时器低字节sfr CH=0xF9; //PCA定时器高字节sfr CCAPM0=0xDA; //PCA模块0模式寄存器sfr CCAP0L=0xEA; //PCA模块0捕获寄存器LOWsfr CCAP0H=0xFA; //PCA模块0捕获寄存器HIGHsfr CCAPM1=0xDB; //PCA模块1模式寄存器sfr CCAP1L=0xEB; //PCA模块1捕获寄存器LOWsfr CCAP1H=0xFB; //PCA模块1捕获寄存器HIGHsfr CCAPM2=0xDC; //PCA模块2模式寄存器sfr CCAP2L=0xEC; //PCA模块2捕获寄存器LOWsfr CCAP2H=0xFC; //PCA模块2捕获寄存器HIGHsfr PCA_PWM0=0xf2; //PCA模块0的PWM寄存器sfr PCA_PWM1=0xf3; //PCA模块1的PWM寄存器sfr PCA_PWM2=0xf4; //PCA模块2的PWM寄存器#define FOSC 11059200L //系统频率#define BAUD 115200 //串口波特率#define T0MS 65536-18000//定时18000us#define uchar unsigned char#define uint unsigned int#define X 20 //超声波传感器1到原点距离#define Y 20 //超声波传感器3到原点距离uint L1 = 0; //超声波传感器1到物体距离uint L2 = 0; //超声波传感器2到物体距离uint L3 = 0; //超声波传感器3到物体距离uint x = 0; //坐标变量(用于串口显示)uint y = 0;uint z = 0;sbit CSB_T1 = P0^0; //超声波1发送控制端口(控制光耦继电器)sbit CSB_R1 = P0^1; //超声波1接收控制端口(控制三极管)sbit CSB_T2 = P0^2; //超声波2发送控制端口(控制光耦继电器)sbit CSB_R2 = P0^3; //超声波2接收控制端口(控制三极管)sbit CSB_T3 = P0^4; //超声波3发送控制端口(控制光耦继电器)sbit CSB_R3 = P0^5; //超声波3接收控制端口(控制三极管)sbit LED = P1^2;uint count = 0; //定义计数变量uint distance = 0; //定义距离变量uchar *p; //定义指针(用于串口发送数据)uchar count1[16]; //定义数组,存放距离bit flag = 0; //定义标志位void Send_data(uchar *b);/****************************延时函数**************************//*函数原型:void delay(void)/*函数功能:延时/*输入参数:无/*输出参数:无/**********************************************************************/ void delay_us(uchar i){unsigned int j;for(;i>0;i--)for(j = 6;j>0;j--){;}}void delay_ms(uchar i){unsigned int j;for(;i>0;i--)for(j = 847;j>0;j--){;}}/****************************count1cle初始化函数**************************/ /*函数原型:void count1cle(void)/*函数功能:count1cle初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void count1cle(){uchar i;for(i = 0;i<16;i++){count1[i] = 0;}}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA0_Init(){ACC=P_SW1;ACC&=~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM0=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM0=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP0H=0x80; // 占空比控制CCAP0L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA1_Init(){ACC=P_SW1;ACC&= ~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM1=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM1=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP1H=0x80; // 占空比控制CCAP1L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************PWM0初始化函数**************************//*函数原型:void PCA_Init(void)/*函数功能:PWM初始化/*输入参数:无/*输出参数:无/**********************************************************************/void PCA2_Init(){ACC=P_SW1;ACC&=~(CCP_S0|CCP_S1);//CCP_S0=0 CCP_S1=0P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)CMOD=0x08; //选择PCA的时钟源为SYSCLK,使用外部晶振12MHz,PCA频率为46.875kHzCCAPM2=0x42; //CCAPM0是PCA0模块的寄存器0100 0010;ECOM0=1时,是打开比较器功能,PWM0=1时,允许CEX0脚用作PWM输出,即P1^3 PCA_PWM2=0x00; //把与CCAP0H和CCAP0L组成9位数的EPC0H和EPC0L置为0CL=0; //比较器上的计时赋初值,通过PCA得到的输入时钟自增,增满后自动重装CH=0;CCAP2H=0x80; // 占空比控制CCAP2L=0x80;CCON=0; //PCA控制寄存器,设置为0CR=0; //PCA计数开关为关,停止产生pwm波}/****************************INT0初始化函数**************************//*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/void INT0_Init(){INT1 = 1;IT0 = 1;//设置INT0为下降沿触发EX0 = 0;//不允许INT0中断EA = 1;//打开总中断}/****************************INT0中断函数**************************//*函数原型:void INT0(void)/*函数功能:INT0中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXINT0() interrupt 0{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// EX0 = 0;//不允许INT0中断}/****************************INT0初始化函数**************************/ /*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void INT1_Init(){INT1 = 1;IT1 = 1;//设置INT0为下降沿触发EX1 = 0;//不允许INT0中断EA = 1;//打开总中断}/****************************INT1中断函数**************************//*函数原型:void INT1(void)/*函数功能:INT1中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXINT1() interrupt 2{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// EX1 = 0;//不允许INT0中断}/****************************INT0初始化函数**************************//*函数原型:void INT0_Init(void)/*函数功能:INT0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void INT2_Init(){INT_CLKO&=0xEF;//(EX2 = 1)使能INT2中断EA = 1;//打开总中断}/****************************INT2中断函数**************************//*函数原型:void INT2(void)/*函数功能:INT2中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void EXIT2() interrupt 10{count = TH0;count = count<<8;count = count+TL0-47536;//记录从发送超声波到接受到超声波的时间flag = 1;TR0 = 0; //关T0中断// INT_CLKO&=0xEF;//(EX2 = 1)使能INT2中断}/****************************Timer0初始化函数**************************//*函数原型:void Timer0_Init(void)/*函数功能:Timer0初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void Timer0_Init(){// AUXR = 0x80; //timer0 work in 1T mode (没有这句,默认为传统51的定时) TMOD=0x01; //设置T0定时器的mode为模式1,处于计数模式TH0=T0MS>>8; //装入计数初值TL0=T0MS;EA = 1; //开中断使能ET0 = 1; //允许溢出TR0 = 0; //关T0中断}/****************************Timer0中断函数**************************/ /*函数原型:void Timer0(void)/*函数功能:Timer0中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ void Timer0() interrupt 1{TL0 = T0MS; //初始化Time0的低八位TH0 = T0MS >> 8; //初始化Time0的高八位flag = 1; //标志位置位count = 32;TR0 = 0; //关T0中断}/***************************串口初始化函数*****************************/ /*函数原型:void Serial_Init(void)/*函数功能:串口初始化/*输入参数:无/*输出参数:无/**********************************************************************/ void Serial_Init()//串口初始化函数{ACC = P_SW1;ACC&=~(S1_S0|S1_S1); //S1_S0=0 S1_S1=0P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)SCON = 0x40; //8位可变波特率T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值T2H = (65536 - (FOSC/4/BAUD))>>8;AUXR = 0x14; //T2为1T模式, 并启动定时器2AUXR |= 0x01; //选择定时器2为串口1的波特率发生器// ES = 1; //使能串口1中断// EA = 1; //开启全局中断}/****************************串口中断处理函数**************************/ /*函数原型:void Serial_Int(void)/*函数功能:串口中断处理/*输入参数:无/*输出参数:无/**********************************************************************/ //void Serial_Int() interrupt 4//{// ES = 0; //关串口中断,防止中断嵌套// if(TI) //如果是发送中断,则不做任何处理// {// TI = 0; //清除发送中断标志位// }// ES = 1; //开启串口中断//}/****************************发送数据函数***********************//*函数原型:void Send_data(unsigned char *b)/*函数功能:发送数据/*输入参数:unsigned char *b/*输出参数:无/**********************************************************************/ void Send_data(uchar *b){// ES = 0; //关串口中断for (b; *b!='\0';b++){SBUF = *b;while(TI!=1); //等待发送完成TI = 0; //清除发送中断标志位}// ES = 1; //开串口中断}/****************************距离测量函数***********************//*函数原型:void Distance(void)/*函数功能:计算物体距离/*输入参数:无/*输出参数:无/**********************************************************************/ void Distance_(){distance = (count/1000.0)*17;// distance = count;}void Coordinate(){x = (L2*L2-L1*L1+X*X)/(2.0*X);y = (L2*L2-L3*L3+Y*Y)/(2.0*Y);z = L1*L1+L3*L3-L2*L2-(x-X)*(x-X)-(y-Y)*(y-Y);z = sqrt(z);}/****************************主函数***********************//*函数原型:void main(void)/*函数功能:/*输入参数:无/*输出参数:无/**********************************************************************/ void main(){uchar circulation = 1;PCA0_Init();//PWM初始化PCA1_Init();//PWM初始化PCA2_Init();//PWM初始化INT0_Init();//INT0初始化INT1_Init();//INT0初始化INT2_Init();//INT0初始化Timer0_Init();//Timer0初始化Serial_Init();//串口初始化函数CSB_T1 = 0; //关闭超声波1发送控制端口CSB_R1 = 0; //关闭超声波1接收控制端口CSB_T2 = 0; //关闭超声波2发送控制端口CSB_R2 = 0; //关闭超声波2接收控制端口CSB_T3 = 0; //关闭超声波3发送控制端口CSB_R3 = 0; //关闭超声波3接收控制端口while(1){switch(circulation){//超声波2发,超声波1收,作为AP的距离case 1:{CSB_T2 = 1; //打开超声波2发送控制端口CSB_R1 = 1; //打开超声波1接收控制端口EX0 = 1; //允许外部中断0CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波// delay_ms(58);}break;//超声波2发,超声波3收,作为CP的距离case 2:{CSB_T2 = 1; //打开超声波2发送控制端口CSB_R3 = 1; //打开超声波3接收控制端口INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波}break;//超声波1发,超声波3收,作为BP的距离case 3:{CSB_T1 = 1; //打开超声波2发送控制端口CSB_R3 = 1; //超声波3接收控制端口INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CCAP1L=CCAP1H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波}break;//超声波1发,超声波1收,作为AP的距离case 5:{CSB_T1 = 1; //打开超声波1发送控制端口CCAP1L=CCAP1H=0x00; // PWM0占空比控制为0 CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0 CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(20); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波EX0 = 1; //允许外部中断0CSB_R1 = 1; //打开超声波1接收控制端口}break;//超声波2发,超声波2收,作为BP的距离case 6:{CSB_T2 = 1; //打开超声波2发送控制端口CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP2L=CCAP2H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波EX1 = 1; //允许外部中断0CSB_R2 = 1; //打开超声波3接收控制端口}break;//超声波3发,超声波3收,作为BP的距离case 7:{CSB_T3 = 1; //打开超声波2发送控制端口CCAP0L=CCAP0H=0x00; // PWM0占空比控制为0CCAP1L=CCAP1H=0x00; // PWM2占空比控制为0CR=1; //PCA计数开关为开,产生pwm波TR0 = 1; //开T0中断delay_us(18); //延时186us,等待8个超声波发送完成CR = 0; //PCA计数开关为关,停止产生pwm波INT_CLKO|=0x10;//(EX2 = 1)使能INT2中断CSB_R3 = 0; //关闭超声波3接收控制端口}break;}while(~flag); //等待接受超声波信号if(flag){if(count==32) //根据count情况计算距离,count = 0表示没有接收到返回信号,返回300给主机distance = 500; //没有测到距离,返回一个值给上位机elseDistance_();// if((circulation==1)||(circulation==5))// {// L1 = distance;// if(circulation==1)// {// if((L1!=500)&&(L1>12))// circulation = 4;// }// if(circulation==5)// {// if(L1<=12)// circulation = 0;// }// }// else if((circulation==2)||(circulation==7))// L3 = distance;// else if((circulation==3)||(circulation==6))// {// L2 = distance;// if((x==500)&&(y==500)&&(z==500)) //在有效范围内没有检测到物体,返还“未检测到物体!”// Send_data("未检测到物体!"); //将距离返还给上位机// else// {// Coordinate();// count1[0] = 'P'; //字符“P”// count1[1] = '('; //字符“(”// count1[2] = x/100+'0'; // 数据百位// count1[3] = x%100/10+'0'; // 数据十位// count1[4] = x%10+'0'; // 数据个位// count1[5] = ','; //字符“,”// count1[6] = y/100+'0'; // 数据百位// count1[7] = y%100/10+'0'; // 数据十位// count1[8] = y%10+'0'; // 数据个位// count1[9] = ','; //字符“,”// count1[10] = z/100+'0'; // 数据百位// count1[11] = z%100/10+'0'; // 数据十位// count1[12] = z%10+'0'; // 数据个位// count1[13] = ')'; //字符“)”// count1[14] = ' '; //字符“)”// count1[15] = '\0'; //字符“)”// p = count1;// Send_data(p); //将距离返还给上位机// }// }count1[0] = distance%1000/100+'0'; // 数据百位count1[1] = distance%100/10+'0'; // 数据十位count1[2] = distance%10+'0'; // 数据个位count1[3] = 'c'; //字符“c”count1[4] = 'm'; //字符“m”count1[5] = '\n'; //空格count1[6] = '\n'; //空格count1[7] = '\0'; //结束标准p = count1;Send_data(p); //将距离返还给上位机delay_ms(10); //延时,等待数据发送完成TH0=T0MS>>8; //装入计数初值TL0=T0MS;count1cle(); //存储数组清零count = 0; //count清零flag = 0; //标志位清零CSB_T1 = 0; //关闭超声波1发送控制端口CSB_R1 = 0; //关闭超声波1接收控制端口CSB_T2 = 0; //关闭超声波2发送控制端口CSB_R2 = 0; //关闭超声波2接收控制端口CSB_T3 = 0; //关闭超声波3发送控制端口CSB_R3 = 0; //关闭超声波3接收// circulation += 1;// if(circulation==4)// circulation = 1;// if(circulation==8)// circulation = 5;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
TMOD = 0x01; //定时器2初始化,设置为16位自动重装模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //开定时器2
EA = 1; //总中断使能
/* 参数描述 : 写入的字符串的地址指针 1602显示对应的地址 */
/* 返回值 : 无 */
/******************************************************************************/
/* 函数名称 : delayt */
/* 函数描述 : 延时函数 */
/* 函数名称 : display_char */
/* 函数描述 : 显示字符串函数 */
/* 输入参数 : point,address ቤተ መጻሕፍቲ ባይዱ */
uchar table3[]="Distance:";
uchar count;
/***********************************函数声明***********************************/
extern void initLCD();
extern void write_date(uchar date);
#define VELOCITY_30C 3495 //30摄氏度时的声速,声速V= 331.5 + 0.6*温度;
#define VELOCITY_23C 3453 //23摄氏度时的声速,声速V= 331.5 + 0.6*温度;
/************************************位定义************************************/
/******************************************************************************/
void Delay_xMs(unsigned int x)
{
unsigned int i,j;
for(i = 0;i < x;i++ )
long int distance=0; //距离变量
uchar table[]=" Welcome to ";
uchar table0[]=" chaoshengbo ";
uchar table1[]="There's no echo.";
uchar table2[]=" csbcj ";
/* 输入参数 : x */
/* 参数描述 : 延时时间数据 */
/* 返回值 : 无 */
/* 函数名称 : Alarm */
/* 函数描述 : 蜂鸣器发声函数 */
/* 输入参数 : t */
sbit INPUT = P3^2; //回声接收端口
sbit OUTPUT = P1^0; //超声触发端口
sbit Beep = P2^0 ; // 蜂鸣器
/********************************定义变量和数组********************************/
void Init_Parameter(void)
{
OUTPUT =1;
INPUT = 1;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 参数描述 : 延时时间 */
/* 返回值 : 无 */
/* 参数描述 : 发声的次数 */
/* 返回值 : 无 */
/******************************************************************************/
void display_char(uchar *point,uchar address)
{
uchar i;
write_com(0x80 + address);
for(i = 0;i < 16; i++)
{
/* 函数描述 : 初始化单片机函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
/* 函数描述 : 延时函数 */
/* 输入参数 : x */
extern void write_com(uchar com);
extern void delay(uint x);
/******************************************************************************/
/* 函数名称 : Delay_xMs */
/******************************************************************************/
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
}
/******************************************************************************/
/* 函数名称 : Init_Parameter */
超声波程序如下:
/**********************************包含头文件**********************************/
#include <reg51.h>
#include "1602.h"
/************************************宏定义************************************/
{
for(j = 0;j < 3;j++ )
{
;
}
}
}
/******************************************************************************/
/* 函数描述 : 初始化参数和IO口函数 */
/* 输入参数 : 无 */
/* 参数描述 : 无 */
/* 返回值 : 无 */
/******************************************************************************/
{
;
}
}
}
/******************************************************************************/
/* 函数名称 : Init_MCU */
void Alarm(uchar t)
{
uchar i;
for(i = 0;i < t;i++)
{
Beep = 1;
Delay_xMs(1000);
Beep = 0;
Delay_xMs(1000);
}
}
/******************************************************************************/