|
stc12c5a60s2单片机 捕获模式 测频率的问题 求助各位老师
[复制链接]
我用的是stc12c5a60s2 用捕获模式测量方波频率 希望测几十hz到十几khz的频率 我写了一段程序 但是真的不知道问题出在哪 希望老师能帮我看看 我的问题出在哪里 先跪谢了。。。
/**********************************************************PCA初始化函数**************************************************************************/
//pwm模块初始化,并开启中断
void pca1_init()
{
CMOD=0x80; // 系统时钟12分频 小周期为1us 不允许溢出中断
CCON=0; //各个标志位清零(CR,CF溢出标志,CFFn捕获标志)
CCAPM1=0x21; // 设置为16位CEXn上升沿触发捕捉功能 并开启捕捉中断
CCAP1L=0;
CCAP1H=0; //捕捉寄存器清零
CL=0;CH=0; //计时器清零
}
/***************************************************** 中断服务程序 ***************************************************************************/
void pca_intr(void) interrupt 7 //中断服务程序
{ if(CCF1)
{ CCF1=0; //清楚标志位
if(capture1==0) //判断是否首个上升沿
{ capture1=CCAP1H;
capture1=(capture1<<8)+CCAP1L; //将首次捕获值装入capture1中
}
else //若是第二个上升沿
{
capture2=CCAP1H;
capture2=(capture2<<8)+CCAP1L; //将第二次捕获值装入capture2中
CCAP1L=CCAP1H=0; // 清零捕获寄存器
CL=CH=0; //计时器清零
CR=0; //关闭计时器
EA=0; //关闭中断
capture_ok=1;
}
}
}
/***************************************************************** 主函数 ****************************************/
void main()
{
P1_6=1;P1_7=1;
while(1)
{
if(P1_6==0) // P1.6作为初始化控制键
{
delay(50); //消抖动
if(P1_6==0)
{
capture_ok=0; // 捕获完成标志位清零
pca1_init(); // 开启捕获中断CCAPM0
EA=1; //允许中断
CR=1; // 开启PCA定时器
}
}
if(capture_ok)
{
capture_ok=0;
period=capture2-capture1; //计算一个脉冲周期共计数多少次
frequency=1000000/period; // 计算频率
led_display(frequency); //调用显示函数
}
}
}
|
|