一、原理图:
RB3:滑动变阻器
THR:高电平出发端
TRIG:低电平触发端
OUT:频率输出口
其中两者电压均小于各自的参考电压时放电管截至,两者电压均大于各自的参考电压时放电管导通,NE555是纯硬件的设计,当硬件电路确定了,其中的功能也相应确定,不能对其进行编程。
二、设计流程
1. 将蓝桥杯板子的J3中SIGNAL与P34短接。
2.配置定时器0和定时器1(定时器0为计数功能8位自动重装,定时器1为定时功能16位自动重装)
3.设计数码管显示部分(显示的数值位数不固定,但未用到的位熄灭)
三、设计原理
1.将SIGNAL与P34短接是因为T0的外部输入引脚,可用来做计数功能,T1的时钟输出,因此用T0作为NE555的计数器,T1作为的定时功能,根据规定设计定时时间,在T1中将前一秒的数据赋值给显示函数的缓冲区中来显示。
2.显示函数,用定时器1来刷新每一位的,将显示缓冲区的数据显示到数码管中,其中也将数据缓冲区的数据刷新。
四、代码部分
#include <STC15F2K60S2.H>
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
/*变量定义*/
uint16_t count_new_f =123; //当前1s内的频率
uint16_t count_before_f; //上一个1s的频率
uint8_t count_t; //定时1s
uint8_t trigger; //数码管位切换函数
unsigned char code Nixie[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0xff,0x8e};
uint8_t NixieBuf[8] = {11,10,10,10,10,10,10,10};
/*函数声明*/
void TimerInit(void);
void showNixie();
void RefreshBuf();
/*main函数*/
void main()
{
TimerInit();
while(1)
{
}
}
/*函数定义*/
/**
*File Name: 定时器初始化,定时器0:用作555计数,定时器1:用作555定时功能
*ARguments: 无
* Reaturn: 无
* Author:
* Date:
*/
void TimerInit(void)
{
TMOD &= 0x00; //将定时器0和定时器1清零 0000 0110
TMOD |= 0x06; //配置定时器1为16位自动重装,定时器0为8位自动重装,定时功能,计数功能
TH1 = (65535 - 5000)/256; //写入定时器1初值,5ms溢出
TL1 = (65535 - 5000)%256;
TH0 = 0xff; //写入定时器0初值,一个脉冲触发触发中断
TL0 = 0xff;
ET1 = 1; //使能中断
ET0 = 1;
TR1 = 1; //打开定时器
TR0 = 1;
EA = 1; //打开总中断
}
/**
*File Name: 定时器0服务函数,计算555的脉冲信号
*ARguments: 无
* Reaturn: 无
* Author:
* Date:
*/
void Timer0Service() interrupt 1
{
count_new_f++;
}
/**
*File Name: 定时器1服务函数,为555定时
*ARguments: 无
* Reaturn: 无
* Author:
* Date:
*/
void Timer1Service() interrupt 3
{
count_t++;
if(count_t >= 200)
{
count_t = 0;
count_before_f = count_new_f;
count_new_f = 0;
RefreshBuf();
}
showNixie();
}
/**
*File Name: 数码管显示函数
*ARguments: 无
* Reaturn: 无
* Author:
* Date:
*/
void showNixie()
{
P2 = P2 & 0x1f | 0xe0;
P0 = 0xff;
P2 = P2 & 0x1f | 0xc0;
P0 = 1<<trigger;
P2 = P2 & 0x1f | 0xe0;
P0 = Nixie[NixieBuf[trigger]];
if(++trigger >= 8) trigger = 0;
}
/**
*File Name: 数码管缓冲区刷新函数,并且最大显示位5位,最小显示位0位,为到达的数码管自动关闭
*ARguments: 无
* Reaturn: 无
* Author:
* Date:
*/
void RefreshBuf()
{
if(count_before_f > 9999)
NixieBuf[3] = count_before_f / 10000;
else
NixieBuf[3] = 10;
if(count_before_f > 999)
NixieBuf[4] = (count_before_f % 10000)/1000;
else
NixieBuf[4] = 10;
if(count_before_f > 99)
NixieBuf[5] = (count_before_f % 1000)/100;
else
NixieBuf[5] = 10;
if(count_before_f > 9)
NixieBuf[6] = (count_before_f % 100)/10;
else
NixieBuf[6] = 10;
if(count_before_f > 0)
NixieBuf[7] = (count_before_f % 10);
else
NixieBuf[7] = 10;
}