蓝桥杯-单片机基础12——对芯片LM555产生的频率脉冲计数思路

蓝桥杯单片机组备赛指南请查看 :本专栏第1篇文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


1. 代码目的

        通过对LM555芯片的正确应用,将其产生的频率数值显示在数码管上,并可以通过RB3对频率进行调节。数码管不用的位全部熄灭,并在0位显示F指示频率。显示格式:

F 6 0 0 0
未用到的熄灭 有效数据:6000Hz

2. LM555芯片简介

        对LM555芯片可以实现的操作有很多,但是比赛开发板上很少。以下文字内容瞟一眼即可,客观题基本不会遇到

  1. 引脚2(TRIG)- 触发:当此引脚的电压降至1/3 VCC时,定时器被触发,开始计时。

  2. 引脚3(OUT)- 输出:输出引脚,输出电压可以从0V到接近VCC变化。

  3. 引脚4(RESET)- 重置:此引脚用于重置定时器。当这个引脚接收到低于0.7V的电压时,定时器的输出会立即变低,无论计时周期是否完成。

  4. 引脚5(CTRL)- 控制电压:控制电压引脚可以用来改变定时器的触发和阈值电平。通常通过一个电位器连接到VCC和GND

  5. 引脚6(THR)- 阈值:

    • 当此引脚的电压升至2/3 VCC时,定时周期结束,输出引脚变低。
    • 在振荡器模式下,这个引脚和放电引脚一起控制振荡频率。
  6. 引脚7(DISCH)- 放电:

    • 这个引脚连接到一个内部晶体管的集电极,该晶体管可以提供放电路径到GND。
    • 在振荡器应用中,它被用来放电计时电容。

3. 开发板原理图

        我们打开官方的开发板原理图,找到LM555器件:

编程时,用跳线帽连接J3的15和16引脚,理由如下:

        我们只需略微观察,该芯片所有的引脚都被固定了,既没有与锁存器连接,也没有与引脚的连接。因此该芯片在开发板上是一个彻底的硬件电路,没有可编程部分。

        对于NET_SIG端口,与芯片的Q(output,输出端)相连,我们打开原理图文件,按下CTRL+F进行搜索该名称,发现还有另一个器件有该标注:

        在该端口的下方标注为单片机的P34引脚,因此我们可以将输出的频率数值,传入到P34引脚,再通过P34的T0计数器进行读取。因此我们需要用额外的跳线帽连接J3的14和15号引脚。

4. 频率计数原理

编程时,我们采用T0工作在计数模式,计数从P34引脚输入的脉冲个数

        在采用T1工作在定时模式,定时1秒的时长

        在1秒内T0计数的个数,就是LM产生的脉冲频率个数

        当我们在比赛时,不知道P34这个引脚是对应的T0还是T1时,可以直接查看原理图,从而确定哪一个定时计数器是用来进行计数的:

5. 代码参考

#include <reg52.h>
#include <intrins.h>

sfr AUXR = 0x8e;


unsigned char code duanma [18]=
			{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 
				0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,
				0xbf , 0x7f };

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		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 state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 7 );
	P0 = 0xff;
	
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void state_SMG_all ( unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0xff;
	select_HC573 ( 7 );
	P0 = value_SMG;
}	

void init_sys ()
{
	select_HC573 ( 4 );
	P0 = 0xff;
	select_HC573 ( 5 );
	P0 = 0x00;	
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void init_timer(void)		//50毫秒@11.0592MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x00;		//设置定时器模式
	TMOD |= 0x16;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x4C;		//设置定时初始值
	TH0 = 0xff;
	TL0 = 0xff;
	TF1 = 0;		//清除TF1标志
	TF0 = 0;

	TR1 = 1;		//定时器1开始计时
	TR0 = 1;
	EA = 1;
	ET1 = 1;
	ET0 = 1;
}

unsigned int count_timer0 = 0;
void timer0_service () interrupt 1
{
	count_timer0++;
}

unsigned int count_fre = 0;
unsigned char count_50ms = 0;
void timer1_service () interrupt 3
{
	count_50ms++;
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0x4C;		//设置定时初始值
	
	if ( count_50ms == 20 )
	{
		count_50ms = 0;
		count_fre = count_timer0;
		count_timer0 = 0;
	}
}

void SMGrunning ()
{
	state_SMG ( 0 , duanma[15] );
	Delay1ms();
	if ( count_fre > 999999 )
	{
		state_SMG ( 1 , duanma[count_fre/1000000%10] );
		Delay1ms();
	}
	if ( count_fre > 99999 )
	{
		state_SMG ( 2 , duanma[count_fre/100000%10] );
		Delay1ms();
	}
	if ( count_fre > 9999 )
	{
		state_SMG ( 3 , duanma[count_fre/10000%10] );
		Delay1ms();
	}
	if ( count_fre > 999 )
	{
		state_SMG ( 4 , duanma[count_fre/1000%10] );
		Delay1ms();
	}
	if ( count_fre > 99 )
	{
		state_SMG ( 5 , duanma[count_fre/100%10] );
		Delay1ms();
	}
	state_SMG ( 6 , duanma[count_fre/10%10] );
	Delay1ms();
	state_SMG ( 7 , duanma[count_fre%10] );
	Delay1ms();
	
	state_SMG_all ( 0xff );
}
	
void main ()
{
	init_sys ();
	init_timer ();
	while ( 1 )
	{
		SMGrunning ();
	}
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

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

    2024-04-03 07:10:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 07:10:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 07:10:05       20 阅读

热门阅读

  1. UDP协议

    UDP协议

    2024-04-03 07:10:05      12 阅读
  2. 深入探索Linux的lsof命令

    2024-04-03 07:10:05       14 阅读
  3. 导入预览以及解决导入量大引发超时等问题

    2024-04-03 07:10:05       11 阅读
  4. redis-BitMap(位图)使用方法

    2024-04-03 07:10:05       14 阅读
  5. pip和conda 设置安装源

    2024-04-03 07:10:05       12 阅读
  6. Flask基础学习

    2024-04-03 07:10:05       12 阅读
  7. Redis

    Redis

    2024-04-03 07:10:05      16 阅读
  8. Shadow

    Shadow

    2024-04-03 07:10:05      9 阅读
  9. npm配置项管理

    2024-04-03 07:10:05       13 阅读