微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 蓝牙小车按键按键车动,不按车停,程序如何改写?

蓝牙小车按键按键车动,不按车停,程序如何改写?

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit left_Q_int=P0^0;                //左前轮电机int口                                                                                                               
sbit left_Q_out=P0^1;                //左前轮电机out口
sbit left_H_int=P0^2;               
sbit left_H_out=P0^3;
sbit right_Q_int=P0^4;
sbit right_Q_out=P0^5;
sbit right_H_int=P0^6;
sbit right_H_out=P0^7;
uint Received_data=0; //接收数据
unsigned char time=0;                 //控制定时器频率的全局变量,并赋初值                                          
unsigned char duty=0;                      //定义占空比       
/*****************************
        函数声明
*****************************/
void Init_serial();        //串口中断 寄存器准备               
void Process_data(); //数据处理函数
void go(unsigned char per);
void stop(unsigned char per);
void left(unsigned char per);
void right(unsigned char per);
void back(unsigned char per);
void init(void);
void delay(uint i);
/**************************************
  主函数
***************************************/
void main()
{
        init();
        Init_serial(); //串口中断 寄存器准备
        while (1)
        {          
               
                Process_data();         //数据处理
        }
}

/****************************************************************
  函数名: 数据处理函数
  功能: 判断接收到的字符, 并作出对应的处理
*****************************************************************/
void Process_data()
{                         
                       
           switch(Received_data)
           {
               case 0:stop(0);break;
                   case 'a':go(10);break;
                   case 'b':left(20);break;
                   case 'c':right(20);break;
                   case 'd':back(20);break;
                   default:stop(0);break;
           }
}

/*****************************************************************
  函数名:串口通讯初始化
  功能: 设置串口通讯相关的寄存器
******************************************************************/
void Init_serial()
{
        EA = 1;                                //开总中断
        PS=1;
        ES = 1;                                //开串口中断
        SCON = 0x40;                //串口通信方式1
        REN = 1;                        //允许接受位
        TMOD |= 0x20;                //定时器1用于产生波特率,八位自动重装模式, 用与运算, 不至于干扰定时器0的设置
        TH1 = TL1 = 0xfd;        //9600波特率初值
        TR1 = 1;                        //注意千万不要使用定时器1,  不然会与串口冲突
}

/*****************************************************************
  函数名:串口中断执行函数
  功能:接收主控机发的字符并储存
******************************************************************/
void Serial() interrupt 4
{
        if (RI) RI = 0;                 //中断标志位清零
        Received_data = SBUF; //保存接收的字符
}

/******************************************************************************
                                  初始化
******************************************************************************/
void init(void)
{
        EA=1;                  //开总中断
        ET0=1;                 //定时器T0中断允许         
        TMOD=0x01;             //TMOD=0001 000B,使用定时器T0的模式1
        TH0=(65536-30)/256;   //定时器T0的高8位赋初值
    TL0=(65536-30)%256;  //定时器T0高8位赋初值
        TR0=1;        
}
/**************************************************************
函数功能:定时器T1的中断服务程序
**************************************************************/
void Time1(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数
                 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
        TR0=0;        //再赋初值时,关闭定时器
          TH0=(65536-30)/256; //定时器T0的高8位重新赋初值
        TL0=(65536-30)%256; //定时器T0的高8位重新赋初值
        TR0=1;        //打开定时器,开始计时
        time++;
        if(time>=100) time=0;//电机最佳的工作频率为1000HZ
}

