第 8 篇:串口通信------让单片机"说话"
之前所有程序都是单片机"自言自语"。串口让它能和电脑通信------这是调试和控制的利器。
1. 硬件连接
scss
STC89C52 USB-TTL 烧录器 电脑
P3.0(RXD) ←── TXD
P3.1(TXD) ──→ RXD
GND ──── GND
2. 串口配置(9600bps,方式 1)
c
void uart_init(void)
{
SCON = 0x50; // 方式 1(8 位 UART),允许接收
TMOD &= 0x0F;
TMOD |= 0x20; // 定时器 1 方式 2(8 位自动重装)
TH1 = 0xFD; // 9600bps @ 11.0592MHz
TL1 = 0xFD;
TR1 = 1; // 启动定时器 1
ES = 1; // 使能串口中断
EA = 1;
}
3. 发送与接收
c
// 发送一个字符
void uart_send_byte(unsigned char dat)
{
SBUF = dat; // 写 SBUF = 开始发送
while (TI == 0); // 等发送完成
TI = 0; // 清除标志
}
// 发送字符串
void uart_send_string(char *str) {
while (*str) uart_send_byte(*str++);
}
// 接收(中断方式)
unsigned char rx_buf[64];
unsigned char rx_len = 0;
void uart_isr(void) interrupt 4
{
if (RI) { // 收到数据
RI = 0;
rx_buf[rx_len++] = SBUF;
if (rx_buf[rx_len-1] == '\n') { // 收到换行 = 一帧结束
rx_buf[rx_len] = '\0'; // 加字符串结束符
uart_process(rx_buf); // 处理指令
rx_len = 0;
}
}
}
4. printf 重定向------调试神器
c
#include <stdio.h>
char putchar(char c) {
SBUF = c;
while (TI == 0);
TI = 0;
return c;
}
// 现在可以直接用 printf 了
printf("Temperature: %d°C\r\n", temp);
printf("Speed: %d RPM\r\n", speed);
5. 实战:串口控制指令
c
void uart_process(char *cmd)
{
if (strncmp(cmd, "LED ON", 6) == 0) {
LED = 0;
printf("LED turned ON\r\n");
}
else if (strncmp(cmd, "LED OFF", 7) == 0) {
LED = 1;
printf("LED turned OFF\r\n");
}
else if (strncmp(cmd, "TEMP", 4) == 0) {
printf("Temperature: %d°C\r\n", read_temp());
}
else {
printf("Unknown command: %s\r\n", cmd);
}
}
电脑端用串口助手发送 LED ON → 单片机收到 → LED 亮 → 回复 LED turned ON。
下一篇:LCD1602 液晶屏------高级显示方案