/**************************************************************************************
实验现象: 下载程序后,使用示波器可以测量P1.7和P1.6口有高速脉冲信号输出
接线说明:
注意事项: USB连接线给开发板通电下载程序,STC下载软件中内部IRC时钟选择11.0592MHZ
***************************************************************************************/
#include "STC8.H"
#include "intrins.h"
#define MAIN_Fosc 11059200L //定义主时钟
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
#define T38K4HZ (11059200L/2/38400)
#define T76K8HZ (11059200L/2/76800)
uint16 value1;
uint16 value2;
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/***********************
功能描述:PCA初始化
入口参数:无
返回值:无
************************/
void PCAInit(void)
{
P_SW1 &= 0xCF; //选择PCA模块0为引脚P1.7,选择PCA模块1为引脚P1.6
//选择PCA模块2为引脚P1.5,选择PCA模块3为引脚P1.4
CCON = 0x00; //CF、CR、CCF3、CCF2、CCF1、CCF0位均清零
CMOD &= 0x7F; //CIDL位置0,空闲模式下PCA计数器仍然工作
CMOD &= 0xF1; //CP2、CP1、CP0设置为100,PCA时钟源选择为系统时钟
CMOD |= 0x08; //CP2、CP1、CP0设置为100,PCA时钟源选择为系统时钟
CMOD &= 0xFE; //ECF位置0,禁止寄存器CCON中CF位中断(禁止PCA计时中断)
CL = 0x00; //PCA计数器赋初值
CH = 0x00; //PCA计数器赋初值
//PCA模块0初始化部分
CCAPM0 |= 0x40; //ECOM0位置1,允许比较器功能
CCAPM0 &= 0xDF; //CAPP0位置0,禁止上升沿捕获
CCAPM0 &= 0xEF; //CAPN0位置0,禁止下降沿捕获
CCAPM0 |= 0x08; //MAT0位置1,开启匹配控制位
CCAPM0 |= 0x04; //TOG0位置1,开启翻转控制位
CCAPM0 &= 0xFD; //PWM0位置0,禁止PWM模式
CCAPM0 |= 0x01; //ECCF0位置1,开启CCF0中断
value1 =T38K4HZ; //value1赋值
CCAP0L = value1; //PCA比较值寄存器赋初值
CCAP0H = value1>>8; //PCA比较值寄存器赋初值
//PCA模块1初始化部分
CCAPM1 |= 0x40; //ECOM1位置1,允许比较器功能
CCAPM1 &= 0xDF; //CAPP1位置0,禁止上升沿捕获
CCAPM1 &= 0xEF; //CAPN1位置0,禁止下降沿捕获
CCAPM1 |= 0x08; //MAT1位置1,开启匹配控制位
CCAPM1 |= 0x04; //TOG1位置1,开启翻转控制位
CCAPM1 &= 0xFD; //PWM1位置0,禁止PWM模式
CCAPM1 |= 0x01; //ECCF1位置1,开启CCF1中断
value2 =T76K8HZ; //value2赋值
CCAP1L = value2; //PCA比较值寄存器赋初值
CCAP1H = value2>>8; //PCA比较值寄存器赋初值
value1 +=T38K4HZ; //value1再赋值
value2 +=T76K8HZ; //value2再赋值
CR = 1; //启动PCA计数器阵列计数
EA = 1; //使能总中断
}
/***************************************************************************
* 描 述 : 主函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
int main()
{
PCAInit(); //PCA模块初始化
while(1)
{
}
}
/**************************************
功能描述:PCA中断服务程序(每5ms进入一次PCA中断)
入口参数:无
返回值:无
***************************************/
void PCA_int (void) interrupt 7
{
if(CF) //PCA计数器溢出
{
CF = 0; //将PCA计数器阵列溢出标志位软件清零
}
if(CCF0) //PCA计数器溢出
{
CCF0 = 0; //将PCA计数器阵列溢出标志位软件清零
CCAP0L=value1; //取计算结果的低8位
CCAP0H=value1>>8; //取计算结果的高8位
value1 +=T38K4HZ; //value1再赋值
}
if(CCF1) //PCA计数器溢出
{
CCF1 = 0; //将PCA计数器阵列溢出标志位软件清零
CCAP1L=value2; //取计算结果的低8位
CCAP1H=value2>>8; //取计算结果的高8位
value2 +=T76K8HZ; //value2再赋值
}
}