这个是蓝桥杯单片机LM555频率测量,讲解在代码中。
/**************************LM555频率测量********************************/
//原理:1s内LM555产生的脉冲数,定时器0/1分别作为定时器/计数器使用。
//测量时需把板子最左侧P34、SIGNAL短接
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uc unsigned char
#define ui unsigned int
ui F=0;
ui count_f=0;
uc count1=0;
uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0x8c,0x88};//0-9,-,关闭,C
uc code tac[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void hc138(uc n)//138译码器
{
switch(n)
{
case 4:P2=(P2&0x1f)|0x80;break;
case 5:P2=(P2&0x1f)|0xa0;break;
case 6:P2=(P2&0x1f)|0xc0;break;
case 7:P2=(P2&0x1f)|0xe0;break;
}
}
void delay()//延时1毫秒
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void OutputSMG(uc gqb,uc yxl)//数码管输出函数
{
hc138(6);
P0=0x01<<yxl;
hc138(7);
P0=gqb;
delay();
}
void OutputP0(uc add,uc dat)//输出函数
{
hc138(add);
P0=dat;
}
//初始化
void Initsystem()
{
OutputP0(4,0xff);
OutputP0(5,0x00);
OutputP0(6,0x00);
OutputP0(7,0x00);
}
//如何把定时器用作计数器(以定时器0为例)见手册486页
/*
TMOD寄存器第2/7(C/T)位分别控制定时器0/1的工作方式。
当C/T=0:用作定时器;
当C/T=1;用作计数器;
辅助寄存器AUXR对定时器0/1而言只涉及到分频(1T/12T),与计数器无关,因此使用计数器时不考虑AUXR。
计数器0:TMOD=0x04;(把对应C/T 置1就行)
计数器初值必须都是0xff使脉冲数溢出。
*/
//定时器0和定时器1的配置
void TimerInit(void)//@12.000MHz
{
AUXR &= 0xBF;//定时器时钟12T模式
TMOD = 0x04;//有计数器不能加 & 符号
TL0 = 0xff; //定时器0计数
TH0 = 0xff;
TL1 = 0xB0; //定时器1 50ms
TH1 = 0x3C;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET1 = 1;
ET0 = 1;
}
//定时器0服务函数
void Timer0() interrupt 1
{
count_f++; //获取频率计数
}
//定时器0服务函数
void Timer1() interrupt 3
{
count1++;//获取1s计数值 等似 频率
if(count1==20)//1S
{
F=count_f;//获取频率值
count1=0;
count_f=0;
}
}
//频率显示(把条件判断好就行了)
void SMG_PL()
{
OutputSMG(0X8e,0);
OutputSMG(0Xff,1);
OutputSMG(0Xff,2);
if(F>9999)
OutputSMG(tab[F/10000],3);
if(F>999)
OutputSMG(tab[F%10000/1000],4);
if(F>99)
OutputSMG(tab[F%1000/100],5);
OutputSMG(tab[F%100/10],6);
OutputSMG(tab[F%10],7);
}
/*****主函数****/
void main()
{
Initsystem();
TimerInit();
while(1)
{
SMG_PL();
}
}