51单片机串行口运行代码
时间: 2023-11-08 20:05:44 浏览: 35
以下是一个简单的51单片机串口通信的代码示例,该代码可以将单片机上的按键输入通过串口发送至PC机,并且可以接收PC机发送的数据,并通过LED灯显示出来。
```c
#include <reg52.h>
// 定义串口参数
#define BAUDRATE 9600
#define TIMER_VALUE (65536 - (FOSC / 12 / BAUDRATE))
// 定义LED接口引脚
sbit LED = P1^0;
// 定义串口发送函数
void sendSerial(unsigned char data) {
SBUF = data; // 将数据写入SBUF
while (!TI); // 等待数据发送完成
TI = 0; // 清除发送完成标志位
}
// 定义串口接收函数
unsigned char receiveSerial() {
while (!RI); // 等待数据接收完成
RI = 0; // 清除接收完成标志位
return SBUF; // 返回接收到的数据
}
// 主函数
void main() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = TIMER_VALUE / 256; // 设置计时器初值
TL1 = TIMER_VALUE % 256;
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1
SM1 = 1;
REN = 1; // 启用串口接收
EA = 1; // 打开总中断
ES = 1; // 打开串口中断
while (1) { // 主循环
if (P3 != 0xFF) { // 如果有按键按下
sendSerial(P3); // 发送按键值
while (P3 != 0xFF); // 等待按键释放
}
}
}
// 串口中断处理函数
void serialISR() interrupt 4 {
if (RI) { // 如果有数据接收完成
LED = 1; // 点亮LED表示接收到数据
receiveSerial(); // 读取并忽略接收到的数据
}
if (TI) { // 如果数据发送完成
LED = 0; // 熄灭LED表示发送完成
}
}
```
该代码中,我们首先定义了波特率和计时器初值,然后在主函数中启动计时器,并设置串口为模式1,并启用串口接收。在主循环中,我们检测是否有按键按下,如果有,则将按键值发送至串口。在串口中断处理函数中,我们首先判断是否有数据接收完成,如果有,则点亮LED表示接收到数据,然后读取并忽略接收到的数据。如果数据发送完成,则熄灭LED表示发送完成。