STC89C52与pycharm建串口通信, 发送"00"P00口输出低电平,发送"01"P00口输出高电平, 发送"80"P10口输出低电平,发送"81"P10口输出高电平, 发送"150"P20口输出低电平,发送"151"P20口输出高电平, 上位机代码,和下位机代码怎么写。
时间: 2023-10-22 20:10:15 浏览: 118
下位机代码:
```c
#include <reg52.h>
sbit P00 = P0^0; // 定义P00管脚
sbit P10 = P1^0; // 定义P10管脚
sbit P20 = P2^0; // 定义P20管脚
void main()
{
unsigned char ch; // 用于存储接收到的字符
TMOD = 0x20; // 定时器1工作模式2
TH1 = 0xfd; // 波特率9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
while(1); // 无限循环等待接收到数据
}
void UART_ISR() interrupt 4 // 串口中断服务函数
{
unsigned char ch;
if(RI)
{
RI = 0; // 清除接收中断标志位
ch = SBUF; // 读取接收到的数据
switch(ch)
{
case 0x00: P00 = 0; break; // 接收到0x00时,P00输出低电平
case 0x01: P00 = 1; break; // 接收到0x01时,P00输出高电平
case 0x80: P10 = 0; break; // 接收到0x80时,P10输出低电平
case 0x81: P10 = 1; break; // 接收到0x81时,P10输出高电平
case 0x150: P20 = 0; break; // 接收到0x150时,P20输出低电平
case 0x151: P20 = 1; break; // 接收到0x151时,P20输出高电平
default: break;
}
}
}
```
上位机代码:
```python
import serial
import time
ser = serial.Serial('COM3', 9600, timeout=0.5) # 打开串口
while True:
cmd = input("请输入指令:") # 获取用户输入的指令
if cmd == 'exit': # 输入exit退出程序
break
ser.write(bytes.fromhex(cmd)) # 将指令转换为字节串并发送给下位机
time.sleep(0.5) # 延时0.5秒,等待下位机响应
if ser.in_waiting: # 如果串口缓冲区中有数据
res = ser.read(ser.in_waiting).decode() # 读取缓冲区中的数据并解码为字符串
print(res) # 输出响应结果
ser.close() # 关闭串口
```
注意事项:
1. 下位机代码中使用了串口中断服务函数,需要开启总中断(EA=1)才能正常工作。
2. 上位机代码中使用了bytes.fromhex()将字符串转换为字节串,确保指令正确发送。
阅读全文