• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PIC单片机频率捕捉

#include

#include

#include

__CONFIG(0X3F3A);

const char seg[]={0xc0,0xf9,0xa4,0xb0,0x92,0x82,0xd8,0x80,0x90,0xff};

bank3 int cplz[11];//定义一个数组,用于存放各次的捕捉值

union cp1{int y1;

            unsigned char cple[2];

            }cplu;

unsigned char count,data;//测量脉冲个数寄存器

int T5;

double RE5;

double puad5;

char s1,s2,s3,s4;

//ccp模块工作于捕捉方式初始化子程序

void ccpint()

    {CCP1CON=0X05;//设置捕捉上升沿

    T1CON=0X00;//关闭T1振荡器

    PEIE=1;

    CCP1IE=1;

    TRISC2=1;

    }

//系统其他部分初始化子程序

void initial()

    {

    count=0x0b;

    TRISB=0X00;

    TRISD=0X00;

    }

void delay(int x)

    {    

    int y,ms;

    for(y=0;y

    for(ms=0;ms<200;ms++);

    }

//数码管显示函数

void display(char num1,char num2,char num3,char num4)

    {

    PORTB=0b11110001;

    PORTD=seg[num1];

    delay(1);

    PORTB=0b11110010;

    PORTD=seg[num2];

    delay(1);

    PORTB=0b11110100;

    PORTD=seg[num3];

    delay(1);

    PORTB=0b11111000;

    PORTD=seg[num4];

    }

//中断服务程序

void interrupt cp()

{

    CCP1IF=0;

    cplu.cple[0]=TMR1L;

    cplu.cple[1]=TMR1H;

    cplz[data]=cplu.y1;

    CCP1CON=CCP1CON^0X01;

    data++;

    count--;

}

void freq()

{

    T5=cplz[10]-cplz[0];

    RE5=(double)T5;

    RE5=RE5/5;

    T5=1000000/RE5;

}

void main()

{

while(1)

{

ccpint();

initial();

display(s1,s2,s3,s4);

data=0x00;

TMR1H=0;

TMR1L=0;

CCP1IF=0;

PEIE=1;

ei();

TMR1ON=1;

while(1)

{

if(count==0)break;

}

di();

PEIE=0;

TMR1ON=0;

freq();

display(s1,s2,s3,s4);

}

}

如上是一个捕捉方波然后在数码管上显示出频率的一个程序。编译没什么问题,能通过,可是显示屏始终只显示0。

看看那里设置的不对。

全部回复(1)
正序查看
倒序查看
2014-05-11 18:28
首先看看你的显示程序有没有问题,确保显示程序没有问题了再去搞频率捕捉!
0
回复