555定时器与频率测量
内容来自B站小蜜蜂老师
#include "reg52.h"
unsigned char count_t = 0; //记录时间
unsigned int count_f = 0;//频率记录
unsigned int dat_f = 0;//频率数据
//0-f 0xbf代表 -
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
//-----------------------------简单延时-----------------------------
void delay(unsigned int t)
{
while(t--);
}
//-------------------------------------------------------------------
//--------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{
switch(n)
{
case 4: P2 = P2 | 0x1f; P2 = 0x80; break;
case 5: P2 = P2 | 0x1f; P2 = 0xa0; break;
case 6: P2 = P2 | 0x1f; P2 = 0xc0; break;
case 7: P2 = P2 | 0x1f; P2 = 0xe0; break;
}
}
//--------------------------------------------------------------------
//-----------------------------系统初始化-----------------------------
void InitSystem(void)
{
Init_74HC138(5); //Y5选通
P0 = 0x00; //关闭继电器和蜂鸣器
Init_74HC138(4); //Y4
P0 = 0xff; //关闭LED
}
//----------------------------------------------------------------------
//-------------------------------数码管按位选择------------------------
//pos ->数码管的位置 dat->数码管数据
void SMG_DisplayBit(unsigned char pos ,unsigned char dat)
{
Init_74HC138(6); //Y6 ->数码管位选控制
P0 = 0x01 << pos;
Init_74HC138(7); //Y7 ->数码管段码控制
P0 = dat;
}
//关闭所有数码管
void SMG_CLOSEALL(unsigned char dat)
{
Init_74HC138(6);
P0 = 0xff;
Init_74HC138(7);
P0 = dat;
}
//---------------------------------------------------------------------
//-----------------------------定时器初始化----------------------------
void InitTimer(void)
{
//定时器0计数 8位自动重装载值 方式二
TH0 = 0xff;
TL0 = 0xff;
//定时器1定时
TH1 = (65535-50000)/256;
TL1 = (65535-50000)%256;
TMOD = 0x16;
ET0 = 1; //定时器0中断使能
ET1 = 1; //定时器1中断使能
EA = 1; //中断总开关
TR0 = 1; //启动定时器0
TR1 = 1; //启动定时器1
}
void SMG_Display_Frequent (void)
{
SMG_DisplayBit(0,SMG_Duan[15]); //F
delay(100);
SMG_DisplayBit(1,0xff);
delay(100);
SMG_DisplayBit(2,0xff);
delay(100);
SMG_DisplayBit(3,SMG_Duan[dat_f/10000]); //频率万位
delay(100);
SMG_DisplayBit(4,SMG_Duan[dat_f/1000%10]); //频率千位
delay(100);
SMG_DisplayBit(5,SMG_Duan[dat_f/100%10]); //频率百位
delay(100);
SMG_DisplayBit(6,SMG_Duan[dat_f/10%10]); //秒的十位
delay(100);
SMG_DisplayBit(7,SMG_Duan[dat_f%10]); //秒的个位
delay(100);
SMG_CLOSEALL(0xff);
delay(100);
}
//------------------------------------------------------------------
void main(void)
{
InitTimer();
InitSystem();
while(1)
{
SMG_Display_Frequent();
}
}
void ServerTimer0() interrupt 1
{
count_f++;
}
void ServerTimer1() interrupt 3
{
TH1 = (65535-50000)/256;
TL1 = (65535-50000)%256;
count_t++;
if(count_t == 20) // 1s
{
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}
总的来说对于频率的测量就是定时器的配合使用一个计数一个计时 然后算出在1s内计数的数值为该频率