专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
通过超声波测距
2019-03-24 16:59
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
13614
2
1297
想用超声波实现避障,一共使用三个超声波——前左右各一个。超声波模块是hc-sr04,目前的问题应该是测距程序没有使用,想求助一下各位大佬,帮忙看下
#include<reg52.h>
#include <intrins.h>
sbit ECHO_L= P2^1; //超声波接口定义
sbit TRIG_L = P2^0; //超声波接口定义
sbit ECHO_R = P2^7; //超声波接口定义
sbit TRIG_R = P2^6;
sbit ECHO_b=P2^4;
sbit TRIG_b=P2^3; //超声波接口定义
#define dianji_pwm P2^2 //PWM信号端
sbit Sevro_moto_pwm= P1^7 ;
sbit IN1=P2^0;//电机控制
sbit IN2=P2^1;
sbit ENA=P2^2;
bit Right_moto_stop=1;
#define dianji_go {IN1=0,IN2=1,ENA=1;} //电机向前走
#define dianji_back {IN1=1,IN2=0,ENA=1;} //电机向后走
#define dianji_Stop {ENA=0;} //电机停转
unsigned char pwm_val_dianji =0;//变量定义
unsigned char push_val_dianji =0;//电机占空比N/20
unsigned char pwm_val_duoji= 0;//变量定义
unsigned char push_val_duoji =15;//舵机归中,产生约,1.5MS 信号
unsigned int time;
unsigned int timer;
float S1;
float S2;
float S3;
unsigned int flag;
unsigned int time=0; //时间变量
unsigned int timer=0; //延时基准变量
unsigned char timer1=0; //扫描时间变量
void delay(unsigned int k) //延时函数 11.059mhz下约10ms
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
void delay_1ms(unsigned char x) //1ms延时函数100ms以内可用
{
unsigned char i;
while(x--)
for(i=124;i>0;i--);
}
void Delay40us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 15;
while (--i);
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Conut1(void) //计算距离
{
TRIG_L= 1; //拉高超声波模块触发IO
Delay40us();// 延时40us
TRIG_L= 0; //拉低超声波模块触发IO
while(ECHO_L==0);//等待超声波模块输出IO拉高
TR0 = 1; //开启定时器计时
while(ECHO_L==1); //等待超声波模块输出IO拉低
TR0 = 0;
time=(TH0*256+TL0);
S1=time*0.170;
TH0=0;
TL0=0;
}
void Conut2(void) //计算距离
{
TRIG_R= 1; //拉高超声波模块触发IO
Delay40us();// 延时40us
TRIG_R= 0; //拉低超声波模块触发IO
while(ECHO_R==0);//等待超声波模块输出IO拉高
TR0 = 1; //开启定时器计时
while(ECHO_R==1); //等待超声波模块输出IO拉低
TR0 = 0;
time=(TH0*256+TL0);
S2=time*0.170;
TH0=0;
TL0=0; //算出来是CM
}
void Conut3(void) //计算距离
{
TRIG_b= 1; //拉高超声波模块触发IO
Delay40us();// 延时40us
TRIG_b= 0; //拉低超声波模块触发IO
while(ECHO_b==0);//等待超声波模块输出IO拉高
TR0 = 1; //开启定时器计时
while(ECHO_b==1); //等待超声波模块输出IO拉低
TR0 = 0;
time=(TH0*256+TL0);
S3=time*0.170;
TH0=0;
TL0=0; //算出来是CM
}
/*调节push_val_duoji的值改变舵机角度,占空比 */
void pwm_Servomoto(void)
{
if(pwm_val_duoji<=push_val_duoji)
Sevro_moto_pwm=1;
else {Sevro_moto_pwm=0;}
if(pwm_val_duoji>=200)
pwm_val_duoji=0;
}
/*调节电机占空比*/
void pwm_out_dianji(void)
{
if(pwm_val_dianji<=push_val_dianji)
{
ENA=1;
}
else
{
ENA=0;
}
if(pwm_val_dianji>=20)
pwm_val_dianji=0;
else
{
ENA=0;
}
}
void COMM(void)
{
Conut1();
Conut2();
Conut3();
if(S3<20)
{
ENA=0;;
if(S1<10&&S2>10) flag=0;
if(S2<10&&S1>10) flag=1;
if(S1<10&&S2<10) flag=2;
if(S2>10&&S1>10) flag=3;
switch(flag)
{
case 0 :push_val_duoji=17; break;
case 1 :push_val_duoji=11; break;
case 2 :push_val_duoji=14; break;
case 3 :push_val_duoji=14; break;
default :push_val_duoji=14; break;
}}
}
void COMM1()
{
}
/***************************************************/
void main(void)
{
TMOD=0X11;
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
TR1= 1;
TH0=0;
TL0=0;
EA=1;
EX0=1;
EX1=1;
ET1=1;
push_val_duoji=14; //舵机归中
while(1) //无限循环
{
COMM();
}
}
///*TIMER1中断服务子函数产生PWM信号*/
void timer0()interrupt 1
{
}
void time1()interrupt 3
{
TH1=(65536-100)/256; //100US定时
TL1=(65536-100)%256;
timer++; //定时器100US为准。在这个基础上延时
pwm_val_duoji++;
pwm_out_dianji();
pwm_Servomoto();
}
复制代码
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
xuezehui
1楼-- · 2019-03-24 22:03
精彩回答 2 元偷偷看……
加载中...
Li_Lei
2楼-- · 2019-03-25 01:39
好不错
加载中...
一周热门
更多
>
相关问题
相关文章
基于51单片机的计算器设计
0个评论
51单片机300个proteus仿真实例下载
0个评论
51单片机 蜂鸣器
0个评论
51单片机驱动RC522模块
0个评论
基于51单片机的指纹密码锁
0个评论
AT89C51单片机制作简易密码锁
0个评论
51单片机汇编语言计数器
0个评论
51单片机精确延时设计
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>