一、思路

前面的文章介绍了STC官方在其烧录工具STC-ISP软件中集成了一整套“虚拟串口屏”设备,用户可以根据相应的接口协议编程来实现人机交互功能。

本质上人机交互设备的接口协议是计算机与计算机之间的协议,程序员直接用它来编程既不直观又不方便,因此通常通过使用驱动程序的方法来实际编程,例如STC就在其范例程序中提供了一套完整的驱动程序供用户使用。

对同一套外部设备,接口协议是唯一的,但是驱动程序可以根据不同的目的和要求是不同的。

STC-ISP集成的“虚拟串口屏”设备有一个最大的特点模拟真实设备,比如“LED-DIP40”设备与STC的最小开发板“打狗棒”和“降龙棍”上的LED排列是一致的,见下图所示:

stc单片机串口通信驱动(虚拟串口屏技术)(1)

针对这种“仿真虚拟设备”的特点,笔者认为可以模仿程序对实际硬件的编程操作方法,开发出一种形式和内涵都“仿真如真”的驱动程序。

二、“仿真如真”的8位端口驱动程序设计

STC最新系列的单片机都包括了P0~P7八个8位端口,通过这些端口来实现单片机功能和对外部设备的控制。在程序设计中,这些端口通过特殊功能寄存器(SFR)来操作。

典型的对8位端口控制的范例程序是在这些端口上接下拉的LED灯,然后用程序控制这些LED灯按不同的模式发光。

下图是利用STC打狗棒上的LED灯展示单片机8位端口控制的例子。

stc单片机串口通信驱动(虚拟串口屏技术)(2)

(1)图中省略了第72行到第79行的程序,从第64行到第87行,这是一个8节拍的使用连接在P0、P1和P2端口的LED花样灯程序。

其中P2是跑马灯效果,而P0和P1则是每一拍先读取当前端口的值,取反后又赋值回给端口,显示的效果是原来亮的LED灯熄灭了,原来熄灭的LED灯变亮了。

在程序中,P0和P1的初始值为“P0=0x55;P1=0x0F;”,因此本程序的效果是P0端口的LED灯相邻的两个交替发光,P1端口的LED灯上面4个一组与下面4个一组交替发光。下图视频是这段硬件程序在STC打狗棒开发板实际运行的效果。

由于打狗棒没有P12位端口,代替的是P52位端口,所以在视频中该位置的LED灯是常亮不变的。

(2)从上面程序中可以看到,对用SFR定义8位端口像变量一样不但有赋值操作(第70行),而且有读取操作(第68、69行),因此按照“仿真如真”的思路,在本节驱动程序中同样定义了8个仿真端口字节变量:

// ---- 仿真端口 数据 ----------------

unsigned char data STCISP_P0, STCISP_P1, STCISP_P2, STCISP_P3;

unsigned char data STCISP_P4, STCISP_P5, STCISP_P6, STCISP_P7;

按照SFR的定义,这里仿真端口字节变量不但类型是无符号字节变量,而且变量存储类型也是“data”类型,这样对于汇编语言,也是使用“MOV data8”的直接寻址指令来操作,使得驱动程序高度仿真Px端口。

(8)本文LED范例使用驱动程序,主程序如下图:

stc单片机串口通信驱动(虚拟串口屏技术)(3)

按照预先的设计,第73行到第75行对仿真端口字节变量的程序操作与第68行到第70行对实际硬件端口一一对应,达到了“仿真如真”的目的。

有了驱动程序,程序员可以按照本文的介绍直接操作仿真端口字节变量,让STC-ISP虚拟仿真设备实现相应的显示功能。

(9)对仿真端口字节变量操作后,还需要将新的端口状态更新到STC-ISP虚拟仿真设备上。驱动程序提供了两个刷新函数:第78行按照接口协议刷新LED-DIP40虚拟设备,第79行按照接口协议刷新LED-DIP64虚拟设备。

(10)下面的视频是使用本范例驱动程序编程的LED-DIP64虚拟设备的运行效果。对比前面的硬件开发板视频,两者几乎一致,达到了仿真的目的。

两者唯一的差别第3引脚(P52)的LED灯,硬件实际的LED灯是常亮的,而仿真的LED灯是熄灭的。

(11)虚拟仿真设备要模拟真实硬件设备,除了编写控制程序,对硬件设备和对仿真设备的初始化也很重要。下图是本范例的初始化程序部分:

stc单片机串口通信驱动(虚拟串口屏技术)(4)

按照程序P52被初始化为高电平,对应的LED灯应该是熄灭的,所以STC-ISP上的虚拟仿真设备LED-DIP40的显示与程序一致,因此实际打狗棒开发板上的P52发光一定是另有原因。

经检查打狗棒电路图,为了进行串口3与串口4间的通讯实验,将P52通过100欧的电阻连接到P51管脚上了。按照初始化程序“P5=0x55;”,P51管脚的低电平将P52管脚拉到低电平状态,对应的LED灯就常亮了。

将STC单片机的两个管脚通过小阻值电阻相连,并且程序将其中一个置为高电平,另一个置为低电平,会不会烧坏单片机?这依赖端口的工作模式。本范例以及绝大多数STC范例都将端口设置为“准双向口(弱上拉)”模式,在这种工作模式下,高电平端口的输出电流仅250微安,不会烧坏单片机。

注意:在实际应用中如果需要将两个管脚连接在一起,请按照STC官方给出的参考,串联一只100到300欧的电阻,避免烧坏器件或者给出不正确的数据。

三、LED-DIP40与LED-DIP64设备的8位端口驱动程序实现

除了“LED-DIP40” 在STC-ISP软件工具上还有“LED-DIP64 ”虚拟设备,它们与STC的最小开发板“开山斧”和“屠龙刀”上的LED排列是一致的,下图为屠龙刀开发板的实物:

stc单片机串口通信驱动(虚拟串口屏技术)(5)

在STC-ISP上“LED-DI64”虚拟设备如下:

stc单片机串口通信驱动(虚拟串口屏技术)(6)

(12)从STC-ISP软件上可以查到LED-DIP40和LED-DIP64虚拟设备的接口协议如下:

stc单片机串口通信驱动(虚拟串口屏技术)(7)

stc单片机串口通信驱动(虚拟串口屏技术)(8)

其中库函数声明是STC官方驱动程序的驱动函数接口,库函数调用是用户编程范例。

(13)下面是本文介绍的仿真驱动程序的LED-DIP40刷新函数:

stc单片机串口通信驱动(虚拟串口屏技术)(9)

其中第74到第77行是协议的头,供上位机的STC-ISP软件识别指令用。

虽然仿真打狗棒的LED-DIP40虚拟设备没有用全STC8H的8个IO端口,但是为了统一起见,第81行到第88行把单片机程序中的全部仿真端口字节变量都填到接口数据中,一起传送给上位机,由上位机程序去处理。

(14)下面是本文介绍的仿真驱动程序的LED-DIP64刷新函数:

stc单片机串口通信驱动(虚拟串口屏技术)(10)

对比DIP40的刷新函数,只有第101行协议头不同。

四、结束语

在单片机上编程通过串口使用STC-ISP上虚拟仿真设备的最好的方法是使用外部设备驱动程序。通常外部设备有不同的类型,对于以学习为目的的,与开发板硬件配合的虚拟仿真设备,本文介绍了一种“仿真如真”的驱动程序编程思路,并实际展示了实现的方法和效果。

,