找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1145|回复: 4
打印 上一主题 下一主题
收起左侧

大佬帮忙看一下单片机程序,蓝牙小车不能加上超声波避障的功能

[复制链接]
跳转到指定楼层
楼主
ID:967138 发表于 2021-9-19 18:25 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//芯片为stc89c52.有三个定时器T0T1T2
T0分给了超声波测距使用,T1给舵机的pwm调速使用,t2定时器给蓝牙使用。
自动避障代码单独调试的时候可以正常运行
t2蓝牙小车单独使用的时候也同上
我把两者合到一块(将自动避障的主函数改成了一个我自己命名的函数,蓝牙小车的哪一块正常为主函数,将这个我自己命名的函数放在蓝牙的stwich函数的case之中)就发生了故障,故障一般有两种情况,。都不能正常运行,要么就是舵机不能动了,要么就是蓝牙没用了,小车在自己动。
//超声波自动避障的独立代码模块
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit in1=P1^0;//in1,in2控制左电机
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右电机
sbit in4=P1^3;
sbit Echo=P2^1;        //超声波的ECHO口,发射一个超声波
sbit Trig=P2^2;        //超声波的TRIG口,接受返回超声波
sbit duoji=P2^0;//舵机信号口
uint zbjl,qmjl,ybjl;//左边距离,前面距离,右边距离
int S,i;//测算距离
uint shijian,time,jishu;
int csbceju()//超声波测距                        
  {        TH0=0x00;//初始化定时器
    TL0=0x00;
          S=0;  //初始化
           Trig=0;
                Echo=0;
                _nop_();//延迟1us
    Trig=1;//给Trig 10us的高电平脉冲信号
                for( i=0;i<12;i++)
                {
          _nop_();
                }//12us
                Trig=0;//触发超声波
    while(!Echo);            //等待高电平
    TR0=1;                //开启计数
    while(Echo);            //等待低电平
    TR0=0;                //关闭计数
    time=TH0*256+TL0;//通过超声波往返的时间计算距离 距离=往返时间*1.7
    S=(time*1.7)/100;//计算cm      
                Echo=0;
    TH0=0x00;
    TL0=0x00;
                return S;//返回一个最终结果
  }
void yanchi(uchar s)
{
uint i;
for(;s>0;s--)
  for(i=500;i>0;i--);
}
void djhs()interrupt 3//舵机的pwm调速,t1中断
{
   TH1=0xff; // 0.1ms
   TL1=0x9c; //65536-100
   jishu++;
        if(jishu<=shijian){ duoji = 1; }
        else { duoji = 0; }
        if (jishu>= 200){jishu = 0; }
}
void main()//自动避障模块
{TMOD=0x11;                   //设T0为方式1,T1方式为1
        TH0=0x00;//t0初始化
        TL0=0x00;         
  TH1=0xff;            
        TL1=0x9c;
        ET0=1;
  ET1=1;
  TR0=1;           //允许T0中断
        EA=1;        
        while(1){
             shijian=14;//舵机旋转至81°
      jishu=0;
      yanchi(100);
     TR1=1;
     yanchi(100);
     TR1=0;
    qmjl=csbceju();//获得一个正前方的距离
     shijian=5;//舵机旋转至0°
      jishu=0;
      yanchi(100);
                   TR1=1;
    yanchi(200);
     TR1=0;
    ybjl=csbceju();//获得一个右边的距离
    shijian=20;//舵机旋转至135°
      jishu=0;
      yanchi(100);
                   TR1=1;
     yanchi(200);
     TR1=0;
    zbjl=csbceju();//获得一个左边的距离
if(qmjl>40&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前进
yanchi(50);//前进一段时间停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>40&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>40&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>40&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>40&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前进
yanchi(50);//前进一段时间停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>30&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>30&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>30&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>30&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<30&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<30&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<30)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&ybjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;//前进
yanchi(50);//前进一段时间停止
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl>20&&zbjl<qmjl)
{
in1=0;in2=1;in3=0;in4=1;
yanchi(50);
in1=0;in2=0;in3=0;in4=0;
}
else if(zbjl>20&&ybjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(zbjl>20&&qmjl<zbjl)
{
in1=1;in2=1;in3=1;in4=0; //左转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>qmjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(ybjl>20&&ybjl>zbjl)
{
in1=1;in2=0;in3=1;in4=1;//右转
yanchi(35);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<20&&ybjl<10&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<20&&zbjl<10)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
else if(qmjl<10&&ybjl<10&&zbjl<20)
{
in1=1;in2=0;in3=1;in4=0;//后退
yanchi(100);
in1=0;in2=0;in3=0;in4=0;//停止
}
}
  }
//t2定时器蓝牙小车
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tmp;
sfr T2MOD=0xc9;
sbit in1=P1^0;//in1,in2控制左电机
sbit in2=P1^1;
sbit in3=P1^2;//in3,in4控制右电机
sbit in4=P1^3;
void init()
{
ES=0;
T2MOD=0x01;//工作方式1
T2CON=0X30;//接收发送模式
TH2=0xFD;//初值,比特率9600
TL2=0xDC;
RCAP2H=0xFF;
RCAP2L=0xDC;
SCON=0x50;
PCON=0x00;
TR2=1;//开启T2
ET2=1;
PCON &= 0x7f;
TI=0;
RI=0;
PS=1;//设置蓝牙为最高优先级
EA=1;//开总中断
ES=1;//开串口中断
}
//蓝牙小车
void main()
{

init();
  while(1)
          {         
                  if(RI==1)                     // 是否有数据到来
                  {
                   RI = 0;
                  tmp = SBUF;                   // 暂存接收到的数据
                                  switch(tmp)
                                  {
                                  case '1':in1=1;in2=0;in3=1;in4=0;break;        //后退                                
                                        case '2':in1=0;in2=1;in3=0;in4=1; break;//前进
                                        case '3':in1=1;in2=1;in3=1;in4=0; break;//左转
                                        case '4':in1=1;in2=0;in3=1;in4=1; break;//右转
                                        case '0':in1=0;in2=0;in3=0;in4=0;break;//停止

                                  }
                                  }      
          }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:967138 发表于 2021-9-19 19:33 来自手机 | 只看该作者
没人吗?
回复

使用道具 举报

板凳
ID:57657 发表于 2021-9-19 21:30 | 只看该作者
串口中断打开了,中断入口函数 interrupt 4 哪里去了?
回复

使用道具 举报

地板
ID:624769 发表于 2021-9-20 00:18 | 只看该作者
T2CON=0X30;//接收发送模式       你选了,T2做串口的波特率
ET2=1;       你这里又开 T2 中断??  差不多8年没用 89C52了,但是印象当中记得,T2作了波特率发生器,只能开 ES, 一开ET2 就会死。
另外,你T2 的中断函数也没看到。ES 的中断函数也没看到, 所以也不好判断。
回复

使用道具 举报

5#
ID:967138 发表于 2021-9-20 09:28 来自手机 | 只看该作者
谢谢大佬们
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表