17-基于NE555的信号发生与频率测量
555定时器的基本应用
1. 555定时器的简介
555定时器是美国Signetics公司1972年研制的用于取代机械式定时器的中规模集成电路,因输入端设计有三个5kΩ的电阻而得名
555定时器由于其易用性、低廉的价格和良好的可靠性,在波形的产生与变换、测量与控制、家用电器、电子玩具等领域都得到了应用
利用555定时器能极方便的构成施密特触发电路、单稳态电路和多谐震荡电路
2.555定时器的电路结构
由上可知该电路输入端是由3个5kΩ的电阻串联
C1和C2为两个电压比较器,比较的是TH(VI1的输入)与VR1参考电压之间的大小,C2比较器比较的式VR2参考电压与VI2之间的大小关系,之后两个电压比较器的比较结果进行RS锁存器,输出经过一个反向器得到Vo,以及下面的一个放电NPN三极管得到一个OC门输出
555定时器的封装结构图
不同的原理引脚一样,所展现的名字有些许差别
由上可知此电路封装图对应上电路结构的8个引脚
引脚功能如下:
1号引脚 | Ground 接地 |
---|---|
8号引脚 | Power Supply 接电源 |
2号引脚\(\overline{TR}\) | Trigger (低触发器)低于参考电压输出高电平 |
6号引脚TH | Threshold(高触发端)高于参考电压,VR1有效(即输出高电平) |
3号引脚OUT | OUT,输出Vo |
7号引脚DISC | Discharge(OC门,承受较大电流),经上拉电阻接电源,输出与Vo相同 |
4号引脚\(\overline{RD}\)置零输入端 | 当接入低电平时,输出直接置为"0" 电路正常工作时,该引脚应接高电平 |
5号引脚CTRL电压控制端 | 接外接电压,改变参考电压VR1、VR2的值,该引脚不用时,串入一只0.01μF电容接地,以防高频干扰 |
555定时器的功能表
【题目要求】
在CT107D单片机综合实训平台上,利用NE555产生方波信号并测量其频率,具体功能要求如下:
[1] 上电开机运行时,关闭蜂鸣器、继电器和8个LED指示灯。
[2] 用短路环将J3中的SIGNAL与P34短接,NE555发生的信号输入到单片机的P34引脚。
[3]单片机测量信号频率,并显示在数码管中,频率数据显示用6位数码管,单位是Hz,当显示长度不足6位时,未使用到的数码管熄灭,在最左边的1位数码管用“F”作为提示符。显示格式如下:
【特别提示】
本题是第10届蓝桥杯省赛编程题目的一个部分。
因为很多考生反映,因为不懂NE555芯片,所以不会做这个题目。其实你不需要懂NE555芯片也可能会做这个题目,对于蓝桥杯竞赛平台CT107D板子上NE555电路,你只需要知道2点就可以:
[1] NE555电路是一个信号发生电路,其信号输出接到单片机的P34引脚,即单片机的T0引脚。
[2] 该信号的频率大小可以通过Rb3可调电位器改变。
因为NE555芯片基本上就是一个纯硬件的设计,没有可编程的内容,因此,一点电路确定了,就没有变化了,单片机也不需要对它有任何的配置。所以,在整个单片机测量频率的过程中,跟NE555芯片一点儿关系都没有,实际上考查的是你应用定时/计数器测量信号频率的技术。
参考代码如下:
#include <REGX52.H>
unsigned char count_t;
unsigned int dat_f,count_f;
// 无小数点
unsigned char SMG_NODot[10] = {
0xC0, //1100 0000 0
0xf9, //1111 1001 1
0xa4, //1010 0100 2
0xb0, //1011 0000 3
0x99, //1001 1001 4
0x92, //1001 0010 5
0x82, //1000 0010 6
0xf8, //1111 1000 7
0x80, //1000 0000 8
0x90 //1001 0000 9
};
void _74HC138(unsigned char n) {
switch(n) {
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void Delay(unsigned int t) {
while(t--);
}
void Display_SMG_Bit(unsigned char pos,unsigned char dat) {
_74HC138(7);
P0 = 0xff;
_74HC138(6);
P0 = 0x01 << pos;
_74HC138(7);
P0 = dat;
}
void Display_All(unsigned char dat) {
_74HC138(6);
P0 = 0xff;
_74HC138(7);
P0 = dat;
}
void Timer_Init(void) {
// 定时器1为定时器
// 定时器0为计数器
TMOD = 0x16; // 0001 0110
TL0 = 0xff;
TH0 = 0xff;
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Timer0_Rountine() interrupt 1 {
count_f++;
}
void Timer1_Rountine() interrupt 3 {
TL1 = (65536 - 50000) / 256;
TH1 = (65536 - 50000) % 256;
count_t++;
if(count_t == 20) {
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}
void Display_SMG(void) {
Display_SMG_Bit(0,0x8e); // 1000 1110
Delay(500);
//Display_SMG_Bit(1,0xff);
//Delay(500);
//Display_SMG_Bit(2,0xff);
//Delay(500);
if(dat_f > 9999) {
Display_SMG_Bit(3,SMG_NODot[dat_f/10000]);
Delay(500);
}
if(dat_f > 999) {
Display_SMG_Bit(4,SMG_NODot[(dat_f/1000)%10]);
Delay(500);
}
if(dat_f > 99) {
Display_SMG_Bit(5,SMG_NODot[(dat_f/100)%10]);
Delay(500);
}
if(dat_f > 9) {
Display_SMG_Bit(6,SMG_NODot[(dat_f/10)%10]);
Delay(500);
}
Display_SMG_Bit(7,SMG_NODot[dat_f%10]);
Delay(500);
Display_All(0xff);
}
void main(void) {
_74HC138(4);
P0 = 0xff;
_74HC138(5);
P0 = 0x00;
Timer_Init();
while(1) {
Display_SMG();
}
}