找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙,超声波,怎样集合

[复制链接]
跳转到指定楼层
楼主
ID:149774 发表于 2017-2-14 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//sfr  T2MOD=0xc9;
sbit in1  =P1^0;
sbit in2  =P1^1;
sbit in3  =P1^2;
sbit in4  =P1^3;
sbit in5  =P1^4;
sbit in6  =P1^5;
sbit in7  =P1^6;
sbit in8  =P1^7;

sbit ina  =P3^4;  //电机PWM-A
sbit ina2 =P3^5;
sbit inb  =P3^6;  //电机PWM-B
sbit inb2  =P3^7;

sbit bz_l =P2^0;  //避障左
sbit bz_r =P2^1;  //避障右

sbit moto_pwm =P3^2;//PWM输出脚控制舵机

unsigned int  time=0;
unsigned long S=0;

sbit Trig = P0^2;
sbit Echo = P0^3;

uint tt = 0;//变量定义
uint num=0;//变量定义

uchar pwm_lefr=0;//定义 定时器自加1变量

uchar duojiguizhong=14;//舵机归中1.5ms
uchar duojiguizhong1=14;//舵机归中1.5ms
uchar tmp,w,sudu;
void Conut();
void  StartModule();
void init() ;
void delay1(uint z)//延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=120;y>1;y--);
}
void delay(uint z)
{
        uint x,y;
        for(x=0;x<z;x++)
        for(y=0;y<1000;y++);

}


void pwmmaic()//产生PWM
{
        if(pwm_lefr<=duojiguizhong)        
                moto_pwm=1;    //舵机PWM
                else
                moto_pwm=0;
                if(pwm_lefr>=200)
                pwm_lefr=0;               
}

void duoji_kz()//舵机控制
{

        duojiguizhong=9;      
        delay(100);  //转头时间
        StartModule();
        //Conut();     //测速运行程序就卡死了
       
        duojiguizhong=16;        
        delay(100);

       
        duojiguizhong=24;        
        delay(100);

       
        duojiguizhong=16;        
        delay(100);

}

void qianjin()
{
        in1=1;in2=0;in3=1;in4=0;in5=1;in6=0;in7=1;in8=0;

}   
void houtui()
{
        in1=0;in2=1;in3=0;in4=1;in5=0;in6=1;in7=0;in8=1;

}  
void zuozhuan()
{
        in1=0;in2=1;in3=0;in4=1;in5=1;in6=0;in7=1;in8=0;

}
void youzhuan()
{
        in1=1;in2=0;in3=1;in4=0;in5=0;in6=1;in7=0;in8=1;

}  
void tingzhi()
{
        in1=0;in2=0;in3=0;in4=0;in5=0;in6=0;in7=0;in8=0;

}
void bizhang()        //避障
{
    if(bz_l==1&&bz_r==1)
         qianjin();
        if(bz_l==0&&bz_r==1)
         zuozhuan();
         if(bz_l==1&&bz_r==0)
         youzhuan();
         if(bz_l==0&&bz_r==0)
         {        
                 tingzhi();
                delay(100);
                houtui();
                delay(500);
                zuozhuan();
                delay(200);
                qianjin();
         }
                                                                                                  
}


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;
}


void Conut()
{
     while(!Echo);//当RX为零时等待
     TR0=1;//开启计数
    while(Echo);        //当RX为1计数并等待
   TR0=0;               
   time=TH0*256+TL0;
   TH0=0;
  TL0=0;
  S=(time*1.7)/100;  //算出来是CM
}


void init()   //串口初始化
{                                                                       //关中断
    SCON =0x50; //串口模式1,允许接收                  
    TMOD =0x20;//定时器1为模式2 8-bit自动装载方式用于产生波特率
    PCON=0x00;//波特率不倍增
        TH1=0xfd;//波特率9600  11.0592M
        TL1=0xfd;
TH0=0;
TL0=0;
        ET0=1; //        T0中断允许
        TR0=1; //        启动T0定时器
        TR1=1; //        启动T1定时器
        EA=1;
        ES=1;       
        duojiguizhong=16;
        duojiguizhong1=16;
}


void ctrl() //接收处理函数
{
   switch(tmp)
   {         
     case 1:qianjin();break;                                                     
     case 2:houtui();break;                                                                             
     case 3:zuozhuan();break;
     case 4:youzhuan();break;  
     case 0:tingzhi(); break;
     case 7:duoji_kz();break;        //舵机         C
     case 8:bizhang();break;        //避障        D

   }
}


void tiaosu () //调速
{
        switch(sudu)
        {
                                case 5: w=40; break;         //A
                                case 6: w=75; break;         //B               
        }
}


void main()
{
   init();         
   while(1)
   {
        ctrl();
        tiaosu();  
   }
}


void time0() interrupt 1
{  
                                TH0=0xfd;
                                TL0=0xae;
         tt++;
        pwm_lefr++;
        pwmmaic();
        if(tt<w)
        {
                ina=1;
         ina2=1;
                inb=1;
         inb2=1;
        }
        else
        {
                ina=0;
         ina2=0;
                inb=0;
         inb2=0;
        }
        if(tt==100)
        {tt=0;
}
}


void ckzd() interrupt 4
{
        ES=0;
        RI=0;
        tmp=SBUF;
        sudu=SBUF;
        ES=1;
}
问下 Conut() 运行无效??是定时器问题吗?

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

使用道具 举报

沙发
ID:164717 发表于 2017-2-15 10:01 | 只看该作者
很给力!
回复

使用道具 举报

板凳
ID:149774 发表于 2017-2-15 21:23 | 只看该作者
没高手高速我或给个思路吗
回复

使用道具 举报

地板
ID:164859 发表于 2017-2-16 09:12 来自手机 | 只看该作者
蓝牙是用来控制小车模式还是运动形式的,可以将蓝牙的命令放在串口中断中执行
回复

使用道具 举报

5#
ID:123289 发表于 2017-2-16 18:22 | 只看该作者
1、首先蓝牙、超声波与单片机在硬件上是如何搭接的。(如:都接串口)
2、两者的数据与单片机的如何协议的。(如:波特率、串行格式)
3、程序中当有分别处理二者的子程序。
4、系统中二者有数据中断时,各子的处理子程序应分别响应(或先做标记,而后再处理)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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