📄 ex7-5c.c
字号:
#include "stc12c5a.h" //包含STC12C5A60S2寄存器定义文件
sbit LED_1s=P1^6;
unsigned char cnt; //中断计数变量
void main (void)
{
cnt=200; //设置COUNTER计数器初值
CMOD=0x80; //#10000000B 空闲模式下停止PCA计数器工作
//选择PCA时钟源为fOSC/12,禁止PCA计数器溢出时中断
CCON=0; //清0 PCA计数器溢出中断请求标志位CF
//CR = 0, 不允许 PCA 计数器计数;清0 PCA 各模块中断请求标志位CCFn
CL=0; //清0 PCA 计数器
CH=0;
CCAP0L=0; //给PCA模块0的CCAP0L置初值
CCAP0H=0x1e; //给PCA模块0的CCAP0H 置初值
CCAPM0=0x49; //设置PCA模块0为16位软件定时器
//ECCF0=1允许PCA模块0中断
//当[CH,CL]=[CCAP0H,CCAP0L]时,CCF0=1,产生中断请求
EA=1; //开整个单片机所有中断共享的总中断控制位
CR=1; //启动PCA计数器(CH,CL)计数
while(1); //等待中断
}
void PCA_ISR(void) interrupt 7 //PCA中断服务程序
{
union{ //定义一个联合,以进行16位加法
unsigned int num;
struct{ //在联合中定义一个结构
unsigned char Hi,Lo;
}Result;
}temp;
//每5ms中断一次
temp.num=(unsigned int)(CCAP0H<<8)+CCAP0L+0x1e00;
CCAP0L=temp.Result.Lo; //取计算结果的低8位
CCAP0H=temp.Result.Hi; //取计算结果的高8位
CCF0=0; //清 PCA 模块0 中断标志
cnt--; //修改中断计数
if(cnt==0)
{
cnt=200; //恢复中断计数初值
LED_1s =!LED_1s; //在P1.6输出脉冲宽度为1秒钟的方波
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -