【C51】基于51单片机的简易频率计(附代码、无需外设、小白简单易上手)

基于51单片机的简易频率计(无需外设、小白简单易上手)


  代码较为简单,大概思路是通过定时器单位时间内外部中断上升沿触发的次数来计算实际频率。

/基于51单片机的简易频率计

#include<reg51.h>
#include<intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int

sbit P11=P1^1;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //七段显示0到9
/////////////////////// 0    1   2    3   4     5    6    7    8   9 	     //无小数点
uchar code LEDcode01[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 	 //七段显示0到9
///////////////////////////// 0    1   2    3   4     5    6    7    8   9 	    //有小数点
uchar date1=0,date2=0,date3=0,date4=0;
uint count=0,time_count=0,sum=0;

  int H,L;
void aaa(void);
 void delay(n);
 void initial();
 void delayms(uint t)
{
	uint a;
	for(;t>0;t--)
		for(a=0;a<200;a++);		  //延时函数
}
  

  

void initial()			   //定时器初始化
{
 TMOD |=0x12;					  //使用模式2,16位定时器
 TH0=0x06;				//	 0.25ms
 TL0=0x06;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开  
 EX0 = 1;
 IT0 = 1;

	H=0Xfe;
	L=0X14;
//	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
	TH1=0xfe;			//重新赋值,方式1是16位计数器,不能硬件重装初始值
    TL1=0x14;			    //定时0.01ms
//	EA=1;            //总中断打开
	ET1=1;           //定时器中断打开
	TR1=1;           //定时器开关打开
	EX1=1;
	IT1=0;
//	PX0=1;
//	PX1=1;
}
  void input() interrupt 0
{
	  count++;

	}


 void timer0() interrupt 1
{
	time_count++;
	if(time_count==4000)
	{
		sum=count;
		time_count=0;
		count=0;
	}
}
 void Timer0_isr(void) interrupt 3 using 1
{
	TH1=H;		  //重新赋值,方式1是16位计数器,不能硬件重装初始值
	TL1=L;
	P11=!P11;	 
}	 
  void Key_INT1(void) interrupt 2 using 2
{
	 delayms(800);
	 H=H;
	 L=L+10;
/*	 if(L<256)
	 {    
  		H=H;
		L=L+10;
	}
	else if(L>256)
	{
		H=0xff;
		L=L-256+10;
	}
	else if(H=0xff  && L>0x14)
	  {
	  	H=0xfe;
		L=0x14;
	  }	*/


}

 

void aaa(void)			                  //共阳极数码管显示函数,注意小数点使用table1数组
{	
	char qian,shi,ge,bai;
	qian=sum/1000;
	bai=(sum%1000)/100;
	shi=(sum%100)/10;
	ge=(sum%10);		   //取百分位
	P2=0x17;			                  //片选
	P0=table[ge];
	delay(1);			  
	P0=0xff;			                 //段选

	P2=0x1b;
	P0=table[shi];
	delay(1);
	P0=0xff;

	P2=0x1d;
	P0=table[bai];
	delay(1);
	P0=0xff;

	  P2=0x1e;
	P0=table[qian];
	delay(1);
	P0=0xff;
		
}
 void delay(int n)			                  //延时函数,大概1ms左右
{
int m,d;
for(m=92;m>0;m--)
for(d=n;d>0;d--);
}	
  main()
{	 
initial()	;
  	while(1)
	{
	   
	   aaa()	;
	
	}

  }
//阿汪先生的博客.ws
发布了18 篇原创文章 · 获赞 73 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43499622/article/details/99709214