单片机学习小组
直播中

李海必

8年用户 176经验值
私信 关注

单片机频率计数器程序分享(该程序能测量10至3MHZ的TTL信号频率,液晶显示4为有效数字,同时能测量脉冲占空比)

该程序能实现测量10至3MHZ的TTL信号频率,液晶显示4为有效数字,同时能够测量脉冲占空比,精度在0.5%左右...
需要硬件支持:C8051F360单片机,键盘,液晶显示器

main()

{

    int xdata flag1=0;

       float  sum1=0,sum2=0;

       float xdata sum3[10];

       int i;

       Init_device();

       LCD_REST();

       LCD_INIT();

       f=0;

       f1=0;

  while(1)

{

    if(flag)

   {

        if(f>=10&&f<=99)   额,不得不说,取11个数求平均值确实不好,读数不能稳定的说....

{

             sum2=(jishu[0]+jishu[1]+jishu[2]+jishu[3]+jishu[4]+jishu[5]+jishu[6]+jishu[7]+jishu[8]+jishu[9]+jishu[10])/11;

             get_flow(sum2);

             LCD_HZ(0x80,TAB_WORD);

             LCD_HZ(0x90,F_DISPLOW);

          flag=0;

            }

          else if(f>=100&&f<= 999)

       {

               get_flowhigh();

               LCD_HZ(0x80,TAB_WORD);

               LCD_HZ(0x90,F_DISPLOWHIGH);

               flag=0;

       }

          else if (f>=1000&&f<=9999)

          {

             get_high();

                LCD_HZ(0x80,TAB_WORD);

                LCD_HZ(0x90,F_DISPHIGH);

                flag=0;

          }

          else if(f>=10000&&f<=99999)

          {

             get_highone();

                LCD_HZ(0x80,TAB_WORD);

                LCD_HZ(0x90,F_DISPHIGHONE);

                flag=0;

          }

          else if(f>=100000&&f<=999999)

       {

           get_highone();

           LCD_HZ(0x80,TAB_WORD);

           LCD_HZ(0x90,F_DISPHIGHONE);         内部数据存储器只有128位,为节约空间与上个数组存在同一空间

                                                                                   (内部数据存储器空间用完的说...)

           flag=0;

              }

              else

              {

              get_highthree();

              LCD_HZ(0x80,TAB_WORD);

              LCD_HZ(0x90,F_DISPHIGHTHREE);

              flag=0;

              }

     }

       if((key_num&0xf0)==0)

        {   

               TR0=0;

                ET1=1;

                TMOD=0x10;

                TCON=0x40;

                for(i=0;i<10;i++)

                {

                 while(CHUFA==0);

                 TH1=0;

            TL1=0;

                  f1=0;

                     TR0=0;

                 while(CHUFA==1);

               while(CHUFA==0);

                 TR1=1;

                while(CHUFA==1);

              TR1=0;

                m=f1*65536+256*TH1+TL1;

                while(CHUFA==0);

                  TH1=0;

                TL1=0;

                f1=0;

                TR1=0;

                while(CHUFA==1);

                TR1=1;

                while(CHUFA==0);

                TR1=0;

                f=f1*65536+256*TH1+TL1;

          key_num=0xf0;

          sum1=m;

          sum2=m+f;

          sum1=sum1/sum2;

          sum3[ i]=sum1;

          }

          sum2=0;

          for(i=0;i<10;i++)

          {

            sum2=sum2+sum3[ i];

          }

          sum2=sum2/10;

             if(sum2>=0.1&&sum2<=0.40)

              {

                sum2=sum2-0.07;

                }

               else if(sum2>0.40&&sum2<=0.44)

                {

                sum2=sum2-0.04;

                }                                                                    占空比程序设计,本想用个中断来着,试验不成功简单的算了

                                                                                      由于每次运行指令要耗费时间,精度不高,故加个实测校准程序

                                                                                      O(∩_∩)O哈哈~测评时能达到0.5%的精度,踩狗屎运了...

                else if(sum2>0.44&&sum2<=0.55)

                {

                 sum2=sum2-0.02;

                }                                                            

                else if(sum2>0.55&&sum2<=0.63)

                {

                sum2=sum2+0.03;

                }

                else sum2=sum2+0.07;

          get_f(sum2);

          LCD_HZ(0x88,TAB_WORD1);

          LCD_HZ(0x98,F_DISP);

          flag1=1;

        }

        if(flag1==1)                                        让程序能范围继续测量频率

        {

            TMOD=0x51;                          

           CKCON=0;         

           TCON=0x50;

              flag1=0;

       }

}

}

更多回帖

发帖
×
20
完善资料,
赚取积分