标题:
51单片机小车测距避障并调速的源码
[打印本页]
作者:
51dasttwbd
时间:
2018-5-22 21:32
标题:
51单片机小车测距避障并调速的源码
简单的编程 ,使用51单片机STC89C52进行编程, 期间用到1个超声波HC-SR04, 1个电机驱动模块L298N 实现了 简单的避障和 调速的功能,
源程序如下:
#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 = P2^0;
sbit Echo1 = 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 long S = 0; //距离
bit flag = 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 Go_forward()
{
push_val_left=4;
push_val_right=4;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 0;
}
void Go_back()
{
push_val_left=4;
push_val_right=4;
L298N_INA = 1;
L298N_INB = 0;
L298N_INC = 0;
L298N_IND = 1;
}
void Go_left()
{
push_val_left=3;
push_val_right=3;
L298N_INA = 0;
L298N_INB = 1;
L298N_INC = 1;
L298N_IND = 1;
}
/*
void Go_right()
{
push_val_left=3;
push_val_right=3;
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 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 timer1() interrupt 3
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void timer0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
void CSB_module()
{
Trlg1=1;
Delay10us_CSB(10);
Trlg1=0;
}
/*计算超声波所测距离并显示*/
void Conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(float)(time*1.085)*0.17; //算出来是MM
if((S>=7000)||flag==1) //超出测量范围
{
flag=0;
}
}
void bizhang()
{
if(S > 100)//设置避障距离(单位毫米)
{
Go_forward();
}
else
{
Stop();
delay(20);
Go_back();
delay(30);
Go_left();
}
}
void main()
{
Stop();
delay(1000);//延时1秒
TMOD |= 0x20;//定时器1工作模式2,8位自动重装。用于产生PWM
TMOD |= 0x01;//定时器0工作模块1,16位定时模式。T0用测ECH0脉冲长度
TH1 = 220; //
TL1 = 220; //100HZ T1
TH0 = 0;
TL0 = 0;//T0,16位定时计数用于记录ECHO高电平时间
ET1 = 1;//允许T1中断
ET0 = 1;//允许T0中断
TR1 = 1;//启动定时器1
EA = 1;//启动总中断
while(1)
{
CSB_module(); //启动超声波测距
while(!Echo1); //当(ECHO信号回响)为零时等待
TR0=1; //开启计数
while(Echo1);
TR0=0; //关闭计数
Conut(); //计算距离
bizhang(); //避障
delay(30);
}
}
复制代码
全部资料51hei下载地址:
pwm调速小车避障.rar
(24.86 KB, 下载次数: 148)
2018-5-22 21:32 上传
点击文件名下载附件
源程序
下载积分: 黑币 -5
作者:
99九十九
时间:
2018-6-25 15:50
能测速吗
作者:
123321gjx
时间:
2019-4-13 12:32
终于靠谱了
作者:
Leslieyang
时间:
2019-5-26 23:16
有没有使用51单片机STC89C51进行编程的
作者:
Leslieyang
时间:
2019-5-26 23:29
哥,能不能仔细解释下,许多地方看不懂
作者:
winkle
时间:
2019-7-16 11:26
这个可读性不错
作者:
嘟嘟胖子
时间:
2019-7-17 13:46
备注很详细,资料不错,学习一下。
作者:
质壁分离
时间:
2020-4-27 22:36
本帖最后由 质壁分离 于 2020-4-27 23:06 编辑
很详细,对于学习很有帮助,谢谢。
作者:
3146768670
时间:
2021-1-30 16:12
这个资料不错奥,谢谢楼主
作者:
3146768670
时间:
2021-1-30 16:13
Leslieyang 发表于 2019-5-26 23:16
有没有使用51单片机STC89C51进行编程的
这个也可以用
作者:
katv0718
时间:
2021-2-9 11:28
收下研究了,谢谢!
作者:
xtmaaa
时间:
2021-10-20 10:50
有红外的吗楼主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1