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

📄 frcount.c

📁 利用单片机定时计数器
💻 C
字号:
/*--------------------------------------------------
程序功能:利用单片机定时计数器,测量信号频率
入口参数:
出口参数:
程序编写:zqp
创建时间:2007-8-9
联系方式:QQ:30871641
修改日志:
    NO.1:显示定时时间改为10MS,便于软件仿真
---------------------------------------------------*/
#include <AT89X52.H> 

unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,           //位选通代码

                                 0xef,0xdf,0xbf,0x7f}; 

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴代码

unsigned char dispbuf[8]={0,0,0,0,0,0,10,10}; 	//显示缓冲区,只用六位

unsigned char temp[8]; 		//暂存数组

unsigned char dispcount; 	//显示计数变量

unsigned char T0count; 		//T0计数变量

unsigned char timecount; 	//定时计数变量

bit flag; 			//1秒到标志位

unsigned long x; 		//被测频率值(没处理)

/*--------------------------------------------------
程序功能:初始化,处理数据,T0用作计数
入口参数:
出口参数:
---------------------------------------------------*/ 

void main(void) 

{ 

  unsigned char i; 

  TMOD=0x15;                         //T1用作定时,定时方式1,T0用作计数,方式1

  TH0=0;                             //T0计数初值为0

  TL0=0; 

  TH1=(65536-10000)/256;             //T1定时10ms

  TL1=(65536-10000)%256; 

  TR1=1;                            //启动定时器T1

  TR0=1;                            //启动计数器T0

  ET0=1;                            //允许TO中断

  ET1=1;                            //允许T1中断

  EA=1;                             //允许总中断

  

  while(1) 

   { 

     if(flag==1) 

       { 

         flag=0; 

         x=T0count*65536+TH0*256+TL0;                    //处理一秒内计的脉冲个数

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

           { 

             temp[i]=0; 

           } 

         i=0; 

         while(x/10)                                  //把计数结果各位分离出来,保存在数组temp[]中

           { 

             temp[i]=x%10; 

             x=x/10; 

             i++; 

           } 

         temp[i]=x; 

         for(i=0;i<6;i++)                          //把数组temp[]中的计数结果传送给数组dispbuf[]

           { 

             dispbuf[i]=temp[i]; 

           } 

         timecount=0;                           //计时变量清零

         T0count=0;                             //计数变量清零

         TH0=0;                                 //计数器T0初值清零

         TL0=0; 

         TR0=1;                                 //重起计数器T0

       } 

   } 

} 
/*--------------------------------------------------
程序功能:T0中断服务程序
入口参数:
出口参数:T0count
---------------------------------------------------*/  
void t0(void) interrupt 1 using 0 

{ 

  T0count++; 		//T0计数,当TH0,TL0计数溢出后,T0count加1,即计数65536后

} 
/*--------------------------------------------------
程序功能:T1中断服务程序  显示数据
入口参数:
出口参数:TR0,  flag, P0口位选通口, P2口数据口
---------------------------------------------------*/
void t1(void) interrupt 3 using 0 

{ 

  TH1=(65536-10000)/256; 

  TL1=(65536-10000)%256; 

  timecount++; 

  if(timecount==100)                          //如果一秒到

    { 

      TR0=0;                                  //停止计数

      timecount=0;                            //计时变量清零

      flag=1;                                 //标志变量置1,通知主程序进行数据处理

    } 

  P2=dispcode[dispbuf[dispcount]]; 	

  P0=dispbit[dispcount]; 

  dispcount++; 

  if(dispcount==8) 

    { 

      dispcount=0; 

    } 

}

⌨️ 快捷键说明

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