51单片机从零开始入门教程(独立按键篇)

参考教程:[3-1] 独立按键控制LED亮灭_哔哩哔哩_bilibili

1、轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。

2、按键抖动:对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

3、开发板原理图中的独立按键模块显示,按键的一端接地,另一端与寄存器P3相连,按下按键,P3中相应的位被置为0,松开按键,P3中相应的位被置为1(引脚采取的是弱上拉,换句话说,当按键不导通时,引脚通过电阻与正电压VCC相连,这时引脚为高电平,当按键导通时,受上拉电阻影响,VCC不能与GND“抗衡”,引脚会受GND影响而处于低电平,不过弱上拉模式的缺点就是高电平驱动能力并不是很好,因为弱上拉电阻的存在会让高电平“并不是那么高”),程序可以获取寄存器P3中的状态进行相应的操作

4、独立按键状态控制LED灯状态:

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_0 == 0)  //P3中的0号位被置为0,检测到按键被按下
			P2_0 = 1;  //单独对P2的0号位进行操作,按下按键时该位对接的LED灯不亮
		else
			P2_0 = 0;  //如果按键未被按下,LED灯常亮
	}
}

(2)按照上一例的操作将生成的.hex文件写进开发板,按动K2按键(K2按键对应P3的0号位)即可观察现象。

5、独立按键控制LED灯状态:

(1)在main.c文件中输入以下代码,借助延时函数进行按键消抖,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay(unsigned int xms)		//对借助STC-ISP生成的1ms延时函数进行修改
{
	while(xms)  //让1ms延时函数重复执行xms次
	{
		unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	xms--;  //smx作为计数器
	}
}

void main()
{
	while(1)
	{
		if(P3_1 == 0)  //如果按下按键
		{
			Delay(20);  //消除按下按键时的抖动
			while(P3_1 == 0); //抖动结束后如果仍未松开开关,LED灯保持原状
			Delay(20);  //松开按键后上面的循环结束,消除松开按键的抖动
			P2_0 = ~P2_0;  //LED灯状态反转
		}
		//每按一次按键,LED灯状态反转一次
	}
}

(2)按照上一例的操作将生成的.hex文件写进开发板,按动K1按键(K1按键对应P3的1号位)即可观察现象。

6、独立按键控制LED进行二进制计数:

(1)在main.c文件中输入以下代码,借助延时函数进行按键消抖,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay(unsigned int xms)		//对借助STC-ISP生成的1ms延时函数进行修改
{
	while(xms--)  //让1ms延时函数重复执行xms次
	{
		unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}

void main()
{
	P2 = 0xFF;  //P2初始化为1111 1111(P2默认的初始状态也是如此)
	
	while(1)
	{
		static unsigned char LEDNum = 0;  //char类型占8位,正好对应P2的8位
		//注:unsigned char LEDNum = 0;可以写在循环体外
		//但是本人的编译器貌似不允许我这么干,所以才使用static关键字在循环体内部定义计数变量
		//加了static关键字后该变量只定义一次,不会重复定义以及重复置为0
		if(P3_1 == 0)  //每按下一次按键,计数值加一
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			LEDNum++;  //使用LEDNum进行计数
			P2 = ~LEDNum;  //因为LED是低电平驱动,所以计数结果取反才符合需求
		}
	}
}

(2)按照上一例的操作将生成的.hex文件写进开发板,按动K1按键(K1按键对应P3的1号位)即可观察现象。

7、独立按键控制LED移位:

(1)在main.c文件中输入以下代码,然后点击“编译”。

#include <REGX52.H>
#include <INTRINS.H>  //_nop_()需要这个头文件

void Delay(unsigned int xms)
{
	while(xms--)
	{
		unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
	}
}

unsigned char LEDNum = 0;  //定义全局变量并初始化为0

void main()
{
	P2 = 0xFE;  //将P2配置为1111 1110,让第一盏LED灯先亮
	while(1)
	{
		if(P3_1 == 0)  //每按一次K1按键,当前LED灯熄灭,下一个LED灯被点亮
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			LEDNum++;
			if(LEDNum>=8)  //一轮循环结束,下一个被点亮的LED灯回到第一盏
				LEDNum = 0;
			P2 = ~(0x01 << LEDNum);  //借助左移运算符简化代码(LED是低电平驱动,记得取反)
		}
	}
}

