蓝桥杯模块之NE555

 

                                                NE555模块

NE555模块简介:

https://wenku.baidu.com/view/0119c8275901020207409ce5.html  这是NE555分析比较详细的一篇文章,可以仔细看一下,当然蓝桥杯要求没有那么严格,总归来说蓝桥杯的设计就是将它作为了一个可变频率脉冲发生器,不过,NE555对以后的帮助很大 还是需要认真学习的。本篇文章就只是解决设计到蓝桥杯CT107D板子上的NE555电路做出分析,和代码设计分析。

下面来看一下蓝桥杯板子上NE555模块

 蓝桥杯这个NE555频率发生计其实设计的挺鸡肋的,和我之前在数电书上看到的都不太一样,为了便于分析,我们先来看一下NE555模块的内部结构图

蓝桥杯板子上NE555原理

 NE555是因为它内部三个电阻为5k的电阻而命名的,其实根据原理来说只要是三个电阻一样的都可以用,比如内部为三个6k的电阻,不过早期的设计出来的时候就用的是5k,所以名字也就没有变过。首先来看一下基本原理,蓝桥杯板子上,26脚相接,5脚接电容后接地,4脚和8脚接VCC,3脚接一个滑动变阻器后再加一个100Ω的电阻接到26脚上,7脚悬空。好了看了连接后,我们来看一下原理,(注意测量的时候是板子上右边排针SIGNAL和P34两个用跳帽相连)单片机启动后,3脚为高电平,通过滑动变阻器和固定电阻来给电容C14充电,当充电电压大于2/3VCC时,Vc1为0,Vc2为1,这时Q为0,G3为1,G4为0,输出V0也为0即低电平,这个时候C14通过滑动变阻器和固定电阻来放电,当其电压低于1/3VCC的时候,Vc1为1,Vc2位0,Q为1,G3为0,G4为1,输出V0为1即为高电平,这个时候C14又来进行充电,以此往复,形成脉冲,可以得出这是一个频率可变,而占空比不变的振荡信号。

那么可变频率的范围是多少呢?这个频率的改变是通过滑动变阻器Rb3来改变的,通过改变充电和放电的总时间而改变周期从而改变频率,最小频率对应为最大周期,是滑动变阻器和固定电阻和和最大的时候产生的即50100Ω,最大频率也就是为100Ω,因为我计算出来始终和正确值有所偏差,所以,我直接进行了测量,这是很准确的范围。看图

最低为57HZ左右

 最高为24kHZ左右

 这里知道了范围大家也没必要去算了,测出来后对照一下就知道是不是正确的了。关于官方说的

频率范围为500-20K我还是保持怀疑的,毕竟是测过的,我想官方的这个题的意思应该是,用500Hz-20KHZ作为标准来检验吧。

 NE555代码分析

说完了这个我们来说一下代码具体如何去测量,既然我们是计算频率,那么我们能够通过测量周期然后换算为频率,毕竟我们是能够在时域上去下功夫,频域上我们都是通过换算得到的。

我们先来看一下P34的管脚功能有哪些

 从这我们可以看出P34有4个功能,第一 :普通IO口、第二 :作为T0定时器/计数器的外部输入,第三  :作为T1时钟输出(可分频)、第四 :作为PCA模块的计数器外部脉冲输入脚。这里面一眼看去只有2功能和4功能可以使用,其中的原理也都差不多,不过值得注意的是,P34作为PCA输入,是需要初始化切换的,因为它不是默认的输入脚

 所以我们还是用定时器0来的方便些,而配置思路也比较清晰,让T0工作在计数模式下,而计数的引脚就是我们的P34,进行频率测量的时候,将定时器计时初值设为0,然后利用另外一个定时器来限定时间在1S或者几秒内,在规定时间完后,停止计数,将定时器0的值取出来,看有多少个脉冲,然后用总脉冲量/总时间,得出的即为脉冲的周期。

继续更-----2020/3/1

更一下程序方面怎么写

文章写得很明白了。NE555是没有驱动程序的,总结一下就是NE555是一个模块,它提供了一个脉冲的接口,就是P34接口,当然,这个接口不是默认连接的,需要将跳帽连接板子最右边那列排针的signal和P34,这样就连接好了。然后先将定时器0作为计时器输入

//定时器0用作测量频率(计数模式)
void Timer0Init(void)
{
    AUXR |= 0x80;
 TMOD |= 0x05;    
    TL0 = 0x00;        //设置计数初值
    TH0 = 0x00;        //设置计数初值
    TF0 = 0;
    TR0 = 0;
    ET0 = 0;
}

然后定时器1设一个1s的定时

(1)

//定时器1
void Timer1Init(void)        //2毫秒@12.000MHz
{
    AUXR |= 0x40;        //定时器时钟1T模式
    TMOD &= 0x0F;        //设置定时器模式
    TL1 = 0x40;        //设置定时初值
    TH1 = 0xA2;        //设置定时初值
    TF1 = 0;        //清除TF1标志
    TR1 = 1;        //定时器1开始计时
    ET1 = 1;
}

因为我的数码管显示用的定时器扫描,用了一个2ms的定时器1,要1s钟直接在里面设一个500的判断就行了,因为如果只用1s钟取出来的数据就可能误差很大,所以我时间设置为2s钟,即为1000,然后取出总脉冲数x,所以频率为x/2(注意脉冲频率是1s钟有多少个脉冲,如果1s中取出x个脉冲,则频率就为x,如果是2s取出x,则频率就为x/2)

//定时器1轮询
void Timer1Handle(void) interrupt 3
{

    //定时器计算1S脉冲个数
    if(GlobalState == STATE_FREQMEASURE)  //如果是在计算频率状态
    {
        if(AllTime == 0)          //ALLTime为计时的变量
        {
            TR0 = 1;                 //开启计数
            AllTime++;
        }
        else if(AllTime < 1000)  //如果小于2s钟的话(我是2ms加一次,1000*2ms = 2s)
        {
            AllTime++;
            
        }
        else                     //如果2s到了的话
        {
            AllTime = 0;            //清空计时变量
            TR0 = 0;                //停止计时
            FreqCnt = (((uint)TH0 << 8) |(uint)TL0)/2; //将脉冲频率取出/2
            TH0 = 0;                //清除脉冲计数现有值,做好初始化
            TL0 = 0;
        }

这里我为了方便就将有些处理写在了定时器里面,其实最好是不要写在定时器里面的,里面只用给计时,然后到时间了给标志,最后在主循环while(1)中去处理。最后将脉冲频率用串口或者数码管显示出来就行了。

有什么问题欢迎咨询哦!

发布了12 篇原创文章 · 获赞 67 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_37429313/article/details/86929724
今日推荐