|
定时器频率
#define T100Hz (FOSC / 12 / 100)
方波脉冲频率
#define T100KHz (FOSC / 4 / 100000)
struct PCA_
{//PCA_结构数据类型
unsigned int Cycle; //频率
unsigned int Match; //重装值容器
unsigned int Dou; //扩展精度自加容器
unsigned int Doub; //扩展精度终点容器
unsigned char PWM_Value; //脉宽值
}PCA_0,PCA_1; //结构变量名
void PCA_isr() interrupt 7 using 1
{
if(CCF0)
{
CCF0 = 0; //清中断
CCAP0L = PCA_0.Match;
CCAP0H = PCA_0.Match >> 8; //装入比较值到比较捕获寄存器
PCA_0.Match += T100Hz; //计算下次需要装入的值
if (PCA_0.Dou-- == 0)
{//如果Dou自减1后为0
PCA_0.Dou = PCA_0.Doub; //扩展定时时间
TI=1;
Uart1_SendData('0');
}
}
if(CCF1)
{
CCF1 = 0; //清中断
CCAP1L = PCA_1.Match1;
CCAP1H = PCA_1.Match1 >> 8; //装入比较值到比较捕获寄存器
PCA_1.Match1 += T100Hz; //计算下次需要装入的值
if (PCA_1.Dou-- == 0)
{//如果Dou自减1后为0
PCA_1.Dou = PCA_1.Doub; //扩展定时时间
TI=1;
Uart1_SendData('1');
}
}
}
void PCA_Timers_Setup()
{
//清空PCA控制器、计数器
CCON = 0; //清计数溢出CF,PCA时钟停止,清模块0、1中断标记
CL = 0; //清PCA16位计数器
CH = 0;
//计数时钟选择
CMOD&=0xF1; //设置PCA 16位计数器工作在12T模式
//CMOD|=0x02; //设置PCA 16位计数器工作在2T模式
//CMOD|=0x04; //设置PCA 16位计数器使用定时器1溢出计数
//CMOD|=0x06; //设置PCA 16位计数器计数使用P1.2\P4.1输入脉冲,最高速度2T
//CMOD|=0x08; //设置PCA 16位计数器计数使用系统时钟全速
//CMOD|=0x0A; //设置PCA 16位计数器工作在4T模式
//CMOD|=0x0C; //设置PCA 16位计数器工作在6T模式
//CMOD|=0x0E; //设置PCA 16位计数器工作在8T模式
//计数溢出控制
CMOD&=0xFE; //禁止PCA计数器溢出产生中断标志CF
//CMOD|=0x01; //允许PCA计数器溢出产生中断标志CF
//模块0定时器与高速方波模式设定装入值
PCA_0.Match = T100Hz; //装入100Hz重装值
CCAP0L = PCA_0.Match;
CCAP0H = PCA_0.Match >> 8; //装入比较值到比较捕获寄存器
PCA_0.Match += T100Hz; //重装值累加
//模块1定时器与高速方波模式设定装入值
PCA_1.Match = T100Hz; //装入100Hz重装值
CCAP1L = PCA_1.Match;
CCAP1H = PCA_1.Match >> 8; //装入比较值到比较捕获寄存器
PCA_1.Match += T100Hz; //重装值累加
//模块0PWM模式设定装入值
CCAP0H = CCAP0L = PCA_0.PWM_Value; //输出50%PWM波
CCAP0H = CCAP0L = 0x00;
PCAPWM0 = 0x00; //固定输出高
CCAP0H = CCAP0L = 0xFF;
PCAPWM0 = 0x03; //固定输出低
//模块1PWM模式设定装入值
CCAP1H = CCAP1L = PCA_1.PWM_Value; //输出50%PWM波
CCAP1H = CCAP1L = 0x00;
PCAPWM1 = 0x00; //固定输出高
CCAP1H = CCAP1L = 0xFF;
PCAPWM1 = 0x03; //固定输出低
//模块0捕获模式设定
CCAPM0 = 0x11; //负捕获,开匹配中断CCFO
//CCAPM0 = 0x21; //正捕获,开匹配中断CCFO
//CCAPM0 = 0x31; //双向捕获,开匹配中断CCFO
//模块1捕获模式设定
CCAPM1 = 0x11; //负捕获,开匹配中断CCFO
//CCAPM1 = 0x21; //正捕获,开匹配中断CCFO
//CCAPM1 = 0x31; //双向捕获,开匹配中断CCFO
//模块0定时器模式设定
CCAPM0 = 0x49; //开比较器,允许计数器值与比较器相同时产生中断CCF0
//模块1定时器模式设定
CCAPM1 = 0x49; //开比较器,允许计数器值与比较器相同时产生中断CCF0
//模块0高速方波模式
CCAPM0 = 0x4D; //与定时器模式相同情况下,TOG置1,在发生匹配时,P1.3\P4.2电位直接翻转
//模块1高速方波模式
CCAPM1 = 0x4D; //与定时器模式相同情况下,TOG置1,在发生匹配时,P1.4\P4.3电位直接翻转
//模块0PWM模式
CCAPM0 = 0x42; //允许比较器比较,选择PWM开关,硬件产生PWM波,关闭比较中断CCFO
//模块1PWM模式
CCAPM1 = 0x42; //允许比较器比较,选择PWM开关,硬件产生PWM波,关闭比较中断CCF1
//公用
CR = 1; //计数器开始计数
EA = 1; //开总中断
PCA_0.Dou = 0;
PCA_1.Dou = 0; //中断内扩展定时时间
}
|
|