一、原理分析
NE555作为一种多功能集成电路,在信号发生和频率测量方面具有广泛的应用。通过合理配置和连接外部元件,可以实现不同类型的信号发生和频率测量功能。
原理:
-
信号发生器:
- NE555可以配置为多种不同的振荡器电路,包括单稳态(单脉冲)和多谐振荡器(方波、正弦波等)。
- 在单稳态模式下,NE555可以生成一个脉冲信号,当输入触发脉冲时,输出会产生一个固定宽度的脉冲。
- 在多谐振荡器模式下,NE555可以生成稳定的方波信号,其频率由外部电路元件(电阻和电容)决定。
-
频率测量:
- NE555可以用作频率测量器的基础元件,通过测量NE555输出的方波信号的周期来计算频率。
- 频率测量的原理是利用NE555输出的方波信号的周期与频率成反比的关系,通过测量周期来计算频率。
应用:
-
信号发生器:
- NE555可以用于产生各种频率的信号,常用于音频信号发生器、脉冲信号发生器等。
- 在电子实验和原型设计中,NE555经常被用作简单的信号发生器,用于测试和验证电路功能。
-
频率测量:
- NE555可以用作简单的频率测量器,通过测量NE555输出的方波信号的周期来计算频率。
- 频率测量在电子实验、通信领域和控制系统中具有广泛的应用,用于测量信号的频率和周期。
考点分析
-
使用短路环将J13中的NAL与P34引脚短接,将NE555产生的信号输入到单片机的P34引脚。
-
NE555电路是一个信号发生器,其输出信号连接到单片机的P34引脚。
-
通过调节Rb3可调电位器,可以改变该信号的频率大小。
-
利用定时器/计数器来测量信号的频率。
二、思维导图
定时器设置部分可以参考本栏:蓝桥杯单片机快速开发笔记——定时器-CSDN博客
三、示例框架
unsigned int dat_f = 0;
unsigned int count_f = 0;
unsigned char count_t = 0;
#define TSMG 500
void delay_smg(unsigned int t)
{
while(t--);
}
void hc573(unsigned char channel, unsigned char dat)
{
P2 = (P2 & 0x1f) | 0x00;
P0 = dat;
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80; //LED 0亮
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0; //蜂鸣器、继电器 1开
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0; //数码管位选 1亮
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0; //数码管段选 0亮
break;
}
P2 = (P2 & 0x1f) | 0x00;
}
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A
0x83, //b
0xc6, //C
0xa1, //d
0x86, //E
0x8e //F
};
void smg_all(unsigned char dat)
{
hc573(6, 0xff);
hc573(7, dat);
}
void smg_bit(unsigned char pos, unsigned char dat)
{
hc573(6, 0x01 << pos);
hc573(7, dat);
delay_smg(TSMG);
hc573(6, 0x01 << pos);
hc573(7, 0xff);
}
void smg_display()
{
if(dat_f > 99999)
{
smg_bit(2, Seg_Table[(dat_f / 100000) % 10]);
}
if(dat_f > 9999)
{
smg_bit(3, Seg_Table[(dat_f / 10000) % 10]);
}
if(dat_f > 999)
{
smg_bit(4, Seg_Table[(dat_f / 1000) % 10]);
}
if(dat_f > 99)
{
smg_bit(5, Seg_Table[(dat_f / 100) % 10]);
}
if(dat_f > 9)
{
smg_bit(6, Seg_Table[(dat_f / 10) % 10]);
}
if(dat_f > 0)
{
smg_bit(7, Seg_Table[dat_f % 10]);
}
}
void init_sys()
{
hc573(5, 0x00);
smg_all(0xff);
Init_Timer();
}
void Init_Timer()
{
TH0 = 0xff;
TL0 = 0xff;
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x16; //0x16 = 0001 0110
//定时器1用方式1,16位定时器;
//定时器0用方式2,自动重装载8位计数器
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++;
}
void Service_T1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
count_t++;
if(count_t == 20)
{
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}
void main()
{
init_sys();
while(1)
{
smg_display();
}
}
通过NE555产生的信号频率来测量并显示在数码管上,通过定时器来计算频率并更新显示。
-
定义了全局变量
dat_f
、count_f
和count_t
,分别用于存储数据、计数和时间。 -
定义了宏
TSMG
用于设置数码管显示的延时时间。 -
实现了
delay_smg
函数用于实现延时功能。 -
实现了
hc573
函数用于控制数码管、LED、蜂鸣器等外设的显示和控制。 -
定义了数码管显示的编码表
Seg_Table
,包含了0到F的显示编码。 -
实现了
smg_all
、smg_bit
和smg_display
函数用于数码管的全显、位显和数据显示。 -
初始化系统的函数
init_sys
中设置了初始状态和调用了Init_Timer
函数初始化定时器。 -
Init_Timer
函数初始化了定时器0和定时器1,并设置了定时器的工作模式和中断使能。 -
定时器0中断服务函数
Service_T0
用于计数。 -
定时器1中断服务函数
Service_T1
用于定时并更新数码管显示的数据。在每20次中断后,将计数值赋给dat_f
,并清零计数器。 -
在
main
函数中初始化系统并进入一个无限循环,不断更新数码管显示。