引言
在电子制作和嵌入式系统学习中,51 单片机是一个经典且入门级的选择。按键控制 LED 流水灯是 51 单片机的一个基础应用,通过这个实例,我们可以深入了解单片机的输入输出控制原理。
51 单片机简介
51 单片机是对所有兼容 Intel 8051 指令系统的单片机的统称。它具有体积小、成本低、功能强等特点,广泛应用于各种控制领域。其内部包含中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、定时 / 计数器和多种 I/O 接口等部件。
按键控制 LED 流水灯的功能及作用
功能
通过按键控制 LED 灯按照一定顺序依次点亮和熄灭,形成流水灯效果。按下按键时,流水灯开始工作;再次按下按键,流水灯停止工作。
作用
- 学习单片机基础:这个项目是学习单片机 I/O 口控制的绝佳实例,能帮助初学者熟悉单片机的基本编程和硬件连接。
- 状态指示:在实际应用中,LED 流水灯可以作为设备状态的可视化指示,例如显示系统的运行状态、数据传输状态等。
- 人机交互:按键作为输入设备,实现了人与单片机系统的交互,为更复杂的人机交互设计打下基础。
硬件连接
- 单片机:选择常见的 STC89C52 单片机作为核心控制单元。
- 按键:一端连接到单片机的 I/O 口(如 P3.2),另一端接地。按键按下时,对应的 I/O 口电平被拉低。
- 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 流水灯项目,我们学习了单片机的基本硬件连接和软件编程方法。这个项目不仅是一个有趣的电子制作,更是深入学习嵌入式系统的基石。希望读者通过实践,能够掌握更多单片机应用技巧,开启电子世界的探索之旅。