STC89C52与pycharm建串口通信,pycharm发送"open K0"P10口输出低电平,发送"close K0"P10口输出高电平,发送"open K1"P11口输出低电平,发送"close K1"P11口输出高电平,上位机代码,和下位机代码怎么写。
时间: 2023-12-21 18:51:34 浏览: 25
下位机代码(STC89C52):
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10 = P1^0; // K0 对应 P10
sbit P11 = P1^1; // K1 对应 P11
void init() {
P10 = 1; // 初始状态输出高电平
P11 = 1; // 初始状态输出高电平
TMOD = 0x20; // 定时器1工作在模式2下
TH1 = 0xf3; // 波特率为9600
TL1 = 0xf3;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1下,允许接收数据
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void send_char(uchar ch) {
SBUF = ch; // 发送字符
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void main() {
init();
while (1) {
// TODO: 执行其他操作
}
}
void serial_isr() interrupt 4 {
if (RI) { // 接收到数据
uchar ch = SBUF; // 读取接收到的数据
RI = 0; // 清除接收标志位
if (ch == 'o') { // 接收到 "open" 命令
ch = SBUF; // 继续读取下一个字符
if (ch == 'n') {
ch = SBUF; // 继续读取下一个字符
if (ch == ' ') {
ch = SBUF; // 继续读取下一个字符
if (ch == 'K') {
ch = SBUF; // 继续读取下一个字符
if (ch == '0') {
P10 = 0; // K0 输出低电平
} else if (ch == '1') {
P11 = 0; // K1 输出低电平
}
}
}
}
} else if (ch == 'c') { // 接收到 "close" 命令
ch = SBUF; // 继续读取下一个字符
if (ch == 'l') {
ch = SBUF; // 继续读取下一个字符
if (ch == 'o') {
ch = SBUF; // 继续读取下一个字符
if (ch == 's') {
ch = SBUF; // 继续读取下一个字符
if (ch == 'e') {
ch = SBUF; // 继续读取下一个字符
if (ch == ' ') {
ch = SBUF; // 继续读取下一个字符
if (ch == 'K') {
ch = SBUF; // 继续读取下一个字符
if (ch == '0') {
P10 = 1; // K0 输出高电平
} else if (ch == '1') {
P11 = 1; // K1 输出高电平
}
}
}
}
}
}
}
}
}
}
```
上位机代码(Python):
```python
import serial
import time
ser = serial.Serial('COM1', 9600) # 这里将 COM1 替换为实际串口号
def send_cmd(cmd):
ser.write(cmd.encode()) # 发送命令
time.sleep(0.1) # 等待下位机执行完毕
while True:
cmd = input("请输入命令(open/close K0/K1):")
if cmd == "exit":
break
send_cmd(cmd)
```
上位机代码中,`serial.Serial` 的参数 `'COM1'` 填写的应该是实际使用的串口号,例如 `'COM2'`、`'/dev/ttyUSB0'` 等等。`send_cmd` 函数用于发送命令,并等待下位机执行完毕。用户输入命令后,通过 `send_cmd` 函数发送到下位机,下位机接收到命令后解析,并执行相应的操作。