英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
查看: 3054|回复: 2

ccp功能测频率 zhuan

[复制链接]
发表于 2012-8-22 14:40:02 | 显示全部楼层 |阅读模式
////////////////////////////////////////////////
//  Author     :   Toby
//  REV0.1     :  改了晶体
//  Date       :   2009/04/15
//  Function   :   用来测量输入信号的周期,数码管是显示的单位是ms
//  MCU        :   PIC16F877A,晶体4M
//  C Compiler :   PICC 8.05
//  IDE        :   MPLAB IDE v8.10               
/////////////////////////////////////////////////

#include  <pic.h>
__CONFIG(0x3f3a);//烧写配置位
void delay(void);//延迟函数
void display(void);//显示函数
void   initial(void);//系统初始化函数
union  _lastCap    //定义一个共用体用来存放CCP铺捉到的最后一次值
     {
         unsigned int  a;
         unsigned  char  Cap[2];
     }lastCap;
union  CCP1I //定义一个共用体用来存放CCP铺捉到的先前的一次值
     {
         unsigned int  b;
         unsigned  char  ccp[2];
     }ccpi;
const unsigned char TABLE[11]={ 0x0C0, 0x0F9, 0x0A4,0x0B0, 0x99, 0x92,0x82, 0x0F8,0x80,0x90,0x0ff};//LED段码
const unsigned char kanguan[4]={0B00010000,0B00100000,0B01000000,0B10000000,};//LED亮灭开关
unsigned int   disp[4]={0,0,0,0};
unsigned int  period=0.0;
void delay()//延迟函数
{  
  unsigned  char i;
    for(i=125;--i;)
    asm("nop");
}


void   initial() //系统各输入输出口初始化子程序
{
  TRISB=0;
  TRISD=0;
  INTCON=0;
  TRISC=0B00000100;//CCP1引脚为输入
  CCP1IE=1;//允许中断
  T1CON=0B01;//设置TMR1,以内部时钟并按1:1计时
  CCP1CON=0B101;//捕捉每个上升沿
  PEIE=1;//外中断开启
  GIE=1;//全届中断开启
  
}

void display()//显示程序
    {   
         unsigned int a,k;
         unsigned int a=period;
         a=(1.0/a)*1000*1000; // 时间的倒数就为频率,
         disp[0]=a/1000;   //period的值为时间,所以LED上显示的是输入信号的周期
      disp[1]=a%1000/100;
      disp[2]=a%100/10;
         disp[3]=a%10;
       for(k=0;k<4;k++)
           {  
              PORTD=kanguan[k];
              if(k==0)  PORTB=TABLE[disp[k]]&0x7f;    else   PORTB=TABLE[disp[k]];
              delay();
           }
           
     }
               
//中断服务程序
void interrupt CCP1(void)
{   
  if(CCP1IF)//判断是否是ccp1中断
{
   CCP1IF=0;
   ccpi.ccp[0]=CCPR1L;    //第一次捕捉的值
   ccpi.ccp[1]=CCPR1H;
   period=ccpi.b-lastCap.a; //相减后就得到捕捉真实值
   lastCap.Cap[0]=CCPR1L;  //第二次捕捉的值
   lastCap.Cap[1]=CCPR1H;
   
}
}


void main ()
{

     initial();//系统各输入输出口初始化子程序
  
   while(1){
               display();   //显示输入信号频率的周期
                    
            }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

请看x.co/3339(网址) 肺炎,最新消息 ,国内和国外不一样的报道.海外更真实...... git.io/gjjjj (网址)  发表于 2020-8-3 14:48
发表于 2020-7-29 16:45:13 | 显示全部楼层
等有流量了,再看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2020-9-22 09:49 , Processed in 0.088452 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表