一、原理分析
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 500void 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
函数中初始化系统并进入一个无限循环,不断更新数码管显示。