蓝桥杯单片机学习13——NE555方波发生器&频率测量
时间:2024-03-27 17:05:47 来源:网络cs 作者:胡椒 栏目:其他工具 阅读:
NE555
简介引脚图原理图真值表工作原理频率测量原理定时器测量频率方法代码实现总结(一堆废话)
简介
NE555是一种高度稳定的控制器,内部用三个阻值为5KΩ的电阻分压,因此叫做555芯片。能够产生精确的定时脉冲。单稳态工作时,延时由一个外部电阻和一个电容控制。工作稳定,频率和占空比由两个外部电阻和一个电容器精确控制。具有以下特点:
【1】:大电流驱动能力(200mA)
【2】:占空比可调
【3】:温度稳定性高,灵敏度高
【4】:定时范围广,(微妙级~小时级)
【5】:广泛应用于精确定时,产生脉冲、方波信号
引脚图
引脚 | 名称 | 功能 |
---|---|---|
1 | 地线 | 接地 |
2 | 输入端 | 用于输入,和1/3Vcc比较 |
3 | 输出端 | 输出信号 |
4 | 复位端 | 低电平复位 |
5 | 电压控制端 | 一般不用,通常连接一个0.1uf的电容用来滤除杂波 |
6 | 输入端 | 用于输入,和2/3Vcc比较 |
7 | 放电端 | 用于放电 |
8 | 电源线 | 给芯片供电 |
原理图
我们可以看到:
真值表
前面讲过,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的阻值,改变产生的方波信号频率,测量得到的频率随之改变。总结(一堆废话)
到这里,我们蓝桥杯单片机上常考的内容就已经全部介绍完了,接下来我会出几期关于历年省赛题目的实现示例、及代码思路,然后就结束蓝桥杯单片机学习的系列…………
再然后就是关于,以后会不会继续写博客的事情。这里我想讲一些题外话,或者说是废话…………
起初,我开始写蓝桥杯单片机学习的博客,主要目的就是记录我自己的学习过程,希望可以那个奖什么的…………
到后来,写博客成为了我学习的一部分,我发现我有很多的问题可以在写博客的过程中解决,我学到了很多…………
与此同时,我也渐渐的不知所措,不知道接下来该怎么办,是要继续写,还是停笔封书,不知道我的内容会不会有人看,会不会有人喜欢,总之,我迷茫了…………
如果可以的话,给我点建议,留下你们的看法
本文链接:https://www.kjpai.cn/news/2024-03-27/149615.html,文章来源:网络cs,作者:胡椒,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!