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

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号引脚TR Trigger (低触发器)低于参考电压输出高电平
6号引脚TH Threshold(高触发端)高于参考电压,VR1有效(即输出高电平)
3号引脚OUT OUT,输出Vo
7号引脚DISC Discharge(OC门,承受较大电流),经上拉电阻接电源,输出与Vo相同
4号引脚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届蓝桥杯省赛编程题目的一个部分。

copy
因为很多考生反映,因为不懂NE555芯片,所以不会做这个题目。其实你不需要懂NE555芯片也可能会做这个题目,对于蓝桥杯竞赛平台CT107D板子上NE555电路,你只需要知道2点就可以:

[1] NE555电路是一个信号发生电路,其信号输出接到单片机的P34引脚,即单片机的T0引脚。

[2] 该信号的频率大小可以通过Rb3可调电位器改变。

copy
因为NE555芯片基本上就是一个纯硬件的设计,没有可编程的内容,因此,一点电路确定了,就没有变化了,单片机也不需要对它有任何的配置。所以,在整个单片机测量频率的过程中,跟NE555芯片一点儿关系都没有,实际上考查的是你应用定时/计数器测量信号频率的技术。

参考代码如下:

copy
#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(); } }
posted @   夏日清凉~  阅读(361)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起