微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 简易数字频率计设计与应用

简易数字频率计设计与应用

时间:01-06 来源:互联网 点击:

for(COUNTW=0;COUNTW4;COUNTW++){

data=s[COUNTW];

data=data0x0F;

if(COUNTW==k) data=table0[data];//第二位需要显示小数点

else data=table[data];

SPILED(data); //发送显示段码

}

for(COUNTW=0;COUNTW4;COUNTW++){

data=0xFF;

SPILED(data); //连续发送4个DARK,使显示好看一些

}

RA5=1; //最后给一个锁存信号,代表显示任务完成

}

//键盘扫描子程序

void keyscan( )

{

if((RB4==0)||(RB5==0)) FLAG1=1 ;//若有键按下,则建立标志FLAG1

else FLAG1=0 ; //若无键按下,则清除标志FLAG1

}

//键服务子程序

void keyserve( )

{

PORTB=0XFD ;

if(RB5==0) data=0X01;

if(RB4==0) data=0X03;

PORTB=0XFB;

if(RB5==0) data=0X02;

if(RB4==0) data=0X04; //以上确定是哪个键按下

PORTB=0X00; //恢复PORTB的值

if(data==0x01) {

COUNTER=COUNTER+1; //若按下S9键,则COUNTER加1

if(COUNTER>4) COUNTER=0x01;//若COUNTER超过4,则又从1计起

}

if(data==0x02) {

COUNTER=COUNTER-1; //若按下S11键,则COUNTER减1

if(COUNTER1) COUNTER=0x04;//若COUNTER小于1,则又循环从4计起

}

if(data==0x03) FLAG2=1 ; //若按下S10键,则建立标志FLAG2

if(data==0x04) FLAG2=0 ; //若按下S12键,则清除标志FLAG2

}

//中断服务程序

void interrupt cp1int(void)

{

CCP1IF=0; //清除中断标志

cp1u.cp1e[0]=CCPR1L;

cp1u.cp1e[1]=CCPR1H;

cp1z[data]=cp1u.y1; //存储1次捕捉值

CCP1CON=CCP1CON^0X01; //把CCP1模块改变成捕捉相反的脉冲沿

data++;

COUNT--;

}

//周期处理子程序

void PERIOD( )

{

T5=cp1z[10]-cp1z[0]; //求得5个周期的值

RE5=(double)T5; //强制转换成双精度数

RE5=RE5/5; //求得平均周期,单位为μs

}

//频率处理子程序

void FREQUENCY( )

{

PERIOD( ); //先求周期

RE5=1000000/RE5; //周期值求倒数,再乘以1 000 000,得频率,

//单位为HZ

}

//脉宽处理子程序

void PULSE( )

{

int pu;

for(data=0,puad5=0;data=9;data++) {

pu=cp1z[data+1]-cp1z[data];

puad5=(double)pu+puad5;

data=data+2;

} //求得5个脉宽的和值

RE5=puad5/5; //求得平均脉宽

}

//占空比处理子程序

void OCCUPATIONAL( )

{

PULSE( ); //先求脉宽

puad5=RE5; //暂存脉宽值

PERIOD(); //再求周期

RE5=puad5/RE5; //求得占空比

}

//主程序

main( )

{

SPIINIT( ); //SPI方式显示初始化

while(1) {

ccpint(); //CCP模块工作于捕捉方式初始化

initial(); //系统其它部分初始化

if(FLAG2==0) {

s[0]=COUNTER; //第一个存储COUNTER的值

s[1]=0X0A;

s[2]=0X0A;

s[3]=0X0A; //后面的LED将显示DARK

}

display( ); //调用显示子程序

keyscan(); //键盘扫描

data=0x00; //存储数组指针赋初值

TMR1H=0;

TMR1L=0; //定时器1清0

CCP1IF=0; //清除CCP1的中断标志,以免中断一打开就进入

//中断

ei( ); //中断允许

TMR1ON=1; //定时器1开

while(1){

if(COUNT==0)break;

} //等待中断次数结束

di(); //禁止中断

TMR1ON=0; //关闭定时器

keyscan(); //键盘扫描

if(FLAG1==1) keyserve() ; //若确实有键按下,则调用键服务程序

if(FLAG2==0) continue; //如果没有按下确定键,则终止此次循环,

//继续进行测量

//如果按下了确定键,则进行下面的数值转换和显示工作

if(COUNTER==0x01) FREQUENCY(); //COUNTER=1,则需要进行频率处理

if(COUNTER==0x02) PERIOD(); //COUNTER=2,则需要进行周期处理

if(COUNTER==0x03) OCCUPATIONAL();//COUNTER=3,则需要进行占空比处理

if(COUNTER==0x04) PULSE(); //COUNTER=4,则需要进行脉宽处理

k=5;

if(RE51){

RE5=RE5*1000; //若RE51,则乘以1 000,保证小数点的精度

k=0x00;

}

else if(RE510){

RE5=RE5*1000; //若RE510,则乘以1 000,保证小数点的精度

k=0x00;

}

else if(RE5100){

RE5=RE5*100; //若RE5100,则乘以100,保证小数点的精度

k=0x01;

}

else if(RE51000){

RE5=RE5*10; //若RE51000,则乘以10,保证小数点的精度

k=0x02;

}

else RE5=RE5 ;

uo=(int)RE5;

sprintf(s,%4d,uo); //把需要显示的数据转换成4位ASII码,且放入数

//组S中

display();

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top