一、思路 前面的文章介绍了STC官方在其烧录工具STC-ISP软件中集成了一整套“虚拟串口屏”设备,用户可以根据相应的接口协议编程来实现人机交互功能。 本质上人机交互设备的接口协议是计算机与计算机之间的协议,程序员直接用它来编程既不直观又不方便,因此通常通过使用驱动程序的方法来实际编程,例如STC就在其范例程序中提供了一套完整的驱动程序供用户使用。 对同一套外部设备,接口协议是唯一的,但是驱动程序可以根据不同的目的和要求是不同的。 STC-ISP集成的“虚拟串口屏”设备有一个最大的特点模拟真实设备,比如“LED-DIP40”设备与STC的最小开发板“打狗棒”和“降龙棍”上的LED排列是一致的,见下图所示: 针对这种“仿真虚拟设备”的特点,笔者认为可以模仿程序对实际硬件的编程操作方法,开发出一种形式和内涵都“仿真如真”的驱动程序。 二、“仿真如真”的8位端口驱动程序设计 STC最新系列的单片机都包括了P0~P7八个8位端口,通过这些端口来实现单片机功能和对外部设备的控制。在程序设计中,这些端口通过特殊功能寄存器(SFR)来操作。 典型的对8位端口控制的范例程序是在这些端口上接下拉的LED灯,然后用程序控制这些LED灯按不同的模式发光。
下图是利用STC打狗棒上的LED灯展示单片机8位端口控制的例子。 (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范例使用驱动程序,主程序如下图: 按照预先的设计,第73行到第75行对仿真端口字节变量的程序操作与第68行到第70行对实际硬件端口一一对应,达到了“仿真如真”的目的。 有了驱动程序,程序员可以按照本文的介绍直接操作仿真端口字节变量,让STC-ISP虚拟仿真设备实现相应的显示功能。 (9)对仿真端口字节变量操作后,还需要将新的端口状态更新到STC-ISP虚拟仿真设备上。驱动程序提供了两个刷新函数:第78行按照接口协议刷新LED-DIP40虚拟设备,第79行按照接口协议刷新LED-DIP64虚拟设备。
(10)下面的视频是使用本范例驱动程序编程的LED-DIP64虚拟设备的运行效果。对比前面的硬件开发板视频,两者几乎一致,达到了仿真的目的。 两者唯一的差别第3引脚(P52)的LED灯,硬件实际的LED灯是常亮的,而仿真的LED灯是熄灭的。
(11)虚拟仿真设备要模拟真实硬件设备,除了编写控制程序,对硬件设备和对仿真设备的初始化也很重要。下图是本范例的初始化程序部分: 按照程序P52被初始化为高电平,对应的LED灯应该是熄灭的,所以STC-ISP上的虚拟仿真设备LED-DIP40的显示与程序一致,因此实际打狗棒开发板上的P52发光一定是另有原因。 经检查打狗棒电路图,为了进行串口3与串口4间的通讯实验,将P52通过100欧的电阻连接到P51管脚上了。按照初始化程序“P5=0x55;”,P51管脚的低电平将P52管脚拉到低电平状态,对应的LED灯就常亮了。 将STC单片机的两个管脚通过小阻值电阻相连,并且程序将其中一个置为高电平,另一个置为低电平,会不会烧坏单片机?这依赖端口的工作模式。本范例以及绝大多数STC范例都将端口设置为“准双向口(弱上拉)”模式,在这种工作模式下,高电平端口的输出电流仅250微安,不会烧坏单片机。
注意:在实际应用中如果需要将两个管脚连接在一起,请按照STC官方给出的参考,串联一只100到300欧的电阻,避免烧坏器件或者给出不正确的数据。
|