标题: 单片机超声波红外接收控制小车程序 测量距离、红外控制、自动巡航 [打印本页]
作者: 1111DADADA 时间: 2020-1-2 18:15
标题: 单片机超声波红外接收控制小车程序 测量距离、红外控制、自动巡航
*
* 程序 名 : 超声波HY-SRF05测距、红外接收控制小车
* 程序功能 : 测量距离、红外控制、自动巡航
* 备注 : 130直流电机、L298N电机驱动、HY-SRF05超声波测距模块、红外收发模块
* 作者 : 1111ADADAD
*******************************************************************************/
// --头文件声明 --//
#include<reg51.h>
#include <intrins.h>
//--声明超声波引脚对应--//
sbit TRIG=P3^7; //TRIG是触发信号
sbit ECHO=P3^6; //ECHO是测距的持续信号
//--声明电机驱动引脚对应--//
sbit ZUO1 =P2^6; //左转控制口1
sbit ZUO2 =P2^7; //左转控制口2
sbit YOU1 =P1^3; //右转控制口1
sbit YOU2 =P1^4; //右转控制口2
//--声明蜂鸣器驱动引脚对应--//
sbit BEE =P2^1; //蜂鸣器控制引脚
//--定义全局变量--//
unsigned long S=0; //距离初始化
unsigned int time=0; //超声波往返时间寄存变量
unsigned char receiveData; //用来保存红外模块串口接收的数据
unsigned int flag=0;//运动模式转动方向标志
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时10ms函数
void system_Ini();//定时器系统、中断初始化函数
void Conut(void);//距离计算函数
void movemode();//选择运动模式
void StartModule(); //采集信号初始化函数
void UsartConfiguration(); //红外串口函数
void redreceive(); //红外遥控信息接收函数
void qianjin();//控制电机前进
void houtui();//控制电机后退
void houtui3s(); //控制电机后退3s
void lefturn1s(); //控制电机左转1s
void zuozhuan();//控制电机左转
void righturn1s(); //控制电机右转1s
void youzhuan();//控制电机右转
void pause(); //控制电机停止
void Bee();//蜂鸣器响一声
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
*******************************************************************************/
void main(void)
{
UsartConfiguration(); //串口函数初始化
system_Ini(); //定时器系统、中断初始化
pause(); //小车停止
BEE=0;
while(1) //进入红外控制死循环
{
redreceive(); //接收红外信息
if ( receiveData == 24) //按键2按下
{
Bee();//蜂鸣器响一声
while( receiveData != 28 ) //当按键5没有按下时,一直前进,下同
{
qianjin(); //小车前进
redreceive(); //前进的同时,持续进行是否有红外按键5——停止信号输入的扫描,下同
}
pause(); //停止
Bee();//蜂鸣器响一声
}
else if( receiveData == 82) //按键8按下
{
Bee();//蜂鸣器响一声
while( receiveData != 28 )
{
houtui(); //后退
redreceive();
}
pause(); //停止
Bee();//蜂鸣器响一声
}
else if( receiveData == 8) //按键4按下
{
Bee();//蜂鸣器响一声
lefturn1s(); //左转1s
receiveData=0; //红外接收变量清零
}
else if( receiveData == 90) //按键6
{
Bee();//蜂鸣器响一声
righturn1s(); //右转1s
receiveData=0; //红外接收变量清零
}
else if (receiveData == 9) //按键EQ,自动巡航,遇见障碍物过近,自动左转
{
Bee();//蜂鸣器响一声
while( receiveData != 28 )
{
StartModule(); //启动采集信号初始化模块,即进行一次数据采集,TRIG每隔一段时间输出一次高电平触发信号
while(!ECHO); //当ECHO为0时等待信号到来,TRIG发出一段大于10us的高电平后,超声波模块会进行发送8段40khz周期电平
//然后检测回波信号,回波信号脉宽与ECHO信号高电平持续时间成正比,ECHO持续时间*声速再除以2,
//结果即为距离。此时为等待RX产生高电平,一旦产生后,后面定时器即开始计数,
TR0=1; //打开定时器0,开启计数
while(ECHO); //当ECHO为1时计数进入循环等待,ECHO高电平不结束,计时不停止,一旦结束
TR0=0; //关闭定时器0,停止计数
Conut(); //通过计数来的时间在距离计算函数中计算距离S
movemode(); //选择运动模式
}
pause(); //停止
}
else continue; //未接收到红外信息时,继续从头循环等待
}
}
/*******************************************************************************
* 函 数 名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
*******************************************************************************/
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 :system_Ini
* 函数功能 :定时器T0系统/中断初始化
/******************************************************************************/
void system_Ini(void)
{
TH0=0;
TL0=0;
TMOD=0x21; //设T0为方式1
ET0=1; //允许T0中断
EA=1; //开启总中断
}
/*******************************************************************************
* 函 数 名 : Conut
* 函数功能 : 测量超声波距离S
*******************************************************************************/
void Conut(void)
{
time=TH0*256+TL0; //时间等于高位信息+低位信息的和,读取测量得到的时间,单位是微秒,是超声波发送出去到反射回来的时间.
TH0=0;
TL0=0; //计算完成后,初始化定时器高低位信息
S=time*0.017; //计算超声波距离
}
/*******************************************************************************
* 函 数 名 : movemode
* 函数功能 : 选择运动模式
*******************************************************************************/
void movemode()
{
if(S<8) //如果距离小于8CM,则
{
if(flag>=0&&flag<=2)
{
lefturn1s();//左转1s
flag=flag+1;
}
else if(flag==3||flag==7)
{
houtui3s();//后退3s
flag=flag+1;
}
else if(flag>=4&&flag<=6)
{
righturn1s(); //右转1s
flag=flag+1;
}
else //标志位清零
flag=0;
}
else //如果距离大于8CM,则
{
redreceive(); //接收红外信息
qianjin(); //小车持续前进
}
}
/***********************************************************
* 函 数 名 :StartModule()
* 函数功能 :超声波采集信号初始化函数
/**********************************************************/
void StartModule() //启动模块
{
TRIG = 1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRIG = 0;
}
/*******************************************************************************
* 函 数 名 :UsartConfiguration()
* 函数功能 :设置红外接收串口
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50;//设置为工作方式1
TMOD=0X20;//设置计数器工作方式2
PCON=0X80;//波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800
TL1=0XF3;
TR1=1;//打开计数器
}
/*******************************************************************************
* 函 数 名 : redreceive()
* 函数功能 : 红外接收
*******************************************************************************/
void redreceive()
{
if(RI == 1) //查看红外是否接收到数据,如果接受到
{
receiveData = SBUF;//读取数据,存至变量receiveData
RI = 0;//清除串口接收标志位
}
}
/*******************************************************************************
* 函 数 名 : qianjin
* 函数功能 : 控制电机前进
*******************************************************************************/
void qianjin()
{
ZUO1=1;ZUO2=0;
YOU1=1;YOU2=0; //前进
}
/*******************************************************************************
* 函 数 名 : houtui
* 函数功能 : 控制电机后退
*******************************************************************************/
void houtui()
{
ZUO1=0;ZUO2=1;
YOU1=0;YOU2=1; //后退
}
/*******************************************************************************
* 函 数 名 : houtui3s
* 函数功能 : 控制电机后退3s
*******************************************************************************/
void houtui3s()
{
unsigned char a,b,c=20; //后退3秒钟=
ZUO1=0;ZUO2=1;
YOU1=0;YOU2=1; //左转
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}
}
pause();
}
/*******************************************************************************
* 函 数 名 : void lefturn1s()
* 函数功能 : 控制电机左转1s
*******************************************************************************/
void lefturn1s()
{
unsigned char a, b,c=5;
ZUO1=0;ZUO2=0;
YOU1=1;YOU2=0; //左转
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}
}
pause();
}
/*******************************************************************************
* 函 数 名 : zuozhuan
* 函数功能 : 控制电机左转
*******************************************************************************/
void zuozhuan()
{
ZUO1=0;ZUO2=0;
YOU1=1;YOU2=0; //左转
redreceive();
}
/*******************************************************************************
* 函 数 名 : void righturn1s()
* 函数功能 : 控制电机右转1s
*******************************************************************************/
void righturn1s()
{
unsigned int a, b,c=5; //右转1秒钟
ZUO1=1;ZUO2=0;
YOU1=0;YOU2=0; //右转
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}
}
pause(); //电机停止
}
/*******************************************************************************
* 函 数 名 : youzhuan
* 函数功能 : 控制电机右转
*******************************************************************************/
void youzhuan()
{
ZUO1=1;ZUO2=0;
YOU1=0;YOU2=0; //右转
redreceive();
}
/*******************************************************************************
* 函 数 名 : pause
* 函数功能 : 控制电机停止
*******************************************************************************/
void pause()
{
ZUO1=0;ZUO2=0;
YOU1=0;YOU2=0; //电机停止
}
/*******************************************************************************
* 函 数 名 : Bee
* 函数功能 : 蜂鸣器响一声
*******************************************************************************/
void Bee()
{
BEE=1;
Delay10ms(200);
BEE=0; //蜂鸣器响一声
}
作者: chenyucy72 时间: 2022-6-4 10:53
老师好,我下载学习先了,不过现在还看不懂,谢谢
作者: 傻到不知所措 时间: 2022-11-20 16:47
膜拜大佬,成功借鉴代码学习了超声波!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |