c51串口通信点亮灯
时间: 2025-05-22 11:48:31 浏览: 22
### 实现C51单片机串口通信控制LED灯点亮
以下是基于C51单片机实现串口通信并控制LED灯点亮的示例代码。该程序通过接收来自串口的数据来决定是否点亮或关闭指定的LED灯。
#### 示例代码
```c
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit led1 = P2^1; // 定义P2.1为led1引脚
sbit led2 = P2^2; // 定义P2.2为led2引脚
void UsartInit() {
SCON = 0x50; // 设置SCON寄存器,模式1,REN=1允许接收
TMOD = 0x20; // 设置定时器T1工作于方式2作为波特率发生器
PCON = 0x80; // SMOD=1 波特率加倍
TH1 = 0xF4; // 初始值设定 ([email protected])
TL1 = 0xF4;
ES = 1; // 开启串口中断
EA = 1; // 总中断开启
TR1 = 1; // 启动定时器T1
}
void main(void) {
UsartInit(); // 初始化串口
led1 = 1; // 默认状态下,两个LED均熄灭
led2 = 1;
while(1) { // 主循环等待中断处理
; // 空操作
}
}
void Usart() interrupt 4 { // 中断服务程序
static u8 receiveData;
if(RI == 1) { // 如果接收到数据
receiveData = SBUF; // 获取接收到的数据
switch(receiveData) {
case 'A': // 接收字符'A'时,切换led1的状态
led1 = !led1;
break;
case 'B': // 接收字符'B'时,切换led2的状态
led2 = !led2;
break;
default: // 其他情况不做任何操作
break;
}
RI = 0; // 清除接收标志位
}
}
```
#### 功能说明
- **串口初始化**:`UsartInit()` 函数配置了串口参数,包括波特率(此处设为9600)、定时器模式等[^4]。
- **主函数**:在 `main()` 函数中调用了串口初始化,并设置了初始状态下的LED均为熄灭。
- **中断服务程序**:当有数据到达时触发中断,在 `Usart()` 函数中对接收到的数据进行判断。如果接收到字符 `'A'` 或 `'B'`,则分别改变对应LED的状态[^4]。
#### 延迟机制
为了让人眼能明显感知到LED的变化效果,可以加入简单的延时函数。虽然本案例未涉及流水灯功能,但如果需要扩展此类应用可参考以下延迟方法:
```c
void Delay(u16 time) {
while(time--) {
;
}
}
```
将其用于适当位置即可满足需求[^5]。
阅读全文
相关推荐

















