51单片机——按键控制LED流水灯

引言

在电子制作和嵌入式系统学习中,51 单片机是一个经典且入门级的选择。按键控制 LED 流水灯是 51 单片机的一个基础应用,通过这个实例,我们可以深入了解单片机的输入输出控制原理。

51 单片机简介

51 单片机是对所有兼容 Intel 8051 指令系统的单片机的统称。它具有体积小、成本低、功能强等特点,广泛应用于各种控制领域。其内部包含中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、定时 / 计数器和多种 I/O 接口等部件。

按键控制 LED 流水灯的功能及作用

功能

通过按键控制 LED 灯按照一定顺序依次点亮和熄灭,形成流水灯效果。按下按键时,流水灯开始工作;再次按下按键,流水灯停止工作。

作用

  1. 学习单片机基础:这个项目是学习单片机 I/O 口控制的绝佳实例,能帮助初学者熟悉单片机的基本编程和硬件连接。
  2. 状态指示:在实际应用中,LED 流水灯可以作为设备状态的可视化指示,例如显示系统的运行状态、数据传输状态等。
  3. 人机交互:按键作为输入设备,实现了人与单片机系统的交互,为更复杂的人机交互设计打下基础。

硬件连接

  1. 单片机:选择常见的 STC89C52 单片机作为核心控制单元。
  2. 按键:一端连接到单片机的 I/O 口(如 P3.2),另一端接地。按键按下时,对应的 I/O 口电平被拉低。
  3. LED 灯:多个 LED 灯的阴极分别连接到单片机的不同 I/O 口(如 P1.0 - P1.7),阳极通过限流电阻连接到电源正极。当 I/O 口输出低电平时,对应的 LED 灯点亮。

软件编程

开发环境

使用 Keil C51 作为开发工具,编写 C 语言代码。

代码实现:

复制代码
#include <REGX51.H>
#include <intrins.h>


unsigned char Keynumber,LEDMode;

//延时函数
void delay(unsigned int t)
{
	unsigned char i;
	while(t--)
	{
		for(i=0;i<120;i++);
	}
}

//定时器0初始化
void Timer0Init(void)		
{
	TMOD &= 0xF0;		
	TMOD |= 0x01;		
	TL0 = 0x18;		
	TH0 = 0xFC;		
	TF0 = 0;		
	TR0 = 1;		
	EA=1;
	ET0=1;
}


//独立按键模块
unsigned int Key()
{
	unsigned char KeyNum=0;
	
	if(P3_0==0){delay(20);while(P3_0==0);delay(20);KeyNum=1;}
	if(P3_1==0){delay(20);while(P3_1==0);delay(20);KeyNum=2;}
	if(P3_2==0){delay(20);while(P3_2==0);delay(20);KeyNum=3;}
	if(P3_3==0){delay(20);while(P3_3==0);delay(20);KeyNum=4;}
	return KeyNum;
}


void main()
{
	P2=0xFE;
	Timer0Init();
	while(1)
	{
		Keynumber=Key();
		if(Keynumber)
		{
			if(Keynumber==1)
			{
				LEDMode++;
				if(LEDMode>=2)LEDMode=0;
			}
		}
	}
}

void Timer0() interrupt 1
{
	static unsigned int T0count;
	TL0 = 0x18;		//??????
	TH0 = 0xFC;		//??????
	T0count++;
	if(T0count>=1000)
	{
		T0count=0;
		if(LEDMode==0)
		{
			P2=_crol_(P2,1);
		}
		if(LEDMode==1)
		{
			P2=_cror_(P2,1);
		}
		
	}
}

总结

通过本文介绍的 51 单片机按键控制 LED 流水灯项目,我们学习了单片机的基本硬件连接和软件编程方法。这个项目不仅是一个有趣的电子制作,更是深入学习嵌入式系统的基石。希望读者通过实践,能够掌握更多单片机应用技巧,开启电子世界的探索之旅。

相关推荐
fpcc4 小时前
跟我学C++中级篇——循环展开的分析
c++·优化
li星野5 小时前
打工人日报#20251215
单片机·嵌入式硬件
清风6666665 小时前
基于单片机的压力机润滑油泵与主电机控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
飞来客isdn5 小时前
GD32F407ZGT6在FreeRTOS下串口中断接收异常情况及解决方法
单片机·mcu·freertos·信息与通信
枫叶机关录5 小时前
有刷直流电机与无刷直流电机——结构、原理与控制
嵌入式硬件·机器人·直流电机
埃伊蟹黄面5 小时前
算法 --- hash
数据结构·c++·算法·leetcode
点灯小铭5 小时前
基于51单片机的频率可调多波形函数发生器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
ULTRA??6 小时前
Informed RRT*实现椭圆启发式采样
c++·算法
CoderCodingNo6 小时前
【GESP】C++一级真题 luogu-B4410 [GESP202509 一级] 金字塔
开发语言·c++
超级大福宝6 小时前
C++中1 << 31 - 1相当于INT_MAX吗?
c语言·c++