基于STC89C52的四轮小车电机控制函数

Posted 芯青年0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STC89C52的四轮小车电机控制函数相关的知识,希望对你有一定的参考价值。

51单片机是大多数同学入门单片机的首选,在现今的高校也是十分地普及,而智能小车也是一个很有意思的东西。

废话不多说,直接上代码:

.C文件部分



/*********************************************\\
*                   _ooOoo_                   *
*                  o8888888o                  *
*                  88" . "88                  *
*                  (| -_- |)                  *
*                  O\\  =  /O                  *
*               ____/`---'\\____               *
*             .'  \\\\|     |//  `.             *
*            /  \\\\|||  :  |||//  \\            *
*           /  _||||| -:- |||||-  \\           *
*           |   | \\\\\\  -  /// |   |           *
*           | \\_|  ''\\---/''  |   |           *
*           \\  .-\\__  `-`  ___/-. /           *
*         ___`. .'  /--.--\\  `. . __          *
*      ."" '<  `.___\\_<|>_/___.'  >'"".       *
*     | | :  `- \\`.;`\\ _ /`;.`/ - ` : | |     *
*     \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /     *
*======`-.____`-.___\\_____/___.-`____.-'======*
*                   `=---='                   *
*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*
*                No bug forever               *
\\*********************************************/

/*
 *  Author:yyx
 *  function:基于寻迹壁障小车的电机驱动
 *          
 *  Created on: 2018年5月2日
 *注意:本程序是基于一片LN298驱动的,所以只能实现右(左)侧的两个电机同时向前或者向后, 并且能够控制其速度。
 */
#include "motor.h"


static volatile unsigned int SetFrequenceLevel = 0;  
static volatile unsigned char RightDuty=0;   //右边波形的占空比,速度大小(1-10)
static volatile bit RightDirect=0; //右侧方向控制位,1前进,0后退
static volatile unsigned char LeftDuty=0;    //左边波形的占空比,速度大小(1-10)
static volatile bit LeftDirect=0; //右侧方向控制位,1前进,0后退
/*
*定时器0和1初始化函数
*SetF:控制电机的PWM波的频率(10000-20000)
*/
void Both_Timer_Init(unsigned int SetF)

SetFrequenceLevel = 1000000/(SetF*10); //获取定时间隔
//配置T0和T1对应的TMOD,设置工作方式
TMOD = 0x11; //GATE=0,软件使能;定时模式;方式1,16位定时器
//配置初值
TH0 = TH1 = (65536-SetFrequenceLevel)/256;
TL0 = TL1 = (65536-SetFrequenceLevel)%256;
//开启中断
ET0 = 1;  //开启T0中断
ET1 = 1;
EA = 1;


/*
*功能:右侧两个电机控制函数
*参数:
     enable:使能位,1时使能两个电机;0时关闭电机
direct:方向控制。1为前进,0为后退
speed:速度控制位,取值为1-10;速度逐渐增大
*/
void Control_Right_Motor(bit enable,bit direct,unsigned char speed)

if(enable)

TR0 = 1;//使能TR位,使能T0定时器
RightDirect = direct;
if(direct)//如果前进

MR1 = 1;
MR2 = 0;
else//如果后退

MR1 = 0;
MR2 = 1;

RightDuty = speed; //控制相应的速度
else

MR1=MR2=0;
   TR0 = 0;//关闭T0定时器


//右侧方波产生中断,Timer0
void Timer0_Right() interrupt 1

static unsigned TimeCounter = 0;
//重装初值
TH0 = (65536-SetFrequenceLevel)/256;
TL0 = (65536-SetFrequenceLevel)%256;

TimeCounter++;

if(TimeCounter==RightDuty)

if(RightDirect)MR1=0;else MR2=0;

if(TimeCounter == 10)

TimeCounter = 0;
if(RightDirect)MR1=1;else MR2=1;






/*
*功能:左侧两个电机控制函数
*参数:
     enable:使能位,1时使能两个电机;0时关闭电机
direct:方向控制。1为前进,0为后退
speed:速度控制位,取值为1-10;速度逐渐增大
*/
void Control_Left_Motor(bit enable,bit direct,unsigned char speed)

if(enable)

TR1 = 1;//使能TR位,使能T1定时器
LeftDirect = direct;
if(direct)//如果前进

ML1 = 1;
ML2 = 0;
else//如果后退

ML1 = 0;
ML2 = 1;

LeftDuty = speed; //控制相应的速度
else

ML1=ML2=0;
   TR1 = 0;//关闭T1定时器


//左侧方波产生中断,Timer1_Left
void Timer1_Left() interrupt 3

static unsigned TimeCounter1 = 0;
//重装初值
TH1 = (65536-SetFrequenceLevel)/256;
TL1 = (65536-SetFrequenceLevel)%256;

TimeCounter1++;

if(TimeCounter1==LeftDuty)

if(LeftDirect)ML1=0;else ML2=0;

if(TimeCounter1 == 10)

TimeCounter1 = 0;
if(LeftDirect)ML1=1;else ML2=1;

头文件部分:

#ifndef __motor_h
#define __motor_h


#include <reg52.h>


sbit MR1 = P0^0;
sbit MR2 = P0^1;  //右侧两个电机控制管脚
sbit ML1 = P0^2;  //左侧两个电机控制管脚
sbit ML2 = P0^3;


void Both_Timer_Init(unsigned int SetF);
void Control_Right_Motor(bit enable,bit direct,unsigned char speed);
void Control_Left_Motor(bit enable,bit direct,unsigned char speed);

 

#endif 

第一次发博客,开心ヾ(๑╹◡╹)ノ"(`・ω・´)٩(๑❛ᴗ❛๑)۶

以上是关于基于STC89C52的四轮小车电机控制函数的主要内容,如果未能解决你的问题,请参考以下文章

基于STC89C52单片机的语音温度计全套解决方案

STC89C52 单片机I/O口能直接驱动MOS管吗?

ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)

STC52单片机简单控制直流电机正反转(已验证)

基于STC89C52的oled红外遥控闹钟

8051单片机实战分析(以STC89C52RC为例) | 10 - 外部中断的使用