⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex7-5c.c

📁 《增强型8051单片机实用开发技术》例程代码
💻 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 + -