基于蓝桥杯单片机的频率计数器模块简单分析

这里我们所讲的开发板是CT107D,频率计数器这一部分,比较容易。物理连接上,只需要把单片机开发版上的P34管脚和SIGNAL用跳线连接即可。
下面,我们将直接进入代码分析和频率计数器的实现原理分析。
1.实现原理
频率计数器模块,实际上是利用定时器T0来计数NE555单位时间产生的方波数。也就是1s中,T0口(P34)计数的高电平的数量。
实现这个模块,需要借用两个定时器,一个是T0,一个是T1,由于硬件布线的原因,T0定时器只能用来计数。除了计数计时模块,还需要数码管来显示频率值。
2.代码图解

#include <STC15F2K60S2.H>
#define uchar  unsigned char
#define uint   unsigned int
#define Lantch(x,y) {P0=y;P2=(P2&0x1f)|(x<<4);P2&=0x1f;}
uchar temp[5];
int shine;
uchar flag=0;
uchar code  smg_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void close_buff() //关闭外设
{
 Lantch(10,0x00);
}
void time0_init() //定时器T0初始化,用于计数
{
 TMOD|=0x05;
 TH0=0;
 TL0=0;
 TR0=1;
}
void time1_init() //定时T1初始化,用于定时
{
 TMOD|=0x00;
 TH1=(65535-1000)/256;  //1ms溢出
 TL1=(65536-1000)%256;
	TR1=1;
	ET1=1;
	EA=1;
}
void data_process()  //数据处理模块
 {
  temp[4]=shine/10000;
	 temp[3]=shine%10000/1000;
	  temp[2]=shine%1000/100;
	   temp[1]=shine%100/10;
	    temp[0]=shine%10;
	 
 }
void smg_disp() //数码管显示模块
 {
	 static uchar disp=0;
   P0=0xff;
	 P2=(P2&0x1f)|0xe0;
	 P2&=0x1f;
   P0=0x10>>disp;
   P2=(P2&0x1f)|0xc0;
	 P2&=0x1f;
	 P0=smg_duan[temp[disp]];
	 P2=(P2&0x1f)|0xe0;
	 P2&=0x1f;
	 if(++disp==5)  disp=0;

 }
 
 void main()
 {
   close_buff();
	 time1_init();
	 time0_init();
	 while(1)
	 {
	   if(flag==1)
		 {
		  flag=0;    //扫描标志位清零
			 TR1=0;    //停止T1计时
			 TR0=0;    //停止T0计数
			 shine=TH0*256+TL0;
		   TH0=0; //清零,用于下次计数
			 TL0=0;
		   TR0=1; 
			 TR1=1;
		 }
	 }
 }
 
 void time1()  interrupt 3
  {
   static int i;
		data_process();
		smg_disp();
		if(++i==1000) 
		{
		   i=0;
			 flag=1; //计时达到1s,标志位置1
		}
		
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值