STC89C52与pycharm建串口通信,pycharm发送"open K0"P10口 输出低电压, 发送"close K0"P10口 输出高电平,发送"open K1"P11口 输出低电压, 发送"close K1"P11口 输出高电平,电压上位机代码,和下位机代码怎么写。
时间: 2023-12-24 22:47:28 浏览: 124
基于C#的串口通信上位机和下位机源程序.pdf
下位机代码:
```c
#include <reg52.h>
#include <string.h>
// 定义串口通信相关参数
#define UART_BAUD_RATE 9600
#define TIMER1_PRESCALER 12
#define TIMER1_RELOAD_VALUE (65536 - (11059200 / TIMER1_PRESCALER / UART_BAUD_RATE))
// 定义控制 IO 口的宏
#define K0 P1_0
#define K1 P1_1
// 定义接收缓存区和接收缓存区指针
#define BUFFER_SIZE 16
volatile char buffer[BUFFER_SIZE];
volatile unsigned char buffer_pointer = 0;
// 定义函数
void init_timer1();
void init_uart();
void uart_send_char(unsigned char c);
void uart_send_string(char *s);
void process_command(char *command);
// 主函数
void main() {
// 初始化定时器 1 和串口
init_timer1();
init_uart();
// 主循环
while (1) {
// 如果接收缓存区有数据
if (buffer_pointer > 0) {
// 处理接收到的命令
process_command(buffer);
// 清空接收缓存区
memset(buffer, 0, BUFFER_SIZE);
buffer_pointer = 0;
}
}
}
// 初始化定时器 1
void init_timer1() {
// 设置定时器 1 的模式为 16 位自动重载模式
TMOD &= 0xF0;
TMOD |= 0x10;
// 设置定时器 1 的预分频器为 12
CKCON &= 0xF0;
CKCON |= 0x02;
// 设置定时器 1 的重载值
TH1 = TIMER1_RELOAD_VALUE >> 8;
TL1 = TIMER1_RELOAD_VALUE & 0xFF;
// 启动定时器 1
TR1 = 1;
}
// 初始化串口
void init_uart() {
// 设置串口的工作模式和波特率
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
// 开启串口中断
ES = 1;
// 开启全局中断
EA = 1;
}
// 串口发送一个字符
void uart_send_char(unsigned char c) {
SBUF = c;
while (!TI);
TI = 0;
}
// 串口发送一个字符串
void uart_send_string(char *s) {
while (*s) {
uart_send_char(*s++);
}
}
// 处理接收到的命令
void process_command(char *command) {
// 如果命令是 "open K0"
if (strcmp(command, "open K0") == 0) {
K0 = 0;
uart_send_string("P10 output low\r\n");
}
// 如果命令是 "close K0"
else if (strcmp(command, "close K0") == 0) {
K0 = 1;
uart_send_string("P10 output high\r\n");
}
// 如果命令是 "open K1"
else if (strcmp(command, "open K1") == 0) {
K1 = 0;
uart_send_string("P11 output low\r\n");
}
// 如果命令是 "close K1"
else if (strcmp(command, "close K1") == 0) {
K1 = 1;
uart_send_string("P11 output high\r\n");
}
}
// 串口中断服务程序
void uart_isr() interrupt 4 {
if (RI) {
// 读取接收到的字符
char c = SBUF;
// 如果接收缓存区未满
if (buffer_pointer < BUFFER_SIZE - 1) {
// 将接收到的字符添加到接收缓存区中
buffer[buffer_pointer++] = c;
}
RI = 0;
}
}
```
上位机代码:
```python
import serial
import time
# 定义串口通信相关参数
BAUD_RATE = 9600
PORT = "COM1"
# 定义命令字符串
OPEN_K0 = "open K0"
CLOSE_K0 = "close K0"
OPEN_K1 = "open K1"
CLOSE_K1 = "close K1"
# 初始化串口
ser = serial.Serial(PORT, BAUD_RATE, timeout=0.1)
# 输出低电压
ser.write(OPEN_K0.encode())
print(ser.readline().decode())
# 输出高电压
ser.write(CLOSE_K0.encode())
print(ser.readline().decode())
# 输出低电压
ser.write(OPEN_K1.encode())
print(ser.readline().decode())
# 输出高电压
ser.write(CLOSE_K1.encode())
print(ser.readline().decode())
# 关闭串口
ser.close()
```
阅读全文