原创 6位数显频率计数器

2008-5-3 10:02 2514 8 9 分类: MCU/ 嵌入式

1.      实验任务<?XML:NAMESPACE PREFIX = O />


利用AT89S51单片机的T0T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0250KHZ的信号频率进行准确计数,计数误差不超过±1HZ


2.      电路原理图


<?XML:NAMESPACE PREFIX = V />点击看大图


4.31.1


 


3.      系统板上硬件连线


(1).            把“单片机系统”区域中的P0.0P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。


(2).            把“单片机系统”区域中的P2.0P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。


(3).            把“单片机系统”区域中的P3.4T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。


4.      程序设计内容


(1).            定时/计数器T0T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。


(2).            T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。


5.      C语言源程序


#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,0x40};


unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};


unsigned char temp[8];


unsigned char dispcount;


unsigned char T0count;


unsigned char timecount;


bit flag;


unsigned long x;


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<8;i++)


           {


             temp=0;


           }


         i=0;


         while(x/10)


           {


             temp=x%10;


             x=x/10;


             i++;


           }


         temp=x;


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


           {


             dispbuf=temp;


           }


         timecount=0;


         T0count=0;


         TH0=0;


         TL0=0;


         TR0=1;


       }


   }


}


void t0(void) interrupt 1 using 0


{


  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;


    }


  P0=dispcode[dispbuf[dispcount]];


  P2=dispbit[dispcount];


  dispcount++;


  if(dispcount==8)


    {


      dispcount=0;


    }


}

文章评论1条评论)

登录后参与讨论

用户1469510 2008-9-5 18:28

谢谢了!!
相关推荐阅读
用户138454 2014-10-17 20:01
一种直接采用计算机串行口控制步进电机的新方法
步进电机在数控机床、医疗器械、仪器仪表等自动或半自动设备中得到了广泛应用。用计算机控制步进电机的通常作法是采用步进控制卡,系统构成如图1所 示。其中Pulse、Dir分别为控制电机的转动步数和旋转...
用户138454 2014-10-05 21:28
六西格玛管理
六西格玛管理 共享中质协指定中国黑**试教材--马林编写的《07版六西格玛管理第二版》 有需要的朋友请请链接下面的地址下载: http://dl.dbank.com/c003fa81be...
用户138454 2014-10-05 21:22
共享中质协指定中国黑**试教材--马林编写的《07版六西格玛管理第二版》
下载地址 http://dl.dbank.com/c003fa81be#...
用户138454 2014-10-05 09:54
Vc++多线程编程
留个纪念,不错的总结。十个例子清晰列举啦多线程编程的奥妙。  VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好. 一、问题的提出 编写一个耗时的单线程程序:   新...
用户138454 2014-10-05 00:23
光电开关驱动电路
光电开关基础电路,输入电压为5V,可以根据需要调整输入电压和匹配电阻。 ...
用户138454 2009-07-12 15:48
晶闸管的工作原理与应用
作者:徐国家、黄东   来源:UPS应用  中国人民解放军61539部队    徐国家中国人民解放军92857部队    黄  东1   晶闸管(SCR)晶体闸流管简称晶闸管,也称为可控硅整流元件(S...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条