找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2838|回复: 7
收起左侧

蓝牙&超声波结合的问题

[复制链接]
ID:402202 发表于 2018-10-5 20:58 | 显示全部楼层 |阅读模式
500黑币
本帖最后由 YQLSun 于 2018-10-5 22:22 编辑

谢谢前辈们!
解决问题,并且回复了正确的源码,悬赏500黑币


想实现功能:蓝牙遥控的时候,小车检测前方障碍,如果遇到障碍,小车自动停止,并且不能前进。


遇到的问题:小车无法行动,猜测是在中断3的地方只能判断出a = 0,无法判断出 a = 1;

代码:
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
        
bit flag = 0;                                                        //用来标志定时器0溢出
uchar a;                                                                        //用来判断蓝牙的通信是否运行
uint time  = 0;                                                //用来储存定时器0的值
unsigned long S = 0;                        //用来储存距离
uchar tempbuf = 0;                                //用来储存SBUF

//L298N端口声明
sbit IN1 = P2^0;
sbit IN2 = P2^1;
sbit IN3 = P2^2;
sbit IN4 = P2^3;
sbit ENA = P2^4;
sbit ENB = P2^5;

//超声波端口声明
sbit TRIG = P1^0;
sbit ECHO = P1^1;

//延时函数单位:ms
void delay(uint MS)
{
        uint i,j;
        for(i = MS; i > 0; i--)
        {
                for(j = 114; j > 0; j--);
        }
}

//小车运动函数
void TZ()                                        //停止
{
  IN1 = 0;   
         IN2 = 0;
        IN3 = 0;
        IN4 = 0;
}
void QJ()                                        //前进
{
  IN1 = 0;   
         IN2 = 1;
        IN3 = 1;
        IN4 = 0;
}
void HT()                                        //后退
{
  IN1 = 1;   
         IN2 = 0;
        IN3 = 0;
        IN4 = 1;
}
void ZZ()                                        //左转(双轮)
{
  IN1 = 1;   
         IN2 = 0;
        IN3 = 1;
        IN4 = 0;
}

void YZ()                                        //右转(双轮)
{
  IN1 = 0;   
         IN2 = 1;
        IN3 = 0;
        IN4 = 1;
}

//定时器0和串口中断初始化函数
void Init()
{
        TMOD = 0x21;                        //定时器0:方式1,定时器1:方式2
        SCON = 0x50;                        //0101 0000 串行口控制寄存器
        PCON = 0x00;                        //波特率不加倍
        
        TH0 = 0x00;                                //定时器0初始值设定
        TL0 = 0x00;
        
        TH1 = 0xfd;                                //计数器1初始值设置,波特率9600
        TL1 = 0xfd;
        
        ET0 = 1;                                        //允许T0中断
        ET1 = 1;                                        //允许T1中断
        
        ES = 1;                                                //打开接收中断
        EA = 1;                                                //打开总中断
        TR1 = 1;                                        //打开计数器1
}

//超声波启动函数
void USStart()
{
        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;
}

//超声波测距函数
void USCount()
{
        time = TH0 * 256 + TL0;        //读取脉宽长度
        TH0 = 0;
        TL0 = 0;
        S = (time * 1.7) / 100; //算出来是CM
}
//定时器0中断,用来储存溢出
void DSQzd0() interrupt 1
{
        flag = 1;
}

//定时器1中断,用来给a赋值,让串行口中断判断如何运行
void DSQzd1() interrupt 3
{
        if((S >= 25)||(flag == 1))
        {
                a = 1;
                flag = 0;
        }
        else
        {
                a = 0;
        }
}
//根据a来进行判断并处理串口的数据
void CXKzd() interrupt 4
{
        if(a == 0)
        {
                tempbuf = SBUF;
                RI = 0;
                TZ();
                switch(tempbuf)
                {
                        case'b': HT(); break;
                        case'c': ZZ(); break;
                        case'd': YZ(); break;
                        case'e': TZ(); break;
                }
        }
        else
        {        
                tempbuf = SBUF;
                RI = 0;
                switch(tempbuf)
                {
                        case'a': QJ(); break;
                        case'b': HT(); break;
                        case'c': ZZ(); break;
                        case'd': YZ(); break;
                        case'e': TZ(); break;
                }
        }
}

void main()
{
        Init();
        while(1)
        {
                USStart();
                while(!ECHO);                //当RX为零时等待
                TR0 = 1;                          //开启计数
                while(ECHO);                //当RX为1计数并等待
                TR0 = 0;                                //关闭计数
    USCount();                        //计算
                delay(100);                        //100MS
        }
}

回复

使用道具 举报

ID:246251 发表于 2018-10-6 09:30 | 显示全部楼层
在中断外把flag a啥的打印出来看看,确定是哪个条件没满足
回复

使用道具 举报

ID:330198 发表于 2018-10-6 10:25 | 显示全部楼层
无法判断出a=1是因为你超声波测的距离有问题,回头看看你的测距S = (time * 1.7) / 100; 这个我觉得应该是S=time/58;你改下试试看。
回复

使用道具 举报

ID:402202 发表于 2018-10-9 13:18 | 显示全部楼层
zhanghyg 发表于 2018-10-6 10:25
无法判断出a=1是因为你超声波测的距离有问题,回头看看你的测距S = (time * 1.7) / 100; 这个我觉得应该是S ...

不对哦
回复

使用道具 举报

ID:402202 发表于 2018-10-9 13:18 | 显示全部楼层
new_hand 发表于 2018-10-6 09:30
在中断外把flag a啥的打印出来看看,确定是哪个条件没满足

flag 和 a都没有问题啊
回复

使用道具 举报

ID:387733 发表于 2018-10-9 20:55 | 显示全部楼层
        S = (time * 1.7) / 100;                         //算出来是CM

把这个语句改成:

               S = (time * 17) / 1000;                

跟踪一下,看看是不是希望的结果       
回复

使用道具 举报

ID:303383 发表于 2018-10-10 09:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:402202 发表于 2018-10-10 18:56 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-10-10 09:47
最主要的问题,应该是中断有冲突了

对呀,问题就是中断3和中断4上面
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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