利用CCP1模块设计的数字频率计

[09-13 23:35:33]   来源:http://www.88dzw.com  电视机电路   阅读:8941

文章摘要:{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加1if(COUNTER>4) COUNTER=0x01;//若COUNTER超过4,则又从1计起}if(data==0x02) {COUNTER=COUNTER-1; //若按下S11键,则C

利用CCP1模块设计的数字频率计,标签:电视机电路,电路设计,http://www.88dzw.com
  {
  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(COUNTER<1) 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,则需要进行周期处理

上一页  [1] [2] [3]  下一页


Tag:电视机电路电视机电路,电路设计家电维修 - 单元电路介绍 - 电视机电路

《利用CCP1模块设计的数字频率计》相关文章