引子
听说过很多点亮一盏灯的故事。你问一个程序员,愿意为我点亮一盏灯吗?回答或许是:可以,如果让我选择点亮的时间,我愿意是一万年;如果让我选择点亮的方式,我原意选python语言。
说完,他打开电脑,启动命令行窗口:输入一行文字:python led.py -s o
神奇的是,灯真的亮了!!!
原来如此
在电脑上输入一句话就可以点亮一盏灯吗?是的,不过仅仅有python语言还不够,还得有一盏灯,一个单片机,一个带串口转换功能的usb线,就跟下面的图片有点像:
工作原理如下:
python语言收到打开led灯的请求,向串口发送数据,usb转换线模拟了串口功能,发送数据到达单片机的串口模块。单片机上的中断处理程序接到请求,读到请求数据后拉低LED负极的电平,电流通过发LED,灯被电亮。
这是一个听起来很简单的过程,但也是一个软硬件协同工作的例子。
python代码如下
# -*- coding:utf-8 -*-
# 向串口发送数据,控制led灯的点亮
import serial
import time,sys
import getopt
#设置端口和波特率
selComPort ='com5'
print("connect...", selComPort)
#波特率
selBaudRate =9600
ser = serial.Serial()
ser.port =selComPort
ser.baudrate =selBaudRate
ser.timeout =3
#打开串口,如果不设置超时值,则在读不到串口数据时会阻塞。
#通信过程中往往是第一次读串口数据时取不到数据
#ser = serial.Serial("COM3", timeout=3)
ser.open()
#解析命令行参数 python led.py -s o 点亮,python led.py -s c 熄灭
try:
opts, args = getopt.getopt(sys.argv[1:],'s:',['status='])
except getopt.GetoptError:
print('error:','options invalid')
sys.exit()
status = 'c'
for k, v in opts:
if k in ("-s", "--status"):
status = v
i = 0
while True:
i+=1
#实践发现第一次发送的数据,stc51单片机还未发现没有收到的情形,
#在用arduino时,基本上第一次发送的数据都没有收到
#为确保无误,还是以收到单片机的返回消息后才结束尝试
ser.write(status)
#ser.write("off")
received = ser.readline()
print('loop index:',i,'received:',received)
if received:
break
单片机代码如下
/************************************************************
*实验名 :串口通讯
*实验效果:配合串口助手使用 将pc机发出的数据传送到单片机中
* 单片机将接收到的数据发送到pc机 可以在串口助手上显示
*波特率: 9600
************************************************************/
#include<reg52.h>
sbit led1 = P1^0;
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //SMOD=0,32分频
TH1=0Xfd; //计数器初始值设置,注意波特率是9600的
TL1=0Xfd;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartConfiguration();
while(1);
}
void uart() interrupt 4
{
unsigned char rec;
rec = SBUF;//取出接收到的数据
if(rec == 'o'){
led1 = 0;
}
if(rec == 'c'){
led1 = 1;
}
RI = 0;//清除接收中断标志位
SBUF = rec;//将接收到的数据放回发送缓存器
while(!TI);//等待发送数据完成
TI = 0;//清除发送中断标志位
}
还需要什么
还需要一个keil_C51的编程软件,它负责将c语言的代码编译成可单片机上运行的二进制文件,如图所示
还需要一个将编译好的程序下载到单片机的软件:stc-isp-15xx-v6.85.exe,它负责将二进制文件下载(烧写)到单片机上
工作界面如下图所示:
还需要,还需要不能将线接错了
接线提示
此文所说的usb转串口用的是PL2303芯片,
参见《PL2303资料/PL2033下载线说明书》可知引脚定义:
红色 5V
黑色 GND
白色 RXD
绿色 TXD
再查:stc51的定义,得知
p3.0 ->RXD
P3.1 ->TXT,
根据串口数据线交叉连接的原则,得到
usb转串口板与单片机的连接关系如下:
红色 5V -> vcc5.0
黑色 GND ->GND
白色 RXD ->p3.1
绿色 TXD->p3.0
大结局
python程序员一顿操作,三个小时侯后,灯终于亮了,等得不耐烦的那位早走了。窗外,星星点灯!