蓝桥杯单片机学习13——使用NE555实现方波发生器

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引脚(输出)
    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的阻值,改变产生的方波信号频率,测量得到的频率随之改变。
  • 总结(一堆废话)

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

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

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

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

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

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 蓝桥杯单片机学习13——使用NE555实现方波发生器

    发表评论