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

相关推荐
晚风吹红霞1 分钟前
C++异常处理核心知识点全解析
开发语言·c++
CoderCodingNo2 分钟前
【信奥业余科普】C++ 的奇妙之旅 | 17:面的铺展与文本的本质——二维数组与字符串
开发语言·c++
coward918 分钟前
Linux 内核 KGDB 以及内核驱动单串口调试笔记:telnet + agent-proxy + gdb-multiarch 实践
linux·单片机·嵌入式硬件
迷途之人不知返18 分钟前
优先级队列:priority_queue
数据结构·c++
曦夜日长22 分钟前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
刻BITTER23 分钟前
VirtualBox 安装Armbian x86 虚拟机
linux·嵌入式硬件
代码中介商24 分钟前
C++ STL 标准模板库完全指南:从容器到迭代器
开发语言·c++·stl
winner888127 分钟前
C++ 构造函数、析构函数、虚函数、虚析构
开发语言·c++
想唱rap28 分钟前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
iCxhust30 分钟前
微机原理实践教程(汇编篇)---A002流水灯
汇编·单片机·嵌入式硬件·51单片机·微机原理