利用51单片机,通过串口通信,控制上位机软件pygame,进行推箱子游戏。
环境准备
1.创建串口
我们首先用需要虚拟串口软件创建两个串口(虚拟串口配对软件的使用)
然后打开虚拟串口助手(可以重复打开)
2.下载serial串口通信模块
win+R输入cmd打开命令行,输入:pip install pyserial
(我刚开始下载的是serial结果运行出错)虽然下载的是pyserial,但是导入时却是serial。
import serial #导入通信模块
import time
ser = serial.Serial('COM4',9600,timeout=0.01) #接入串口“COM4”,波特率为9600,连接超时0.01秒
print(ser.is_open) #检验窗口是否打开
while(1):
s = ser.read(1) #读入数据赋值给s. 函数read中的数字为读入数据位数,在此我只需读取以为即可
if(s): #需要判断有没有,不然会不停打印
print(s)
然后我们用串口助手和python通信测试一下
下位机
1.我们先用proteus仿真单片机
接线和元器件如下
几个需要调节的地方
2.然后我们进入keil编写程序
初始化通信
void init()
{
SCON =0x50; //0101 0000 方式一,允许接收
TMOD=0x20;//0010 0000 采用定时器设置波特率
TH1=0xfd; //设置波特率为9600.所有的波特率都要相同发送才不会出现乱码
TL1=0xfd;
TR1=1; 启动T1
}
因为在这里我们的单片机只需要发送信号,不需要接收信号,而且由按键触发,所以在这里我就不用写中断函数了,写一下此过程的伪代码吧。
while(1)
{
当按键触发(单击事件):
{
SBUF = 0x01 //将要发送的数据储存在SBUF,就是缓存器 (发送会是十六进制)
while(!TI);//发送过程中TI为0,发送完成后自动变为1,跳出循环,功能是等待字节发送
TI=0; //置0后好进行下一次发送
}
}
最后生成hex文件导入到protrus仿真中
单片机与python通信
1.首先分别连接串口
2.按下按键我们可以看见分别发送了四个不同的信号,我们发送采用的是十六进制,收到也是十六进制。
此时我们只要稍加处理变可转化为我们需要的
s = ser.read(1)
m=s.decode("iso-8859-15"#将读入的数据转换为整数再打印
if(m): #需要判断有没有,不然会不停打印
l=ord(m)
print(l)
``
现在我们离成功不远了,我们只需把读取数据的代码放入到主循环中。这里有一点需要特别注意(敲黑板)还记得我们的通讯实例化吗?ser=serial.Serial('COM4',9600,timeout=0.01)
一定一定要加入连接超时,不然就会出现阻塞,主循环就会卡住。然后只需将推箱子的操作函数改一下即可。