前言

小主人的学习路线是c51→stm32hal库→freertos→c++qt→linux;小橘将从0开始学习并熟练掌握以上全部内容,和小主人们一起进步~

在本篇文章中小主人可以掌握基本IO口的控制~

一、点亮第一颗led

在这里插入图片描述
这是小橘手上的普中51开发板所给的原理图,二极管都是正向导通,例如图中的D1,当P20是低电平的时候D1会被点亮,所以我们可以知道这块开发板中的led模块都是0亮1灭。
弄清楚这一点之后,我们就可以开始写点亮第一颗led的代码啦,不会C语言的小主人们也不要怕,小橘会在代码的注释中说明C语言是怎么用的,请放心食用~

1.固定格式

#include <reg52.h>
void main()
{
}

2.正式开始点灯

#include <reg52.h>
sbit led1=P2^0;//sbit可以理解成在定义led1的控制引脚是上面原理图中的P20,注意P需要大写P20需要写成P2^0
void main()
{
  led1=0;//意思是给P20置为低电平,所以led1就被点亮了
}

二、让led闪烁

让led闪烁:led亮一段时间→led灭一段时间,小主人们现在已经会控制亮灭了,那么一段时间应该怎么控制呢?
我们来到stc-isp,点击右三角形,选择软件延时计算器,选择好定时长度和指令集就可以生成C代码了,然后只需要复制代码到main函数之前就可以在main函数中使用了~
在这里插入图片描述
就拿20ms来举个栗子,将生成的代码放在main函数之前就是这样~

#include <reg52.h>
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
}

让led闪烁的完整代码就是这样~

#include <reg52.h>
sbit led1=P2^0;
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	while(1)//使得led一直在闪烁中,不会跳出闪烁
	{
		led1=0;
		Delay20ms();
		led1=1;
		Delay20ms();
	}
}

三、按键控制led灯

1.按键的相关原理

首先需要检测按键,那是怎么样检测按键的呢?核心是通过电平变化来判断键盘是否按下。
在这里插入图片描述
1.假如SW1按下,会把KEY1的电平拉低为低电平,体现为逻辑0
2.假如SW1松开,上拉电阻 R1 虽然存在,但松开按键时,这个电阻上几乎没有电流,所以不会产生电压降,KEY1 节点的电压就等于 5V,那么KEY1的电平就会表现为高电平
3.所以SW1按下对应逻辑0,SW1松开对应逻辑1

2.消抖

机械按键的物理特性会导致 “触点抖动”,如果不消抖,程序会把一次按键误判成多次,功能就乱了。那么有什么办法可以克服抖动呢?
1.硬件电容消抖:上图中的电容 C3就像 “缓冲水箱”,按键抖动会导致电平跳变,电容会快速充放电,把跳变的电平 “拉平”,让 KEY1 的电平变化更平稳;
2.软件延时消抖:先检测到按键按下即key=0,延时一段时间后再次检测按键,如果为0就表示是真实按下,如果为1则表示是抖动导致的假按下。

if(key==0)//==表示判断,判断是否按下
{
	Delay100us();//延时
 	if(key==0)//再次判断是否按下
	{
		//执行对应的任务
	}
}

3.单个按键控制灯亮

#include <reg52.h>
sbit key1=P3^1;
sbit led1=P2^0;
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		if(key1==0)//==表示判断,判断是否按下
		{
			Delay20ms();//延时
 			if(key1==0)//再次判断是否按下
				{
					led1=0;
				}
		}
	}
}

四、两个按键分别控制led灯的亮灭

#include <reg52.h>
sbit key1=P3^1;
sbit key2=P3^0;
sbit led1=P2^0;
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		if(key1==0)//==表示判断,判断是否按下
		{
			Delay20ms();//延时
 			if(key1==0)//再次判断是否按下
				{
					led1=0;//亮
				}
		}
		if(key2==0)//==表示判断,判断是否按下
		{
			Delay20ms();//延时
 			if(key2==0)//再次判断是否按下
				{
					led1=1;//灭
				}
		}
	}
}

五、一个按键控制led灯的亮灭

让led的状态翻转只需要一个!就可以搞定,使用的前提就是我们必须要设定led的初始状态为亮或者灭。

#include <reg52.h>
sbit key1=P3^1;
sbit led1=P2^0;
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 36;
	j = 217;
	do
	{
		while (--j);
	} while (--i);
}

void main()
{
	led1=1;//设定初始状态下led为熄灭
	while(1)
	{
		if(key1==0)//==表示判断,判断是否按下
		{
			Delay20ms();//延时
 			if(key1==0)//再次判断是否按下
				{
					led1=!led1;//状态翻转
					while(key1==0);//等待按键释放
				}
		}
	}
}

六、练习题目:C51双按键控制LED基础进阶

①功能要求(仅用延时函数实现,无定时器):
K1功能:短按,LED状态翻转;
K2功能:短按,LED进入"流水闪"模式(亮200ms-灭200ms,循环),再次短按K2退出"流水闪",
LED恢复当前固定状态(亮/灭);
②功能要求(仅用延时函数实现,无定时器):
K1功能:短按,LED状态翻转;
K2功能:短按,LED进入"流水闪"模式(亮20ms-灭20ms,循环),再次短按K2退出"流水闪",
LED恢复当前固定状态(亮/灭);
通过上述题目可以了解到阻塞的相关知识~


总结:核心知识点回顾

LED 控制核心:普中 51 开发板 LED 为 “低电平点亮(0 亮 1 灭)”,通过sbit定义引脚、赋值电平实现亮灭控制;
延时与循环:while(1)实现无限循环(让 LED 持续闪烁 / 按键持续检测),STC-ISP 生成的延时函数需匹配实际需求(消抖用 5-20ms,闪烁可自定义);
按键检测关键:通过 “电平变化(按下 0 / 松开 1)” 判断按键状态,需结合 “软件消抖 + 等待按键释放” 避免误触发;
状态管理技巧:用变量 / 宏定义做状态位(如led_status),可提升代码可读性,实现 LED 状态的精准控制

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