使用STC89C52与pycharm建立串口通信,pycharm建立函数通过def control_io(port, pin, value)组数据控制P0、P1、P2、P3的任意I/O口输出高电平或者低电平,上位机和下位机代码。
时间: 2024-05-16 18:14:57 浏览: 105
这里给出一个简单的上位机和下位机代码示例,仅供参考。
下位机代码:
```c
#include <reg52.h>
// 定义串口通信相关参数
#define BAUDRATE 9600
#define TIMER_TH ((65536 - FOSC / 32 / BAUDRATE) / 256)
#define TIMER_TL ((65536 - FOSC / 32 / BAUDRATE) % 256)
// 定义控制IO口的宏
#define IO_HIGH(port, pin) (port |= (1 << pin))
#define IO_LOW(port, pin) (port &= ~(1 << pin))
// 串口初始化函数
void uart_init() {
TMOD = 0x20; // 设置定时器1为模式2(8位自动重载)
TH1 = TIMER_TH;
TL1 = TIMER_TL;
TR1 = 1; // 启动定时器1
SM0 = 0;
SM1 = 1; // 设置串口工作模式为模式1(8位异步收发,波特率可变)
REN = 1; // 允许接收数据
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
}
// 串口发送函数
void uart_send(unsigned char dat) {
SBUF = dat;
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
// 接收到数据后的处理函数
void handle_data(unsigned char dat) {
unsigned char port = 0, pin = 0, value = 0;
if (dat == '0' || dat == '1') {
// 第一个字符表示端口号(0~3)
port = dat - '0';
dat = SBUF; // 读取下一个字节
if (dat >= '0' && dat <= '7') {
// 第二个字符表示引脚号(0~7)
pin = dat - '0';
dat = SBUF; // 读取下一个字节
if (dat == '0' || dat == '1') {
// 第三个字符表示输出高低电平
value = dat - '0';
// 控制IO口输出高低电平
if (value == 0) {
IO_LOW(P0, pin);
} else {
IO_HIGH(P0, pin);
}
if (port == 1) {
if (value == 0) {
IO_LOW(P1, pin);
} else {
IO_HIGH(P1, pin);
}
}
if (port == 2) {
if (value == 0) {
IO_LOW(P2, pin);
} else {
IO_HIGH(P2, pin);
}
}
if (port == 3) {
if (value == 0) {
IO_LOW(P3, pin);
} else {
IO_HIGH(P3, pin);
}
}
}
}
}
}
// 串口中断服务函数
void uart_isr() interrupt 4 {
if (RI) {
// 有数据接收
handle_data(SBUF);
RI = 0; // 清除接收中断标志
}
}
// 主函数
void main() {
uart_init();
while (1);
}
```
上位机代码:
```python
import serial
ser = serial.Serial('COM1', 9600, timeout=1)
def control_io(port, pin, value):
cmd = str(port) + str(pin) + str(value)
ser.write(cmd.encode())
if __name__ == '__main__':
control_io(0, 0, 1) # 控制P0.0输出高电平
control_io(1, 2, 0) # 控制P1.2输出低电平
control_io(2, 5, 1) # 控制P2.5输出高电平
control_io(3, 7, 0) # 控制P3.7输出低电平
ser.close()
```
这里使用了Python的`serial`模块建立串口通信,通过`ser.write()`函数向下位机发送控制命令。`control_io()`函数接收三个参数,分别为端口号(0~3)、引脚号(0~7)和输出电平(0或1),将这三个参数拼接成一个字符串作为命令发送给下位机。注意在Windows系统中,串口通信时需要指定COM口号。
阅读全文