(2)按照上一例的操作将生成的.hex文件写进开发板,按动K1按键(K1按键对应P3的1号位)即可观察现象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: fir滤波器全称为有限脉冲响应滤波器,是一种常用的数字滤波器。它通过对输入信号的线性组合来实现信号的滤波处理。在stm32单片机的使用教程中,fir滤波器的应用可以用于对模拟信号进行数字化处理,去除噪声与杂波,使信号更加清晰可靠。 在使用stm32单片机搭建fir滤波器时,首先需要学习fir滤波器的原理与结构。fir滤波器的核心是滤波器系数,它决定了输出信号的频率特性。根据应用需求,我们可以选择不同类型的fir滤波器,比如低通、高通、带通和带阻等。 在stm32单片机中,可以使用DSP库中的函数来实现fir滤波器的计算。在使用之前,需要配置好滤波器的参数,比如采样率、截止频率、阶数等。然后,通过输入信号和滤波器系数,调用相应的库函数来进行滤波计算,最后得到滤波后的输出信号。 当fir滤波器搭建完成后,还可以通过stm32单片机的串口、LCD等外设来显示滤波前后的信号波形,便于调试与验证滤波效果。 总之,fir滤波器在stm32单片机中的应用非常广泛,可以用于音频信号的处理、数据采集与传输等方面。通过学习fir滤波器的原理与使用方法,我们可以充分发挥stm32单片机的性能,实现精确、高效的信号处理。 ### 回答2: 首先,fir滤波器是一种数字滤波器,广泛应用于信号处理中。它的特点是稳定性好、滤波效果较好,并且可以通过调整滤波器系数来实现不同的滤波效果。 在使用stm32单片机进行fir滤波时,我们需要进行以下步骤: 1. 首先,需要了解所使用的滤波器的特性和设计要求。根据输入信号的特点选择适当的滤波器类型,例如低通、高通、带通或带阻滤波器。 2. 然后,根据滤波器的要求,在单片机上设计和实现fir滤波器。我们可以使用DSP库中的函数进行滤波器系数的计算和滤波器结构的配置。 3. 在单片机中设置输入和输出的数据缓冲区,用于存储输入信号和输出信号。 4. 根据滤波器的设计要求,设置采样频率和滤波器的阶数。通过调整滤波器系数来实现所需的滤波效果。 5. 在程序中使用滤波器函数进行滤波处理。将输入信号经过滤波器处理后,得到输出信号。 6. 最后,将输出信号传输到所需的外设设备,或者进行进一步的信号处理和分析。 使用stm32单片机进行fir滤波可以使得系统对输入信号进行有效的滤波处理,提高信号的质量和准确性。同时,单片机的高性能和灵活性使得它成为实现fir滤波器的理想选择。希望通过本教程的学习,能够对stm32单片机的fir滤波器有更深入的了解,并能够顺利地进行滤波处理。 ### 回答3: fir滤波器是数字信号处理中常用的一种滤波器,由于其实现简单且性能良好,被广泛应用于音频、图像和通信等领域。在stm32单片机中,可以通过编程实现fir滤波器的功能。 首先,需要定义一个滤波器的系数数组,该数组中的元素表示滤波器的权重。根据滤波器的设计要求,可以选择不同的系数来实现不同的滤波效果。 接下来,需要定义输入和输出缓冲区。可以使用数组或者DMA缓冲区来存储输入和输出数据。 然后,需要编写滤波器函数。在滤波器函数中,可以使用循环语句来计算输出数据。具体的算法可以根据滤波器的设计要求来选择。一般情况下,可以使用卷积运算来实现fir滤波器。 最后,将输入数据送入滤波器函数中进行滤波处理,并将处理后的输出数据保存到输出缓冲区中。可以通过中断或者定时器来触发滤波器函数的执行。 需要注意的是,在实际应用中,可能需要进行滤波器的优化和调试。可以通过改变滤波器的系数、调整输入和输出数据的采样率等方法来达到期望的滤波效果。 总结起来,stm32单片机从零开始使用教程中的第八节fir滤波器,介绍了如何通过编程实现fir滤波器的功能。通过定义滤波器的系数数组、输入和输出缓冲区,并编写滤波器函数,将输入数据进行滤波处理,实现对信号的去噪或者频率响应的调整。同时,需要根据具体的应用需求对滤波器进行优化和调试,以获得满意的滤波效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值