STC单片机之PCA/PWM
PCA.c
* 文 件 名:PCA.c
* 芯 片:STC12C5A60S2
* 晶 振:12MHz
* 创 建 者:冷月
* 创建日期:2010.8.18
* 修 改 者:
* 修改日期:2010.9.3 修改设置波特率参数为x%,增加定时器0作为PCA时钟源
* 功能描述:2路PCA的捕获、高速输出、16bit定时器、PWM实现
*/
#include
#include "PCA.h"
#define uchar unsigned char
#define uint unsigned int
//CCAPnL,CCAPnH步进,
//CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的
//无须赋值,PCA初始化函数中自动赋值
static uint step0 = 0;
static uint step1 = 0;
/*
* 函 数 名:PCA_Capture_Init
* 功能描述:PCA捕获模式初始化
* 输入参数:module:0-PCA模块0,1-PCA模块1;
* PCA_CCAPMn:设置模块工作模式;
* PCA_CCAPnH,PCA_CCAPnL:16bit的捕获寄存器
* PCACLK:PCA时钟源
* 返 回 值:无
*/
void PCA_Init(bit module, uchar PCA_CCAPMn, uchar PCA_CCAPnH, uchar PCA_CCAPnL, uchar PCACLK)
{
//CIDL - - - CPS2 CPS1 CPS0 ECF
CMOD = 0x80 | PCACLK; //空闲模式下PCA停止工作,PCA/PWM时钟源输入
//CF CR - - - - CCF1 CCF0
CCON = 0x00;
if (module == 0) //PCA模块0
{
CCAPM0 = PCA_CCAPMn;
CCAP0L = PCA_CCAPnL;
CCAP0H = PCA_CCAPnH;
step0 = ((PCA_CCAPnH & 0x00FF)<8) | PCA_CCAPnL;
}
else //PCA模块1
{
CCAPM1 = PCA_CCAPMn;
CCAP1L = PCA_CCAPnL;
CCAP1H = PCA_CCAPnH;
step1 = ((PCA_CCAPnH & 0x00FF)<8) | PCA_CCAPnL;
}
CL = 0x00; //清PCA计数器
CH = 0x00;
//- - - - - - EPCnH EPCnL
PCA_PWM0 = 0x00; //PWM模式下,CCAPnL,CCAPnH第九位
PCA_PWM1 = 0x00; //PWM模式下,CCAPnL,CCAPnH第九位
//高速脉冲输出时,将中断优先级设为最高级,以避免其他中断干扰
IPH = 0x80;
IP = 0x80;
EA = 1;
CR = 1; //启动PCA计数器计数
}
/*
* 函 数 名:InitTimer0
* 功能描述:定时器0作为PCA时钟输入源,工作方式2,1T模式
* 输入参数:无
* 返 回 值:无
*/
void InitTimer0(void)
{
TMOD |= 0x02; //方式2
TH0 = 0x00;
TL0 = 0x00;
//T0x12 T1x12 UM0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
AUXR |= 0x80; //定时器0设置为1T
TR0 = 1;
}
/*
* 函 数 名:Set_PWM_Fre
* 功能描述:定时器0作为PCA时钟输入源时,设置PWM频率
* 输入参数:fre:要设置的PWM频率,184Hz~46KHz
* 返 回 值:无
*/
void Set_PWM_Fre(uint fre)
{
float timerVal; //定时器定时时间
uchar tempTimerVal;
timerVal = 1000000.0 / 256 / fre;
tempTimerVal = (uint)(65536 - timerVal*12) % 256;
TH0 = tempTimerVal;
TL0 = tempTimerVal;
}
/*
* 函 数 名:Set_PWM0
* 功能描述:设置PWM0占空比
* 输入参数:duty:占空比0~100
* 返 回 值:无
*/
void Set_PWM0(uchar duty)
{
uchar temp;
if (duty == 0) //PWM固定输出低
{
//- - - - - - EPCnH EPCnL
PCA_PWM0 = 0x03; //PWM模式下,CCAPnL,CCAPnH第九位
temp = 0xFF;
}
else if (duty == 100) //PWM固定输出高
{
//- - - - - - EPCnH EPCnL
PCA_PWM0 = 0x00; //PWM模式下,CCAPnL,CCAPnH第九位
temp = 0;
}
else
{
PCA_PWM0 = 0x00;
temp = 256 - 256*duty/100;
}
CCAP0L = temp;
CCAP0H = temp;
}
/*
* 函 数 名:Set_PWM1
* 功能描述:设置PWM1占空比
* 输入参数:duty:占空比0~100
* 返 回 值:无
*/
void Set_PWM1(uchar duty)
{
uint temp;
if (duty == 0) //PWM固定输出低
{
//- - - - - - EPCnH EPCnL
PCA_PWM1 = 0x03; //PWM模式下,CCAPnL,CCAPnH第九位
temp = 0xFF;
}
else if (duty == 100) //PWM固定输出高
{
//- - - - - - EPCnH EPCnL
PCA_PWM1 = 0x00; //PWM模式下,CCAPnL,CCAPnH第九位
temp = 0;
}
else
{
PCA_PWM1 = 0x00;
temp = 256 - 256*duty/100;
}
CCAP1L = temp;
CCAP1H = temp;
}
/*
* 函 数 名:PCA_Int
* 功能描述:PCA
* 输入参数:无
* 返 回 值:无
*/
void PCA_Int(void) interrupt 7
{
uint temp;
if (CCF0 == 1) //PCA模块0中断
{
CCF0 = 0; //清PCA模块中断标志
//CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的
temp = ((CCAP0H & 0x00FF)<8) | CCAP0L;
temp += step0;
CCAP0L = temp & 0x00FF;
CCAP0H = (temp & 0xFF00) >> 8;
//
}
if (CCF1 == 1) //PCA模块1中断
{
CCF1 = 0; //清PCA模块中断标志
//CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的
temp = ((CCAP1H & 0x00FF)<8) | CCAP1L;
temp += step1;
CCAP1L = temp & 0x00FF;
CCAP1H = (temp & 0xFF00) >> CCAP1H = (temp
STC单片机PCAPW 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)