标题:
二路超声波测距的单片机源码
[打印本页]
作者:
51dasttwbd
时间:
2018-5-28 11:08
标题:
二路超声波测距的单片机源码
用2哥超声波 进行 避障 功能
源程序 如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ENA_pwm = P2^6; //PWM信号端
sbit ENB_pwm = P2^7; //PWM信号端
sbit L298N_INA = P1^0;
sbit L298N_INB = P1^1;
sbit L298N_INC = P1^2;
sbit L298N_IND = P1^3;
sbit Trlg1 = P3^1;
sbit Echo1 = P3^2;
sbit Trlg2 = P2^0;
sbit Echo2 = P2^1;
unsigned char pwm_val_left =0; //变量定义
unsigned char pwm_val_right =0;
unsigned char push_val_left =0;// 左电机占空比N/10
unsigned char push_val_right=0;// 右电机占空比N/10
unsigned int time = 0; //测距时间
unsigned int timer = 0; //调速时间
unsigned long S1 = 0; //距离
unsigned long S2 = 0; //距离
void delay(uint z) //毫秒级延时
{
uint x,y;
for(x = z; x > 0; x--)
{
for(y = 114; y > 0 ; y--);
}
}
void Delay10us_CSB(uchar i) //10us延时函数 超声波模块使用
{
uchar j;
do
{
j = 10;
do
{
_nop_();
_nop_();
}
while(--j);
}
while(--i);
}
void pwm_out_left_moto(void)
{
if(pwm_val_left<=push_val_left)
ENA_pwm=1;
else
ENA_pwm=0;
if(pwm_val_left==10) // 0~10 , 0最小,10最大
pwm_val_left=0;
}
void pwm_out_right_moto(void)
{
if(pwm_val_right<=push_val_right)
ENB_pwm=1;
else
ENB_pwm=0;
if(pwm_val_right==10) // 0~10 , 0最小,10最大
pwm_val_right=0;
}
/*定时器1中断输出PWM信号*/
void time1() interrupt 3
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
timer++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void Go_forward()
{
push_val_left=6;
push_val_right=6;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 0;
}
void Go_back()
{
push_val_left=6;
push_val_right=6;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 1;
}
void Go_left()
{
push_val_left=5;
push_val_right=5;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 1;
}
void Go_right()
{
push_val_left=5;
push_val_right=5;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
void Stop()
{
L298N_INA = 0;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 0;
}
void CSB1_module()
{
Trlg1=1;
Delay10us_CSB(10);
Trlg1=0;
}
void CSB2_module()
{
Trlg2=1;
Delay10us_CSB(10);
Trlg2=0;
}
/*计算超声波所测距离并显示*/
void Conut1()
{
while(!Echo1); //当(ECHO信号回响)为零时等待
TR0=1; //开启计数
while(Echo1);
TR0=0; //关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(float)(time*1.085)*0.17; //算出来是MM
}
void Conut2()
{
while(!Echo2); //当(ECHO信号回响)为零时等待
TR0=1; //开启计数
while(Echo2);
TR0=0; //关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(float)(time*1.085)*0.17; //算出来是MM
}
void bizhang()
{
CSB1_module();
Conut1();
CSB2_module();
Conut2();
if(S1<150 )//设置避障距离(单位毫米)
{
Stop();
delay(30);
Go_back();
delay(50);
if(S2<150)
{
Stop();
delay(30);
Go_right();
}
else
{
Go_back();
delay(50);
Go_left();
}
}
else if(S1>150)
{
if(S2>150)
{
Go_forward();
}
else
{
Stop();
delay(30);
Go_right();
}
}
}
void main()
{
Stop();
delay(1000);//延时1秒
TMOD |= 0x11;//定时器1工作模式2,8位自动重装。用于产生PWM
TMOD |= 0x01;//定时器0
TH1=(65536-10)/256; //100US定时
TL1=(65536-10)%256;
TH0 = 0;
TL0 = 0;//T0,16位定时计数用于记录ECHO高电平时间
ET1 = 1;
ET0 = 1;//允许T0中断
TR1 = 1;//启动定时器1
EA = 1;//启动总中断
while(1)
{
bizhang(); //避障
delay(30);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1