哪位前辈有空帮我指导一下,我刚学PIC,在学习CCP模块中比较输出,想在CCP1引脚输出脉冲波形,用Proteus仿真时,就是搞不懂为什么输出周期约为65.5ms?CCPR1寄存器的值与TMR1的值相符时进入中断时,TMR1的值得怎么比CCPR1的值要大?先在这里说声谢谢了
/********************************************
标题:CCP 比较功能模式
硬件支持:proteus (pic 16F877)4MHZ
日期:2010.09.27
说明:
CCPRXH:CCPRXL 的值与 TMR1的寄存器值相符,引脚电平变化
问题:周期为什么是固定不变的,进入中断前TMR1就已经溢出了? ?
***********************************************/
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
void init();
/****************************************************************************
* 名 称:main()
* 功 能:
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void main()
{
init();
while(1);
}
/****************************************************************************
* 名 称:init()
* 功 能:CCP1寄存器设置
* 入口参数:
* 出口参数:
* 说 明:
****************************************************************************/
void init()
{
TRISC2=0;//CCP引脚作为输出
CCP1IE=1;//CCP1模块中断使能位
TMR1H=0x00;
TMR1L=0x00;
T1CON=0X01;//TMR10N=1
CCP1CON=0x08;//1000 比较模式,相等输出高电平
CCPR1H=0x00;
// CCPR1H=0x0f;
CCPR1L=0xff;
PEIE=1;//外围中断使能
GIE=1; //总中断使能
}
/****************************************************************************
* 名 称:interrupt timer()
* 功 能:中断
* 入口参数:
* 出口参数:
* 说 明:改变CCPR1H:CCPR1L的值,就可以改变频率
****************************************************************************/
void interrupt timer()
{
if(CCP1IF)
{
CCP1IF=0;
if(CCP1CON==0x08)//是否输出高电平
{
CCPR1H=0x01;
CCPR1L=0x0;
CCP1CON=0x09;//di电平
}
else //输出低电平
{
CCPR1H=0xdf;
CCPR1L=0x00;
CCP1CON=0x08;//高电平
}
}
}
桌面.zip
(199.48 KB)
|