超声波测距串口输出

超声波测距模块:

(1):采用IO口TRIG触发测距,给至少10us的高电平信号;

(2):模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3):有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。

超声波测距串口输出程序源代码

/*******************超声波测距串口输出*********************

* 单片机:51单片机

* 开发环境:keil

* 名称:超声波测距串口输出

* 说明:波特率9600

注意:用杜邦线将超声波模块的VCC接开发板5V对外供电接口

用杜邦线将超声波模块的GND接开发板GND

用杜邦线将超声波模块的Trig接单片机的P1.5

用杜邦线将超声波模块的Echo接单片机的P1.6

/************************包含头文件************************/

#include <reg52.h>

/**************************宏定义**************************/

#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;

#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;

/**************************位定义**************************/

//FOSC = 11.0592MHz,12T模式,SMOD=0

#define reload_count_1200bps 0xe8

#define reload_count_2400bps 0xf4

#define reload_count_4800bps 0xfa

#define reload_count_9600bps 0xfd

sbit ECHO = P1^6; //回声接收端口

sbit TRIG = P1^5; //超声触发端口

sbit BEEP = P2^3; //蜂鸣器 

/**********************定义变量和数组**********************/

long int distance = 0; //距离变量

unsigned char count;

void Delay5Ms(void);

void delay(int In,int Out);

unsigned char zifuchuan[]="SSLV WELCOME!"; //待显示字符。

unsigned char juli[]="距离为: . 厘米"; //待显示字符。

void Delay_xMs(unsigned int x)

{

unsigned inti,j;

for(i=0;i<x;i++)

{for(j=0;j<3;j++){;}}

}

void delayt(unsigned int x)

{

unsigned charj;

while(x-->0)

{for(j=0;j<125;j++){;}}

}

void delay(int In,int Out)

{

int i,j;

for(i=0;i<In;i++)

{for(j=0;j<Out;j++){;}}

}

void serial_port_initial(char TH,char TL)

{

SCON=SCON|0x50; //0101,0000 8位可变波特率,无奇偶校验位

TMOD=TMOD|0x20; //0011,0001 设置定时器1为8位自动重装记数器

PCON=PCON|0x00;

TH1=TH; //设置定时器1自动重装数

TL1=TL;

ES=1; //允许串口中断

EA=1; //开总中断

TR1=1; //开定时器1

}

void send_UART(unsigned char i) //发送一节函数

{

ES=0; //关串口中断

TI=0; //清零串口发送完成中断请求标志

SBUF=i;

while(TI==0); //等特数据传送

TI=0; //清除数据传送标志

ES=1;

}

void sendc(unsigned char * pd)

{

while((*pd)!='\0') //发送字符串,直到遇到0才结束

{

send_UART(*pd); //发送一个字符

pd++; //移动到下一个字符

}

}

void Alarm(unsigned char t)

{

unsigned chari;

for(i=0;i<t;i++)

{

BEEP=0;delay(10,1000);

BEEP=1;delay(10,1000);

}

}

void Init_timer(void)

{

TMOD=TMOD|0x01; //定时器0初始化,设置为16位自动重装模式

TL0=0x66;

TH0=0xfc; //1ms

ET0=1; //开定时器0

EA=1; //总中断使能

}

void Init_Parameter(void)

{TRIG=1;ECHO=1;count=0;distance=0;}

void display(int number)

{

unsigned charb,c,d,e;

b=(number/1000);

c=(number/100)%10;

d=(number/10)%10;

e=number%10;

juli[7]=0x30+b;

juli[8]=0x30+c;

juli[9]=0x30+d;

juli[11]=0x30+e;

sendc(juli);

}

void Trig_SuperSonic(void) //出发声波

{TRIG=1;delayt(1);TRIG=0;}

void Measure_Distance(void)

{

unsigned charl;

unsigned inth,y;

TR0=1;

while(ECHO){;}

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 =SPEED_30C * distance / 20000;

}

void main(void)

{

serial_port_initial(reload_count_9600bps,reload_count_9600bps);

Alarm(2);

sendc(zifuchuan);

Init_timer();

Init_Parameter();

while(1)

{

Trig_SuperSonic(); //触发超声波发射

while(ECHO ==0) //等待回声

{;}

Measure_Distance(); //计算脉宽并转换为距离

display(distance); //显示距离

Init_Parameter(); // 参数重新初始化

delayt(100); //延时,两次发射之间要至少有10ms间隔

}

}

void timer0 (void) interrupt 1

{

TF0=0;TL0=0x66;TH0=0xfc;count++;

if(count==18) //超声波回声脉宽最多18ms

{TR0=0;TL0=0x66;TH0=0xfc;count=0;}

}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式硬件与代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值