串口的理论知识我就不记了,网上多的是。51单片机的串口,有4种方式,分别为方式0,方式1,方式2,方式3.由于我的目的,使用串口主要是为了和电脑进行通信,所以主要使用方式1(事实上我也只学了方式1,其他方式等用到的时候再学吧)。
串口的方式1,其波特率与定时器T1相关,公式如下:
方式1波特率 = (2SMOD×32)/(T1溢出率)
SMOD是一个寄存器,一般我们就取0了
T1的溢出率,即每秒T1计数满几次(相关知识可以看看前面笔记的记录)
正是因为如上的公式,所以设置TH1和TL1的初值,就能控制方式1的波特率了。不过一般波特率是固定的那么几种,像2400,4800和9600等,要用的时候查一下初值就成了。
由于用的是Proteus来模拟串口(我的笔记本电脑根本没串口),所以需要一个虚拟串口的软件。推荐使用的是Visual Serial Port Driver,用起来非常的简单,直接点击Add Pair就成了,会自动增加一对串口,模拟的时候,分别连接这两个端口就成。添加好后,可以把这个程序关闭,端口仍旧可以使用。
要说一下的是,这软件是一个收费软件(能免费使用14天),所以,如果只想学习一下串口的话,我们就自私一下吧,不购买了,直接使用一个控制软件时间的软件(比如Run As Date),让程序以为时间一直没变,就能一直试用了……
要试验一下Proteus是否可以进行串口连接,可以直接打开安装目录下的\SAMPLES\Interactive Simulation\COMPIM Demo,设置好波特率等参数后,使用“串口调试助手”,向Proteus发送数据,看看能否接收到。
运行后的效果:
如果像上图一样,在“助手”中输入数据,可以在Proteus的虚拟终端中接收到,说明可以进行串口的仿真了。如果不能接收,则需要检查一下,波特率等参数是否设置的一致,特别是串口,要设置的“成双成对”,如从“串口助手”的COM1发送到Proteus的COM2
------------------------------------------------------------------
开始进入实际编码,我希望写一个上位机程序,来控制单片机,单片机很简单,就是从P2口,接8个LED灯,而上位机程序则可以控制灯的亮或者暗,原理图如下:
实物做的时候,由于电脑的串口和单片机的串口电平不同,需要使用MAX232芯片做电平转换,但是这里是模拟,就不加芯片了,同样能正常运行。加上虚拟终端,是为了直接看到接收到的数据,方便调试。
上位机程序如下图,使用C#编写,编程工具是VS 2008,因为用的是最简单的语法,所以是基于.NET 2.0写的。
上位机写的特别简单,选择好端口后连接,然后控制单片机。可以做到控制任意灯的开和关,下面的控制则可以做到全开或全关,流水灯则是让单片机演示一次流水灯(演示期间不再接受上位机控制)。上位机的控制代码特别简单,就是给单片机发送一个8位的byte(这个花了我很多时间,因为单片机上的char是8位的,我自然而然的把C#上的char也当成是8位了,结果就是发给单片机的时候会出现错误,感谢群里大虾的热情帮助)。控制格式如下(最低位为第0位):
位数 作用 0 表示选择第几个灯,0001表示选择第1个灯,0101表示选择第5个灯,当第5,6,7位任意位为1时,则无效 1 2 3 4 表示选择的灯是开还是关,1表示开 5 1表示流水灯 6 1表示全灭 7 1表示全开
数据位从高位检查起,所以如果第7位为1 ,则后面几位不管设置成什么,都会是灯全开的效果。
单片机程序和上位机程序都写得很简单,里面有详细注释,应该一看就能明白了。演示效果如下(录制的不是很流畅……):