一、555定时器&频率测量
1. 电路原理
NE555是一种时钟芯片
,输出一定频率的脉冲信号。就其模块特性,简单点来说,该模块会根据Rb3
电位器的阻值,在SIG
脚输出相应的频率的脉冲信号。
第十届竞赛中对该模块设置了考点,要求测量其脉冲信号的频率,测量周期小于1秒。
赛方要求将该模块的输出脚SIGNAL
与P34
,用一块与比赛无关的短接片接起来(如红外/超声波的)如下图。通过查阅芯片手册,可知P34
也是T0计数器
的管脚
2. 驱动方法
让T0
工作在计数模式下,而计数的引脚就是我们的P34
,进行频率测量的时候,将定时器0
计数初值设为0,然后利用另外一个定时器来限定时间在1S或者几秒内,在规定时间完后,停止计数,将定时器0
的值取出来,看有多少个脉冲,然后用总脉冲量/总时间
,得出的即为脉冲的周期
即频率。
二、参考程序
sys.c
#include "sys.h"
extern bit MEA_FREQ_FLAG;
/**
*@brief 外设初始化
*@param[in] none
*@return none
**/
void ALL_Init()
{P2 = (P2&0x1f)|0xa0; //打开Y5CP0 = 0x00; //关闭蜂鸣器&继电器P2 = (P2&0x1f)|0xe0; //打开Y7CP0 = 0xff; //关闭数码管P2 = (P2&0x1f)|0x80; //打开Y4CP0 = 0xff; //关闭LEDP2 = P2&0x1f; //关闭所用使能
}/**
*@brief 74HC138译码器通道选择
*@param[in] channel (通道)
*@return none
**/
void HC138_Set(u8 channel)
{switch(channel){case 0: P2 = P2 & 0x1f; break; //关闭所有通道case 4: P2 = (P2&0x1f)|0x80; break; //选择Y4对应的模块 (LED), 运算结果为P2高三位 100case 5: P2 = (P2&0x1f)|0xa0; break; //选择Y5对应的模块 (蜂鸣器), 运算结果为P2高三位 101case 6: P2 = (P2&0x1f)|0xc0; break; //选择Y6对应的模块 (数码管位选), 运算结果为P2高三位 110case 7: P2 = (P2&0x1f)|0xe0; break; //选择Y7对应的模块 (数码管段选), 运算结果为P2高三位 111}
}void Timer1Init(void) //1毫秒@12.000MHz
{AUXR &= 0xBF; //定时器时钟12T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0x18; //设置定时初值TH1 = 0xFC; //设置定时初值TF1 = 0; //清除TF1标志TR1 = 1; //定时器1开始计时ET1 = 1;
}void Timer0Init(void)
{AUXR |= 0x80; //定时器时钟12T模式TMOD |= 0x04; //计数器0 16位自动重载TH0 = 0;TL0 = 0;TF0 = 0;TR0 = 1; //计数器0 开始计算
}
//测量ne555频率
void Mea_Freq() interrupt 3
{static uint i;i++;if(i==500){//每500Ms测量一次脉冲MEA_FREQ_FLAG = 1;i = 0;}Nixie_Scan();
}
nixe.c
#include "sys.h"// 0 1 2 3 4 5 6 7
uchar code nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,// 8 9 a b c d e f u0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc1,0xff}; //共阳数码管码字uchar NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};uchar smg1,smg2,smg3,smg4,smg5,smg6,smg7,smg8;
uchar code Symbol[] = {0xff,0xbf}; //全灭,-void Nixie_Scan()
{static u8 index;HC138_Set(7);P0 = 0XFF;HC138_Set(6);P0 = 0X01 << index;HC138_Set(7);P0 = NixieBuff[index];HC138_Set(0);index++;index &= 0x07;
}void Nixie_Show(u16 dat)
{smg1 = 15;smg2 = smg3 =17;smg4 = dat/10000;smg5 = dat%10000/1000;smg6 = dat%1000/100;smg7 = dat%100/10;smg8 = dat%10;if(smg4 == 0) //消0{smg4 = 17;if(smg5 == 0){smg5 = 17;if(smg6 == 0){smg6 = 17;}}}NixieBuff[0] = nixie[smg1];NixieBuff[1] = nixie[smg2];NixieBuff[2] = nixie[smg3];NixieBuff[3] = nixie[smg4];NixieBuff[4] = nixie[smg5];NixieBuff[5] = nixie[smg6];NixieBuff[6] = nixie[smg7];NixieBuff[7] = nixie[smg8];
}
sys.h
#ifndef __SYS_H__
#define __SYS_H__//头文件包含
#include <STC15F2K60S2.H>
#include <intrins.h>//管脚声明//变量类型声明
typedef unsigned int uint;
typedef unsigned int u16;
typedef unsigned char uchar;
typedef unsigned char u8;//外部变量声明//函数声明
//sys.c
void ALL_Init();
void HC138_Set(u8 channel);
void Timer0Init(void);
void Timer1Init(void);
void Nixie_Scan();
void Nixie_Show(u16 dat);#endif