找回密码
 立即注册
查看: 1154|回复: 1

STC-ISP 虚拟串口屏技术(2):仿真如真的驱动程序设计

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10900
发表于 2022-12-1 16:21:49 | 显示全部楼层 |阅读模式
一、思路
前面的文章介绍了STC官方在其烧录工具STC-ISP软件中集成了一整套“虚拟串口屏”设备,用户可以根据相应的接口协议编程来实现人机交互功能。
本质上人机交互设备的接口协议是计算机与计算机之间的协议,程序员直接用它来编程既不直观又不方便,因此通常通过使用驱动程序的方法来实际编程,例如STC就在其范例程序中提供了一套完整的驱动程序供用户使用。
对同一套外部设备,接口协议是唯一的,但是驱动程序可以根据不同的目的和要求是不同的。
STC-ISP集成的“虚拟串口屏”设备有一个最大的特点模拟真实设备,比如“LED-DIP40”设备与STC的最小开发板“打狗棒”和“降龙棍”上的LED排列是一致的,见下图所示:
Fig01_打狗棒.jpg
针对这种“仿真虚拟设备”的特点,笔者认为可以模仿程序对实际硬件的编程操作方法,开发出一种形式和内涵都“仿真如真”的驱动程序。
二、“仿真如真”的8位端口驱动程序设计
STC最新系列的单片机都包括了P0~P7八个8位端口,通过这些端口来实现单片机功能和对外部设备的控制。在程序设计中,这些端口通过特殊功能寄存器(SFR)来操作。
典型的对8位端口控制的范例程序是在这些端口上接下拉的LED灯,然后用程序控制这些LED灯按不同的模式发光。

下图是利用STC打狗棒上的LED灯展示单片机8位端口控制的例子。
Fig02_LED花样灯.jpg
1)图中省略了第72行到第79行的程序,从第64行到第87行,这是一个8节拍的使用连接在P0P1P2端口的LED花样灯程序。
其中P2是跑马灯效果,而P0P1则是每一拍先读取当前端口的值,取反后又赋值回给端口,显示的效果是原来亮的LED灯熄灭了,原来熄灭的LED灯变亮了。

在程序中,P0P1的初始值为“P0=0x55;P1=0x0F;”,因此本程序的效果是P0端口的LED灯相邻的两个交替发光,P1端口的LED灯上面4个一组与下面4个一组交替发光。下图视频是这段硬件程序在STC打狗棒开发板实际运行的效果。
视频1_硬件效果_缩小.gif
由于打狗棒没有P12位端口,代替的是P52位端口,所以在视频中该位置的LED灯是常亮不变的。
2)从上面程序中可以看到,对用SFR定义8位端口像变量一样不但有赋值操作(第70行),而且有读取操作(第6869行),因此按照“仿真如真”的思路,在本节驱动程序中同样定义了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范例使用驱动程序,主程序如下图:
Fig03_主程序.jpg
按照预先的设计,第73行到第75行对仿真端口字节变量的程序操作与第68行到第70行对实际硬件端口一一对应,达到了“仿真如真”的目的。
有了驱动程序,程序员可以按照本文的介绍直接操作仿真端口字节变量,让STC-ISP虚拟仿真设备实现相应的显示功能。
9)对仿真端口字节变量操作后,还需要将新的端口状态更新到STC-ISP虚拟仿真设备上。驱动程序提供了两个刷新函数:第78行按照接口协议刷新LED-DIP40虚拟设备,第79行按照接口协议刷新LED-DIP64虚拟设备。

10)下面的视频是使用本范例驱动程序编程的LED-DIP64虚拟设备的运行效果。对比前面的硬件开发板视频,两者几乎一致,达到了仿真的目的。
视频2_虚拟设备.gif
两者唯一的差别第3引脚(P52)的LED灯,硬件实际的LED灯是常亮的,而仿真的LED灯是熄灭的。

11)虚拟仿真设备要模拟真实硬件设备,除了编写控制程序,对硬件设备和对仿真设备的初始化也很重要。下图是本范例的初始化程序部分:
Fig03A_初始化.jpg
按照程序P52被初始化为高电平,对应的LED灯应该是熄灭的,所以STC-ISP上的虚拟仿真设备LED-DIP40的显示与程序一致,因此实际打狗棒开发板上的P52发光一定是另有原因。
经检查打狗棒电路图,为了进行串口3与串口4间的通讯实验,将P52通过100欧的电阻连接到P51管脚上了。按照初始化程序“P5=0x55;”,P51管脚的低电平将P52管脚拉到低电平状态,对应的LED灯就常亮了。
STC单片机的两个管脚通过小阻值电阻相连,并且程序将其中一个置为高电平,另一个置为低电平,会不会烧坏单片机?这依赖端口的工作模式。本范例以及绝大多数STC范例都将端口设置为“准双向口(弱上拉)”模式,在这种工作模式下,高电平端口的输出电流仅250微安,不会烧坏单片机。

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


回复 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10900
 楼主| 发表于 2022-12-1 16:28:25 | 显示全部楼层
三、LED-DIP40LED-DIP64设备的8位端口驱动程序实现
除了“LED-DIP40 STC-ISP软件工具上还有“LED-DIP64     ”虚拟设备,它们与STC的最小开发板“开山斧”和“屠龙刀”上的LED排列是一致的,下图为屠龙刀开发板的实物:
Fig04_屠龙刀.jpg
STC-ISP上“LED-DI64”虚拟设备如下:
Fig05_DIP64.jpg
12)从STC-ISP软件上可以查到LED-DIP40LED-DIP64虚拟设备的接口协议如下:
Fig06_DIP40协议.jpg
Fig07_DIP64协议.jpg
其中库函数声明是STC官方驱动程序的驱动函数接口,库函数调用是用户编程范例。

13)下面是本文介绍的仿真驱动程序的LED-DIP40刷新函数:
Fig08_DIP40_驱动.jpg
其中第74到第77行是协议的头,供上位机的STC-ISP软件识别指令用。
虽然仿真打狗棒的LED-DIP40虚拟设备没有用全STC8H8IO端口,但是为了统一起见,第81行到第88行把单片机程序中的全部仿真端口字节变量都填到接口数据中,一起传送给上位机,由上位机程序去处理。

14)下面是本文介绍的仿真驱动程序的LED-DIP64刷新函数:
Fig09_DIP64_驱动.jpg
对比DIP40的刷新函数,只有第101行协议头不同。
四、结束语

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-15 21:56 , Processed in 0.060255 second(s), 35 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表