找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 934|回复: 0
收起左侧

有哪位大佬帮我看下为什么我的蓝牙无法控制驱动? 求帮助

[复制链接]
ID:584513 发表于 2019-11-28 21:24 | 显示全部楼层 |阅读模式
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int   
sbit ENA=P1^4;                           //接驱动模块ENA        使能端,输入PWM信号调节速度          左前轮
sbit ENB=P1^5;                           //接驱动模块ENB                                                                   右前轮

/*电机驱动IO定义*/
sbit IN1 = P1^2; //为1 左电机反转        
sbit IN2 = P1^3; //为1 左电机正转        
sbit IN3 = P1^6; //为1 右电机正转         
sbit IN4 = P1^7; //为1 右电机反转        

/*定义电机驱动函数*/
void qianjin();
void houtui();
void zuozhuan();
void youzhuan();

  /*PWM定义*/
uint PWM_t;

/*HC—06蓝牙模块定义*/
uchar temp;     //用于接收蓝牙收到的指令

/*延时函数*/
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
         for(y=250;y>0;y--);
}

/***********蓝牙模块***********/
/*蓝牙初始化*/
void UART_INIT()
{
        SM0 = 0;
        SM1 = 1;  //串口工作方式1
        REN = 1;  //允许串口接收
        EA = 1;   //开总中断
        ES = 1;   //开串口中断
        TMOD = 0x20;//8位自动重装模式
        TH1 = 0xfd;
        TL1 = 0xfd; //9600波特率
        TR1 = 1;  //启动定时器1
}

/*串口中断*/
void UART_SER() interrupt 4
{
        if(RI == 1)
        {
                RI = 0;//清除接收标志
                temp=SBUF; //将接收到的数据储存在zhiling中
//                switch(SBUF)
//                {
//                        case 'A':
//                        qianjin();
//                        break;
//                        case 'B':
//                        houtui();
//                        break;
//                }
        }
}

/*处理接收到的指令*/
void ctrl()
{
        switch(temp)
        {
                case 'A':
                        qianjin();                        //如果指令是A,那就前进
                break;
                case 'B':
                        houtui();                        //如果指令是B,那就后退
                break;
                case 'L':
                        youzhuan();                        //如果指令是L,那就左转
                break;
                case 'R':
                zuozhuan();                                //如果指令是R,那就右转
                break;
        }
}

/***********小车驱动***********/
/*小车前进*/
void qianjin()
{
        IN1=0;
        IN2=1;          //左电机正转
        IN3=1;          //右电机正转
        IN4=0;        
}

/*小车左转*/                                         //现在左转是右转
void zuozhuan()
{
        IN1=1;           //左电机反转
        IN2=0;         
        IN3=1;          //右电机正转
        IN4=0;        
}

/*小车右转*/
void youzhuan()
{
        IN1=0;
        IN2=1;          //左电机正转
        IN3=0;         
        IN4=1;          //右电机正转
}

/*小车后退*/
void houtui()
{
        IN1=1;          //左电机反转
        IN2=0;         
        IN3=0;         
        IN4=1;          //右电机后转        
}

  /*定时0初始化*/
void Timer()
{
        TMOD=0x02;           //定时器0工作方式2,TH0是重装值,TL0是初值
    TH0=200;                   //写入预置初值(取值1-255,数越大PWM频率越高)
    TL0=200;                   //写入预置值 (取值1-255,数越大PWM频率越高)
    TR0=1;                   //启动定时器
    ET0=1;                    //允许定时器0中断
    EA=1;                        //允许总中断        
}

/*主函数*/
void main()
{
        UART_INIT();    //串口初始化
        Timer();                 //定时器0初始化
        while(1)
        {
                ctrl();
        }
}

  /*定时器0中断服务函数*/
void timer0() interrupt 1         
{
         TH0=200;         //重新装载初值
     TL0=200;
         PWM_t++;                 //每次定时器溢出加1
         if(PWM_t==50)
         {
                  PWM_t=0;   //使t=0,开始新的PWM周期
                 ENA=~ENA;        //ENA取反产生方波
                 ENB=~ENB;        //ENB取反产生方波
         }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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