⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pinlvji.c

📁 能准确测量输入频率
💻 C
字号:
/*****************************************************************************
*    频率计程序
*    作者 :张建高
*    Email:9902013327@163.com
*    单片机采用AT89S52,晶振频率为:12.00MHz。
/******************************************************************************/
#include <AT89X51.H>

unsigned char code SEG_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                          0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数字代码段
unsigned char code DS_Tab[]={0x01,0x02,0x04,0x08};//位选代码

unsigned char display_buf[]={0,0,0,0};//要显示的数值

unsigned char digit;

sfr SEG_OUT = 0x80;
sfr DS_OUT  = 0xa0;

unsigned char temp[4];
unsigned char T0count;
unsigned char timecount;
unsigned long x;
bit flag; //定义变量

void main(void)
{
  unsigned char i;
  TMOD=0x15;
  TH0=0;
  TL0=0;
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  TR1=1;
  TR0=1;
  ET0=1;
  ET1=1;
  EA=1;//开中断
  
 while(1)
   {
     if(flag==1)
       {
         flag=0;
         x=T0count*65536+TH0*256+TL0;//频率转换为数值
         for(i=0;i<4;i++)
           {
             temp[i]=0;
           }
         i=0;
         while(x/10)//数值赋给那一位
           {
             temp[i]=x%10;
             x=x/10;
             i++;
           }
         temp[i]=x;
         for(i=0;i<4;i++)
           {
             display_buf[i]=temp[i];
           }
         timecount=0;
         T0count=0;
         TH0=0;
         TL0=0;
         TR0=1;//把T0计数器清0
       }
   }
}

void time0(void) interrupt 1 using 1
{ 
  T0count++; 
}

void t1(void) interrupt 3 using 0
{
  TH1=(65536-4000)/256;//产生一秒的定时
  TL1=(65536-4000)%256;
  timecount++;
  if(timecount==250)
    {
      TR0=0;
      timecount=0;
      flag=1;
    }
  SEG_OUT = SEG_Tab[display_buf[digit]];//P0口的数据显示
  DS_OUT = DS_Tab[digit];//P2口的位选
  if(++digit > 3)
    digit = 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -