由于LM555的内容较少,因此就把使用方法和代码实践放在一起了。
1 NE555使用方法
NE555是一个“信号发生电路”,可以理解为一个“方波产生器”,值得注意的是,其是一个硬件电路,一旦确定了功能也就确定了,所以在蓝桥杯比赛中,可能不太需要了解其是怎么产生方波的,知道其怎么使用就可以了。
需要知道的是:
(1)通过调节Rb3可以调节输出信号的频率
(2)在使用中,NET SIG通常接的就是P3^4引脚
2 实践
2.1 任务
2.2 思路
(1)关闭相关外设:这里不再赘述,基本每次代码都有提及。
(2)测量信号频率: 首先理解频率是什么? 频率是单位时间内的周期数。
那么我们可以使用两个计时器(计时器0和计时器1),定时器0用于计数(记录1s内通过的方波个数即是周期数),定时器1用于计时(记1s时间)。
(3)数码管显示频率:需要一个变量实时记录每秒钟的频率,然后进行数码管的动态显示。
2.3 完整代码(MM模式)
这里特别讲解一下:
1. 定时器部分:
(1)运用了两个定时器但是其中断初始函数可以写在一起。
(2)定时器0用于计数,模式选的是8位重装,TH0和TL0都等于255:之前说到一个脉冲(一个脉冲其实就是一个方波,其实就是一个周期 )为1us,0~65535us就65536个脉冲,而这里不再是之前的16位而是8位,故变为(0~255(2^8)), 当初值设定为255最大值时,那么当再来一个脉冲定时器就溢出,重新计时,所以设计初值为255是为了计一个脉冲。
2 数码管部分:
这里5位不一定全部被使用到,这里比较巧妙地部分就是小蜜蜂老师的这种方法,dat_f由于是计数累加而来,而不是十六进制,故若>9999,表示dat_f为五位数,>999为四位数,以此类推。
对数据的处理部分也是非常巧妙的。可以自己验算一下。
完整代码如下:
#include "stc15f2k60s2.h"
#include "absacc.h"
//=====================================================
void Init_Timer_f()
{
//Timer0 to count numbers
//Timer 1 to count time
TH0 = 255;
TL0 = 255;
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x06;
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
unsigned int count_f = 0;
unsigned int dat_f = 0;
unsigned char t = 0;
void Service_Timer0() interrupt 1
{
count_f++;
}
void Service_Timer1() interrupt 3
{
if(t == 20)
{
dat_f = count_f;
count_f = 0;
t = 0;
}
}
//======================================================
code unsigned char SMG_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e, //F
0xbf //-
};
void Delay(unsigned char t)
{
while(t--);
}
void SMG(unsigned int position, unsigned char content)
{
XBYTE[0xc000] = 0x01 << position;
XBYTE[0xe000] = content;
}
void SMG_Display()
{
SMG(0,SMG_Table[15]);
Delay(100);
SMG(1,0xff);
Delay(100);
SMG(2,0xff);
Delay(100);
if(dat_f > 9999)
{
SMG(3,SMG_Table[dat_f / 10000]);
Delay(100);
}
if(dat_f > 999)
{
SMG(4,SMG_Table[(dat_f / 1000) % 10]);
Delay(100);
}
if(dat_f > 99)
{
SMG(5,SMG_Table[(dat_f / 100) % 10]);
Delay(100);
}
if(dat_f > 9999)
{
SMG(6,SMG_Table[(dat_f / 10) % 10]);
Delay(100);
}
SMG(7,SMG_Table[(dat_f / 1) % 10]);
Delay(100);
}
void close()
{
XBYTE[0xa000] = 0x00;
XBYTE[0x8000] = 0xff;
}
void main()
{
close();
Init_Timer_f();
while(1)
{
SMG_Display();
}
}