17-基于NE555的信号发生与频率测量

发布时间 2023-10-21 22:42:51作者: 夏日清凉~

555定时器的基本应用

1. 555定时器的简介

555定时器是美国Signetics公司1972年研制的用于取代机械式定时器的中规模集成电路,因输入端设计有三个5kΩ的电阻而得名

555定时器由于其易用性、低廉的价格和良好的可靠性,在波形的产生与变换、测量与控制、家用电器、电子玩具等领域都得到了应用

利用555定时器能极方便的构成施密特触发电路、单稳态电路和多谐震荡电路

2.555定时器的电路结构

20231021202818

由上可知该电路输入端是由3个5kΩ的电阻串联

C1和C2为两个电压比较器,比较的是TH(VI1的输入)与VR1参考电压之间的大小,C2比较器比较的式VR2参考电压与VI2之间的大小关系,之后两个电压比较器的比较结果进行RS锁存器,输出经过一个反向器得到Vo,以及下面的一个放电NPN三极管得到一个OC门输出

555定时器的封装结构图

不同的原理引脚一样,所展现的名字有些许差别

20231021203151

由上可知此电路封装图对应上电路结构的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定时器的功能表

20231021212748

【题目要求】

在CT107D单片机综合实训平台上,利用NE555产生方波信号并测量其频率,具体功能要求如下:

[1] 上电开机运行时,关闭蜂鸣器、继电器和8个LED指示灯。

[2] 用短路环将J3中的SIGNAL与P34短接,NE555发生的信号输入到单片机的P34引脚。

[3]单片机测量信号频率,并显示在数码管中,频率数据显示用6位数码管,单位是Hz,当显示长度不足6位时,未使用到的数码管熄灭,在最左边的1位数码管用“F”作为提示符。显示格式如下:

20190406124837867

【特别提示】
本题是第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(); 
	}
}