基于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的四轮小车电机控制函数的主要内容,如果未能解决你的问题,请参考以下文章
ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)