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

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

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

.C文件部分



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

/*
 *  Author: 余裕鑫
 *  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


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 


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

你可能感兴趣的:(51学习)