微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC单片机之PCA/PWM

STC单片机之PCA/PWM

时间:11-11 来源:互联网 点击:
2路PCA的捕获、高速输出、16bit定时器、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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top