#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。
看看那里设置的不对。