/**************************************************************************************
* 函 数 名         : PWM
* 函数功能                   : 通过调节函数参数duty1来为PWM1、PWM2输出(per%)的稳定信号          
* 输    入         : duty
* 输    出         : 无
**************************************************************************************/
void go(unsigned char per)
{       
        duty=per;                                  //启动定时器T1
        if(time<duty)         //duty位占空,在0~100的范围内,在0~duty的范围执行信号
        {
                //////////******************************************//////////////////////
                left_Q_int=1;         //这里是有效信号,将执行有效信号时动作信号放到这里
                left_Q_out=0;         //     本程序例子是控制左前轮电机正转
                left_H_int=1;
                left_H_out=0;         
                right_Q_int=1;
                right_Q_out=0;       
                right_H_int=1;
                right_H_out=0;
                //////////****************************************////////////////////////
        }
        else                        //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
        {
                //////////****************************************////////////////////////
                left_Q_int=1;         //这里是占空时间,将停止动作放到这里
                left_Q_out=1;         //                本例子例子在此处控制左前轮电机停止
                left_H_int=1;
                left_H_out=1;
                right_Q_int=1;
                right_Q_out=1;
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
}
void stop(unsigned char per)
{       
        duty=per;                                  //启动定时器T1
        if(time<duty)         //duty位占空,在0~100的范围内,在0~duty的范围执行信号
        {
                //////////******************************************//////////////////////
                left_Q_int=1;         //这里是有效信号,将执行有效信号时动作信号放到这里
                left_Q_out=1;         //     本程序例子是控制左前轮电机正转
                left_H_int=1;
                left_H_out=1;         
                right_Q_int=1;
                right_Q_out=1;       
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
        else                        //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
        {
                //////////****************************************////////////////////////
                left_Q_int=1;         //这里是占空时间,将停止动作放到这里
                left_Q_out=1;         //                本例子例子在此处控制左前轮电机停止
                left_H_int=1;
                left_H_out=1;
                right_Q_int=1;
                right_Q_out=1;
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
}
void left(unsigned char per)
{       
        duty=per;                                  //启动定时器T1
        if(time<duty)         //duty位占空,在0~100的范围内,在0~duty的范围执行信号
        {
                //////////******************************************//////////////////////
                left_Q_int=1;         //这里是有效信号,将执行有效信号时动作信号放到这里
                left_Q_out=0;         //     本程序例子是控制左前轮电机正转
                left_H_int=1;
                left_H_out=0;         
                right_Q_int=0;
                right_Q_out=1;       
                right_H_int=0;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
        else                        //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
        {
                //////////****************************************////////////////////////
                left_Q_int=1;         //这里是占空时间,将停止动作放到这里
                left_Q_out=1;         //                本例子例子在此处控制左前轮电机停止
                left_H_int=1;
                left_H_out=1;
                right_Q_int=1;
                right_Q_out=1;
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
}
void right(unsigned char per)
{       
        duty=per;                                  //启动定时器T1
        if(time<duty)         //duty位占空,在0~100的范围内,在0~duty的范围执行信号
        {
                //////////******************************************//////////////////////
                left_Q_int=0;         //这里是有效信号,将执行有效信号时动作信号放到这里
                left_Q_out=1;         //     本程序例子是控制左前轮电机正转
                left_H_int=0;
                left_H_out=1;         
                right_Q_int=1;
                right_Q_out=0;       
                right_H_int=1;
                right_H_out=0;
                //////////****************************************////////////////////////
        }
        else                        //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
        {
                //////////****************************************////////////////////////
                left_Q_int=1;         //这里是占空时间,将停止动作放到这里
                left_Q_out=1;         //                本例子例子在此处控制左前轮电机停止
                left_H_int=1;
                left_H_out=1;
                right_Q_int=1;
                right_Q_out=1;
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
}
void back(unsigned char per)
{       
        duty=per;                                  //启动定时器T1
        if(time<duty)         //duty位占空,在0~100的范围内,在0~duty的范围执行信号
        {
                //////////******************************************//////////////////////
                left_Q_int=0;         //这里是有效信号,将执行有效信号时动作信号放到这里
                left_Q_out=1;         //     本程序例子是控制左前轮电机正转
                left_H_int=0;
                left_H_out=1;         
                right_Q_int=0;
                right_Q_out=1;       
                right_H_int=0;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
        else                        //在0~100范围内,在duty~100的范围里,执行占空(电机如果正负极信号均为1时,电机停止)
        {
                //////////****************************************////////////////////////
                left_Q_int=1;         //这里是占空时间,将停止动作放到这里
                left_Q_out=1;         //                本例子例子在此处控制左前轮电机停止
                left_H_int=1;
                left_H_out=1;
                right_Q_int=1;
                right_Q_out=1;
                right_H_int=1;
                right_H_out=1;
                //////////****************************************////////////////////////
        }
}

嗯嗯,也遇到过这样的问题

顶一下              

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top