Bootstrap

蓝桥杯单片机学习13——NE555方波发生器&频率测量

简介

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引脚(输出)
0XX0
1>2/3Vcc>2/3Vcc0
11/3Vcc < Vth <2/3Vcc1/3Vcc < Vth <2/3Vcc保持上一个状态
1<1/3Vcc<1/3Vcc1

接下来我们简单的分析以下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的阻值,改变产生的方波信号频率,测量得到的频率随之改变。

总结(一堆废话)

到这里,我们蓝桥杯单片机上常考的内容就已经全部介绍完了,接下来我会出几期关于历年省赛题目的实现示例、及代码思路,然后就结束蓝桥杯单片机学习的系列…………

再然后就是关于,以后会不会继续写博客的事情。这里我想讲一些题外话,或者说是废话…………

起初,我开始写蓝桥杯单片机学习的博客,主要目的就是记录我自己的学习过程,希望可以那个奖什么的…………

到后来,写博客成为了我学习的一部分,我发现我有很多的问题可以在写博客的过程中解决,我学到了很多…………

与此同时,我也渐渐的不知所措,不知道接下来该怎么办,是要继续写,还是停笔封书,不知道我的内容会不会有人看,会不会有人喜欢,总之,我迷茫了…………

如果可以的话,给我点建议,留下你们的看法

在这里插入图片描述

;