标题:
51单片机扫地机器人程序有问题
[打印本页]
作者:
小兔吃枣拼乎哩
时间:
2018-10-24 23:13
标题:
51单片机扫地机器人程序有问题
请求大佬帮忙看一下程序 程序废真的整不出来
我想的是这个小车可以直接用蓝牙遥控(用手机app操控)着走动 也可以按一下app上一个按键(参考程序的case5)可以自动清扫 加了驱动 最小系统 避障模块 就是程序整不了了 希望大佬们帮忙看一下 代码没有写完 如下:
#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit ZA1A=P1^0;
sbit ZA1B=P1^1;
sbit ZB1A=P1^2;
sbit ZB1B=P1^3;
sbit YA1A=P1^4;
sbit YA1B=P1^5;
sbit YB1A=P1^6;
sbit YB1B=P1^7;
sbit Trig = P3^2 ;
sbit Echo = P3^3 ;
uchar rev=0; //蓝牙接收缓存值
bit rok=0; //接收标志
/********************************************************************
* 名称 :qianjin()
* 功能 : 电机1、2启动,都是前进,整车表现为前进。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void qianjin(){
ZA1A=0;
ZA1B=1;
ZB1A=0;
ZB1B=1;
YA1A=0;
YA1B=1;
YB1A=0;
YB1B=1;
}
void houtui(){
ZA1A=1;
ZA1B=0;
ZB1A=1;
ZB1B=0;
YA1A=1;
YA1B=0;
YB1A=1;
YB1B=0;
}
void zuozhuan(){
ZA1A=1;
ZA1B=0;
ZB1A=1;
ZB1B=0;
YA1A=0;
YA1B=1;
YB1A=0;
YB1B=1;
}
void youzhuan(){
ZA1A=0;
ZA1B=1;
ZB1A=0;
ZB1B=1;
YA1A=1;
YA1B=0;
YB1A=1;
YB1B=0;
}
void tingche(){
ZA1A=0;
ZA1B=0;
ZB1A=0;
ZB1B=0;
YA1A=0;
YA1B=0;
YB1A=0;
YB1B=0;
}
void chaoshengbo ()
{
TR0=0; //定时器开关
TH0=0;
TL0=0;
Trig=0;
Echo=0;
Trig=1;
DelayUs2x(20);
Trig=0;
while(Echo==0); //等待Echo回波引脚变高电平
TR0=1; //定时器0开关打开
while(Echo); //等待
time=TH0*256+TL0; //*256是16位计数器的高8位和低八位之分.恢复成16位数的时候要*256。读取脉宽长度
S=time*0.0172; //(厘米)*0.0172,根据超声的声速,单片机的频率,得出来的一个系数.
if(S>400)S=400;
}
void bizhang() //避障功能
{
if(S<=10) //距离小于15CM
{
tingche(); //小车停止
zuozhuan();
delay(1000);
chaoshengbo();
szuo=s;
youzhuan(2000);
chaoshengbo();
syou=s;
zuozhuan(1000);
if(szuo>=syou){
zuozhuan();
delay(2000);
else if(szuo<syou){
youzhuan();
delay(2000);
}
}
}
else if(S>15) //距离大于,30CM往前走
qianjin();
}
void suiyuanqingsao(){
qianjin();
}
}
void COMM( void ) //到达某一位置后左右前后测距判断应该怎么走
{
chaoshengbo();//超声波测距如果还可以直行则直行,不能直行的话判断应该左转还是右转
{if(s>5){
qianjin();
delay(500);
zuoyouzhuanceju();
}
else if(){
tingche();
zuoyouzhaunceju();
}
}
void zuoyouzhuanceju()
{tingche();
zuozhuan();
delay(1000);//需要计算时间
chaoshengbo(); //启动超声波测距
S2=S;
youzhuan();//小车向右转180度
delay(2000);
chaoshengbo(); //启动超声波测距
S4=S;
zuozhuan();//测完距离后让小车回到原前进方向
delay(1000);
chaoshengbo() //启动超声波测距
S1=S;
if((S2<15)||(S4<15)) //只要左右各有距离小于15CM小车后退
{
houtui(); //后退
}
if(S2>S4)
{
youzhuan(); //车的左边比车的右边距离小 右转
delay(1000);
}
else
{
zuozhuan(); //车的左边比车的右边距离大 左转
delay(1000);
}
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50; //0101 000设置串行口控制寄存器sm0,sm1为01,即为工作方式1
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void gongneng()
{
switch(rev)
{
case '0': tingche(); break;
case '1': qianjin(); break;
case '2': houtui(); break;
case '3': zuozhuan(); break;
case '4': youzhuan(); break;
case ’5’:suiyuanqingsao();break;
default:break;
}
rok=0;
}
void main()
{
Com_Init();//初始化
while(1)//循环结构,选择函数控制小车的状态
{
if(rok)gongneng();
}
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
ES = 0;
if(RI) //当硬件接收到一个数据时,RI会置位
{
rev=SBUF;
RI = 0;//取消本次中断申请,方便进入下一次
rok=1;
}
ES = 1;
}
复制代码
作者:
星试试
时间:
2019-5-26 18:52
你好 请问你这个硬件设计里有几个电机啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1