• 大小: 23KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: 其他
  • 标签: 51单片机  舵机  PWM  

资源简介

本文使用单片机T2定时器,这个定时器大多数人很少使用它,而却不知道它有一个非常优秀的功能就是定时自动重载功能。利用这个功能能够更为精确的对定时器进行设定,可控制精度在1个机器周期(12M晶振下就是1us),T0、T1都需要手动重载,其精度无法很好的控制。 /*------------------------------ 硬件需求: 12T系列单片机(8051内核) 拥有T2定时器 12M时钟晶振 P2_0输出控制 舵机角度范围在0~180 高电平范围0.5ms~2.5ms 20ms周期 --------------------------------*/

资源截图

代码片段和文件信息

// Header:舵机控制程序
// File Name: 
// Author:程蒙蒙(QQ1058515967)
// Date:2018年9月12日
//Description:基于12T系列单片机且有T2定时器的单片机舵机控制程序
//,本程序控制精度高(1us),定时器自动控制舵机转动
/*------------------------------
硬件需求: 12T系列单片机(8051内核)
 拥有T2定时器
 12M时钟晶振
 P2_0输出控制
 舵机角度范围在0~180 高电平范围0.5ms~2.5ms 20ms周期 
--------------------------------*/

#include 

#define T2_PWMout P2_0  //舵机控制端
unsigned int PWMTimes=0;//高电平时间
unsigned char angle=0; //测试角度
void T2_Init();//初始化定时器2
void SetMotoangle(float angle);//设置舵机角度
void Delay100ms(); //@12.000MHz
void main()
{
bit SWdir=0;
    T2_Init();//初始化定时器
    while(1)//演示程序,舵机左右摆动 
{
if(angle>180)SWdir=0;
else if(angle==0)SWdir=1;

        SetMotoangle(SWdir?angle++:angle--);
Delay100ms();
    }
}

void T2_Init()
{
    unsigned int time=65536-20000;
    RCAP2L = TL2 = time;            //initial timer2 low byte
    RCAP2H = TH2 = time >> 8;       //initial timer2 high byte
    TR2 = 1;                        //timer2 start running
    ET2 = 1;                        //enable timer2 interrupt
    EA = 1;                         //open global interrupt switch
}
void SetMotoangle(float angle)
{
    //防止越界而损伤电机
    if(angle > 175) angle = 175;
    if(angle <5) angle = 5;

    PWMTimes=500+angle*2000.0/180;//计算出高电平时间


}
/* Timer2 interrupt routine */
void tm2_isr() interrupt 5 using 1
{
    static  bit SW=0;
    unsigned int T2count;
    TF2 = 0;//标志位清零
    SW=~SW;//状态取反
    T2_PWMout=SW;//更新输出
if(SW)//低电平时间
{
        T2count=0xB1E0+PWMTimes;//0xB1E0即为20ms中断用时
        RCAP2L=T2count;
        RCAP2H=T2count>>8;
    }
    else//高电平时间
    {
        T2count=0-PWMTimes;
        RCAP2L=T2count;
        RCAP2H=T2count>>8;
    }

}
void Delay100ms() //@12.000MHz
{
unsigned char i j;

i = 195;
j = 138;
do
{
while (--j);
} while (--i);
}



 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-09-12 00:57  T2控制舵机\
     文件      138042  2018-09-12 00:57  T2控制舵机\12T单片机T2控制舵机.uvgui.cheng
     文件        6900  2018-09-12 00:57  T2控制舵机\12T单片机T2控制舵机.uvopt
     文件       14052  2018-09-11 23:57  T2控制舵机\12T单片机T2控制舵机.uvproj
     目录           0  2018-09-12 00:57  T2控制舵机\Listings\
     文件        9829  2018-09-12 00:46  T2控制舵机\Listings\12T单片机T2控制舵机.m51
     目录           0  2018-09-12 00:57  T2控制舵机\objects\
     文件        7610  2018-09-12 00:46  T2控制舵机\objects\12T单片机T2控制舵机
     文件        6376  2015-05-29 12:09  T2控制舵机\STARTUP.A51
     文件        2101  2018-09-12 00:57  T2控制舵机\main.c

评论

共有 条评论