这里我们所讲的开发板是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
}
}