/***
**项目名称:舵机使用介绍(测试程序部分)
**实现方法:使用PCA的16位软件定时器产生PWM控制
**编写时间:.07.06
**使用芯片:stc12c4052ad
**时钟频率:使用外部晶振频率12MHz
**联系方式:QQ群号-143867886
*****更多内容可在微信公众号(电子创客派 ID:e_diy_c)查看*****
***/
#include
#include
typedef unsigned char u8;
typedef unsigned short int u16;
sbit CTRL = P3^7; //舵机控制端口
void delay_100ms(u16 x);
u16 TIME = 20000; //PWM周期时间(单位us)
u16 Min = 800;//高电平最小持续时间
u16 Max = 2200;//高电平最大持续时间
u16 aTime = 800; //高电平持续时间
u8 Degree = 200; //单位时间宽度(最小是舵机死区设定大约10us)
void main()
{
CTRL = 0;
//PCA0配置
CCAPM0 = 0x48; //设置PWM0为16位软件定时器
CCAPM0 |= 0x01; //PCA0比较中断使能
CL = 0; //PCA计数器低8位
CH = 0; //PCA计数器高8位
CCAP0L = aTime; //PCA0比较寄存器低8位
CCAP0H = aTime >> 8;//PCA0比较寄存器高8位
CR = 1; //使能PCA计数
EPCA_LVD = 1;//使能PCA中断
EA = 1; //打开中断总开关
while(1)
{
//逆时针旋转
while(aTime < Max)
{
delay_100ms(5);
aTime += Degree;
}
//顺时针旋转
while(aTime > Min)
{
delay_100ms(5);
aTime -= Degree;
}
}
}
void Delay100ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 144;
k = 71;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void delay_100ms(u16 x)
{
while(x--)Delay100ms();
}
//PCA中断
void _PCA_() interrupt 6 using 1
{
static u8 flag = 1;
//PWM0比较中断
if(CCF0)
{
CCF0 = 0;//中断标志位要软件清零
if(flag)//如果之前PWM0_CTRL是高电平,则接下来产生时间宽度为TIME-aTime的低电平
{
CTRL = 0;
CCAP0L = TIME;
CCAP0H = TIME >> 8;
}
else //如果之前PWM0_CTRL是低电平,则接下来产生时间宽度为aTime的高电平
{
CTRL = 1;
CL = 0;
CH = 0;
CCAP0L = aTime;
CCAP0H = aTime >> 8;
}
flag = 1 - flag;
}
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………