如何用python点亮一盏灯

引子

听说过很多点亮一盏灯的故事。你问一个程序员,愿意为我点亮一盏灯吗?回答或许是:可以,如果让我选择点亮的时间,我愿意是一万年;如果让我选择点亮的方式,我原意选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程序员一顿操作,三个小时侯后,灯终于亮了,等得不耐烦的那位早走了。窗外,星星点灯!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值