超声波模块如何把数据传输给单片机

超声波模块的型号是HC-SR04,单片机型号是STC89C52... 超声波模块的型号是HC-SR04,单片机型号是STC89C52 展开
 我来答
栾祎君iM
推荐于2017-09-17 · 超过21用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:26.2万
展开全部
超声波与单片机之间的数据,并不是直接由超声波模块发送给单片机的,而是单片机通过超声波一个触发信号,从而得到超声波的响应,根据这个响应来计算距离。
可以给给你一个程序,这个程序同时测试了两个超声波,你可以根据情况选一个,删一个,显示采用的是数码管显示,可以根据自己情况改写。
#include <reg52.H> //器件配置文件
#include <intrins.h>

unsigned int time=0;
unsigned int times=0;
unsigned long S=0;

sbit dula=P1^0;
sbit wela=P1^1;

sbit echo =P1^3; //echo
sbit tring =P1^2; //trig

sbit echo2 = P1^5;
sbit tring2 = P1^4;
sbit beep = P3^6;
bit stat = 1;
unsigned int beep_cnt = 0;
unsigned char flag = 0;
unsigned char qianwei1,baiwei1,shiwei1,gewei1;
unsigned char qianwei2,baiwei2,shiwei2,gewei2;
unsigned char aa = 0;
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
};
unsigned char leddatadot[] = {
0xbf, //"0"
0x86, //"1"
0xdb, //"2"
0xcf, //"3"
0xef, //"4"
0xed, //"5"
0xfd, //"6"
0x87, //"7"
0xFF, //"8"
0xEF, //"9"
};

void Display(unsigned long num);

void Conut(void){
unsigned short aa;
aa = 65535;
time= aa * times + TH0 * 256 + TL0;
times = 0;
TH0=0;
TL0=0;
S = (time * 1.845) / 100;
}

void init(){
TMOD=0x11;
TH0=0;
TL0=0;
ET0=1;
TR0=0;
EA=1;
}
void delay(unsigned char z){
int i, j;
for(i = 0; i < z; i++)
for(j = 0; j < 210; j++)
;
}
void start(){
if(flag % 2){
TH0 = 0;
TL0 = 0;
tring = 1;
delay(10);
tring = 0;
}else{
TH0 = 0;
TL0 = 0;
tring2 = 1;
delay(10);
tring2 = 0;
}
}
void beep_act(unsigned int a){
unsigned char i;

if(a < 40){
for(i = 0; i < 30; i++){
beep = 1;
delay(1);
beep = 0;
delay(1);
}
}else
if(a < 140){
for(i = 0; i < 3; i++){
beep = 1;
delay(1);
beep = 0;
delay(1);
}
}

}
void main(void){
init();
while(1){
start();
if(flag % 2){
while(!echo);
TR0=1;
while(echo);
TR0=0;
}else{
while(!echo2);
TR0=1;
while(echo2);
TR0=0;
}
Conut();
Display(S);
if(flag % 2)
beep_act(S);
flag++;
}
}
void Display(unsigned long num){
if(!(flag % 2)){
qianwei1 = num / 1000;
baiwei1 = (num / 100) % 10;
shiwei1 = (num / 10) % 10;
gewei1 = num % 10;
}else{
qianwei2 = num / 1000;
baiwei2 = (num / 100) % 10;
shiwei2 = (num / 10) % 10;
gewei2 = num % 10;
}
for(aa = 0; aa < 20; aa++){
wela=1;
P2=0xfe;
wela=0;
dula=1;
P0 = leddata[qianwei2];
dula=0;
delay(1);

wela=1;
P2=0xfd;
wela=0;
dula=1;
P0=leddatadot[baiwei2];
dula=0;
delay(1);

wela=1;
P2=0xfb;
wela=0;
dula=1;
P0 = leddata[shiwei2];
dula=0;
delay(1);

wela=1;
P2=0xf7;
wela=0;
dula=1;
P0=leddata[gewei2];
dula=0;
delay(1);
//behind led
wela=1;
P2=0xef;
wela=0;
dula=1;
P0 = leddata[qianwei1];
dula=0;
delay(1);

wela=1;
P2=0xdf;
wela=0;
dula=1;
P0=leddatadot[baiwei1];
dula=0;
delay(1);
wela=1;
P2=0xbf;
wela=0;
dula=1;
P0 = leddata[shiwei1];
dula=0;
delay(1);

wela=1;
P2=0x7f;
wela=0;
dula=1;
P0=leddata[gewei1];
dula=0;
delay(1);
}
}
/********************************************************/
void zd0() interrupt 1 {
TH0 = 0;
TL0 = 0;
times++;
}
追问
传给单片机的时模拟信号还是数字信号
追答
不是模拟信号也不是数字信号,是一个由底到高电平的跳变,单片机检测到这个跳变后,根据自己所记录的时间来计算距离。
查晓筠0i5
2015-06-08 · TA获得超过2753个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:5085万
展开全部
是算声波返回时间吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式