简介
NE555是一种高度稳定的控制器,内部用三个阻值为5KΩ的电阻分压,因此叫做555芯片。能够产生精确的定时脉冲。单稳态工作时,延时由一个外部电阻和一个电容控制。工作稳定,频率和占空比由两个外部电阻和一个电容器精确控制。具有以下特点:
【1】:大电流驱动能力(200mA)
【2】:占空比可调
【3】:温度稳定性高,灵敏度高
【4】:定时范围广,(微妙级~小时级)
【5】:广泛应用于精确定时,产生脉冲、方波信号
引脚图
引脚 | 名称 | 功能 |
---|---|---|
1 | 地线 | 接地 |
2 | 输入端 | 用于输入,和1/3Vcc比较 |
3 | 输出端 | 输出信号 |
4 | 复位端 | 低电平复位 |
5 | 电压控制端 | 一般不用,通常连接一个0.1uf的电容用来滤除杂波 |
6 | 输入端 | 用于输入,和2/3Vcc比较 |
7 | 放电端 | 用于放电 |
8 | 电源线 | 给芯片供电 |
原理图
我们可以看到:
- 2脚和6脚是接到一起的,因此两引脚电平保持一致
- 4脚直接接到了GND,芯片处于正常工作状态。
- 5脚接一个0.1uf的电容后直接接地,用来滤除杂波。
真值表
前面讲过,NE555芯片的2脚和6脚以此两引脚电平保持一致,所以下表直接给出了电平一致的情况,忽略了其他不存在的情况。
4引脚(复位引脚) | 6引脚(输出) | 2引脚(输入) | 3引脚(输出) |
---|---|---|---|
0 | X | X | 0 |
1 | >2/3Vcc | >2/3Vcc | 0 |
1 | 1/3Vcc < Vth <2/3Vcc | 1/3Vcc < Vth <2/3Vcc | 保持上一个状态 |
1 | <1/3Vcc | <1/3Vcc | 1 |
接下来我们简单的分析以下NE555的工作原理。
工作原理
- 刚刚上电时,因为电容没有电,两端电压几乎相等,为低电平,此时,二号引脚和六号引脚电压都 < 1/3Vcc,输出为高电平。
- 随着电源通过R8和Rb3接入电路的部分给电容C14充电,二号引脚和六号引脚电压逐渐升高至1/3Vcc和2/3Vcc之间,NE555的输出保持上一个状态,输出为高电平,
- 再往后,二号引脚和六号引脚电压上升至2/3Vcc以上,输出为低电平,此时二号引脚和六号引脚电压大于输出引脚的电压,电容开始放电,二号引脚和六号引脚电压随之下降
- 当二号引脚和六号引脚电压下降到1/3Vcc和2/3Vcc之间,NE555的输出保持上一个状态,输出为低电平,
- 二号引脚和六号引脚电压继续下降,回到状态1,输出高电平,之后往复循环以上步骤,输出一个方波信号。
[注] : 通过调节Rb3的阻值,可以改变电容充电和放电的时间Rb3越大,充放电时间越长,频率越小,反之越大。
频率测量原理
我们知道:要测量一个方波信号的频率,可以通过计算信号经过一个完整的高低电平所用的时间t,然后那么f (频率)= 1s/t(一个完整高低电平所用的时间) ,即可即可测量出这个信号的频率。
但是要测得一个完整高低电平所用的时间是很困难的,所以这个方法显然行不通…………
除此之外,我们还有一个相对简单的方法,就是通过单片机的计数功能,测得在1S内,脉冲信号的数量就是方波信号的频率。至于这种方法的原理,我这里不做介绍,感兴趣的可以自己查找相关资料。
定时器测量频率方法
- 通过定时器测量频率需要同时用到的定时器1和定时器0
- 定时器0作为计数器,工作模式为八位自动重装载
- 定时器1为定时器,工作模式为十六位自动重装载
[注意]:定时器0为计数器和定时器1为定时器,两者工作模式不建议调换,至于为什么是这样,理由如下:
定时器0作为计数器使用时,每当引脚P34捕获到一个脉冲信号,定时器0数值加一,
而定时器1作为计数器使用时,则需要P35捕获到脉冲信号,定时器1数值加一。
但是在蓝桥杯官方提供的单片机上,NE555芯片的输出端通过排针连接到了P34的旁边,只需要一个跳线帽将P34和NE555芯片的输出端连接即可实现通过通过定时器0对NE555产生的方波信号捕获,
如果强行使用定时器1进行计数,则需要另外使用杜邦线将P35和NE555的输出端连接,然而在比赛的时候好像是不会额外提供杜邦线的…………
代码实现
以下是通过定时器0&定时器1完成对NE555方波信号的频率测量。并通过数码管显示出来的代码示例,数码显示范围为0~99999Hz
#include <STC15F2K60S2.H>
#include "LS138.h"
unsigned int Count = 0; //定义计数变量,计算频率
unsigned int Frequence = 0; //频率
//定时器初始化函数
void Timer_Init(void)
{
TMOD |= 0x06; //设置定时器0为计数器,八位自动重装载,定时器1为定时器,16位自动重载载
ET0 = 1;
ET1 = 1;
EA = 1; //开启定时器中断
TH0 = 0xFF; //设置初值,使P3^4每产生一个脉冲,触发一次定时器0中断
TL0 = 0xFF;
TL1 = 0x18; //设置处置,使定时器1每1ms参生一次中断
TH1 = 0xFC;
TR0 = 1; //打开定时器0
TR1 = 1; //打开定时器1
}
//初始化函数
void Init()
{
Timer_Init(); //定时器初始化
LS138_Init(); //和LS138相关部分初始化
}
//数码管显示函数,Fre为需要显示的频率值
void SEG_Show(unsigned int Fre)
{
if(Fre%10) //显示个位
{
SEG_Write(7,Fre%10);
if(Fre/10%10) //显示十位
{
SEG_Write(6,Fre/10%10);
if(Fre/100%10) //显示百位
{
SEG_Write(5,Fre/100%10);
if(Fre/1000%10) //显示千位
{
SEG_Write(4,Fre/1000%10);
if(Fre/10000%10) //显示万位
{
SEG_Write(3,Fre/10000%10);
}
}
}
}
}
}
main()
{
Init(); //初始化函数调用
while(1)
{
SEG_Show(Frequence); //显示频率
}
}
//定时器0中断服务函数
void Timer0_Handler() interrupt 1
{
Count++; //频率加一
}
//定时器1中断服务函数,,每1ms触发一次
void Timer1_Handler() interrupt 3
{
static int i =0;
i++;
if(i>=1000) //1s进来一次
{
Frequence = Count; //读取当前的频率值
Count = 0; //Count清零
i = 0; //i清零
}
}
实现原理如下:
- 定时器0设置为计数器,八位自动重装载模式,初值为0xFF,即每捕获到一个脉冲信号,触发一次定时器0中断,Count++;
- 定时器1设置为定时器十六位自动重装载,初值位65535-1000,即每1ms触发一次,内部变量i++;当i >=1000,即时间到达1S,读取Conut的值,为测量到的频率,
- 通过读取到的频率,通过数码管显示出来。
- 调节Rb3的阻值,改变产生的方波信号频率,测量得到的频率随之改变。
总结(一堆废话)
到这里,我们蓝桥杯单片机上常考的内容就已经全部介绍完了,接下来我会出几期关于历年省赛题目的实现示例、及代码思路,然后就结束蓝桥杯单片机学习的系列…………
再然后就是关于,以后会不会继续写博客的事情。这里我想讲一些题外话,或者说是废话…………
起初,我开始写蓝桥杯单片机学习的博客,主要目的就是记录我自己的学习过程,希望可以那个奖什么的…………
到后来,写博客成为了我学习的一部分,我发现我有很多的问题可以在写博客的过程中解决,我学到了很多…………
与此同时,我也渐渐的不知所措,不知道接下来该怎么办,是要继续写,还是停笔封书,不知道我的内容会不会有人看,会不会有人喜欢,总之,我迷茫了…………
如果可以的话,给我点建议,留下你们的看法