蓝桥杯单片机快速开发笔记——NE555测频

一、原理分析

        NE555作为一种多功能集成电路,在信号发生和频率测量方面具有广泛的应用。通过合理配置和连接外部元件,可以实现不同类型的信号发生和频率测量功能。

原理:

  1. 信号发生器

    • NE555可以配置为多种不同的振荡器电路,包括单稳态(单脉冲)和多谐振荡器(方波、正弦波等)。
    • 在单稳态模式下,NE555可以生成一个脉冲信号,当输入触发脉冲时,输出会产生一个固定宽度的脉冲。
    • 在多谐振荡器模式下,NE555可以生成稳定的方波信号,其频率由外部电路元件(电阻和电容)决定。
  2. 频率测量

    • NE555可以用作频率测量器的基础元件,通过测量NE555输出的方波信号的周期来计算频率。
    • 频率测量的原理是利用NE555输出的方波信号的周期与频率成反比的关系,通过测量周期来计算频率。

应用:

  1. 信号发生器

    • NE555可以用于产生各种频率的信号,常用于音频信号发生器、脉冲信号发生器等。
    • 在电子实验和原型设计中,NE555经常被用作简单的信号发生器,用于测试和验证电路功能。
  2. 频率测量

    • NE555可以用作简单的频率测量器,通过测量NE555输出的方波信号的周期来计算频率。
    • 频率测量在电子实验、通信领域和控制系统中具有广泛的应用,用于测量信号的频率和周期。

考点分析

  1. 使用短路环将J13中的NAL与P34引脚短接,将NE555产生的信号输入到单片机的P34引脚。

  2. NE555电路是一个信号发生器,其输出信号连接到单片机的P34引脚。

  3. 通过调节Rb3可调电位器,可以改变该信号的频率大小。

  4. 利用定时器/计数器来测量信号的频率。

二、思维导图

定时器设置部分可以参考本栏:蓝桥杯单片机快速开发笔记——定时器-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产生的信号频率来测量并显示在数码管上,通过定时器来计算频率并更新显示。

  1. 定义了全局变量 dat_fcount_f 和 count_t,分别用于存储数据、计数和时间。

  2. 定义了宏 TSMG 用于设置数码管显示的延时时间。

  3. 实现了 delay_smg 函数用于实现延时功能。

  4. 实现了 hc573 函数用于控制数码管、LED、蜂鸣器等外设的显示和控制。

  5. 定义了数码管显示的编码表 Seg_Table,包含了0到F的显示编码。

  6. 实现了 smg_allsmg_bit 和 smg_display 函数用于数码管的全显、位显和数据显示。

  7. 初始化系统的函数 init_sys 中设置了初始状态和调用了 Init_Timer 函数初始化定时器。

  8. Init_Timer 函数初始化了定时器0和定时器1,并设置了定时器的工作模式和中断使能。

  9. 定时器0中断服务函数 Service_T0 用于计数。

  10. 定时器1中断服务函数 Service_T1 用于定时并更新数码管显示的数据。在每20次中断后,将计数值赋给 dat_f,并清零计数器。

  11. 在 main 函数中初始化系统并进入一个无限循环,不断更新数码管显示。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 21:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 21:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 21:44:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 21:44:03       20 阅读

热门阅读

  1. spring MVC 自定义注解实现路径匹配

    2024-03-17 21:44:03       19 阅读
  2. qt之画图

    2024-03-17 21:44:03       17 阅读
  3. Spring中的bean相关问题

    2024-03-17 21:44:03       23 阅读
  4. Ts中WebSocket连接管理与维护教程

    2024-03-17 21:44:03       15 阅读