设计采用高性能单片机 1C8051F020 为控制芯片,监控示波器面板上 40 个按键、3 个编码开关及 4 个电位器的状态。分别介绍了键盘、编码开关和电位器的工作原理,以及其与单片机连接的硬件电路及软件编程的实现。按键部分采用的键盘程序设计方法,给出了键码匹配子程序流程图。

 

监控程序负责系统中全部硬件和软件资源的分配、调度工作,它提供用户接口,使用户获得友好的工作环境,是系统设计中一个重要组成部分。

 

1C8051F020 单片机概述

伴随着电子技术快速的发展,越来越多的人加入电子开发的大军。在学习电子技术和研发项目的过程中,避免不了要使用一些仪器,例如万用表、示波器等等,然而对于一些非专业的爱好者,拥有一台数字示波器是比较“奢侈”的。本设计 C8051F020 单片机,因其具有成本低、制作简单、测量精度高等优势,恰恰满足了这一部分人的需求。

 

C8051F020 单片机是高度集成的片上系统。在芯片内集成了 2 个多通道 ADC 子系统(每个子系统包括 1 个可编程增益放大器和 1 个模拟多路选择器)、2 个电压输出 DAC、2 个电压比较器、电压基准、SMBus/I2C 总线接口、UART、SPI 总线接口、5 个通用的 16 位定时器、1 个具有 5 个捕捉 / 比较模块的可编程计数器 / 定时器阵列(PCA)、内部振荡器、8 个 8 位通用数字 I/0 端口和 64KBFLASH 程序存储器,以及 8051 兼容的高速微控制器内核。

 

C8051F020 单片机是所有模拟和数字外设均可由用户固件使能 / 禁止和配置。Flash 存储器还具有在系统重新编程能力,可用于非易失性数据存储,并允许现场更新 8051 固件。片内 JTAG 调试电路允许使用安装在最终应用系统上的产品 MCU 进行非侵入式(不占用片内资源)、全速、在系统调试。该调试系统支持观察和修改存储器和寄存器,支持断点、观察点、单步及运行和停机命令。在使用 JTAG 调试时,所有的模拟和数字外设都可全功能运行。

 

Cygnal 出的一种混合信号系统级单片机。片内含 CIP-51 的 CPU 内核,它的指令系统与 MCS-51 完全兼容。其中的 C8051F020 单片机含有 64kB 片内 Flash 程序存储器,4352B 的 RAM、8 个 I/O 端口共 64 根 I/O 口线、一个 12 位 A/D 转换器和一个 8 位 A/D 转换器以及一个双 12 位 D/A 转换器、2 个比较器、5 个 16 位通用定时器、5 个捕捉 / 比较模块的可编程计数 / 定时器阵列、看门狗定时器、VDD 监视器和温度传感器等部分。C8051F020 单片机支持双时钟,其工作电压范围为 2.7~3.6V(端口 I/O,RST 和 JTAG 引脚的耐压为 5V)。与以前的 51 系列单片机相比,C8051F020 增添了许多功能,同时其可靠性和速度也有了很大提高。

 

2 一键多义键盘工作原理

一台完善的智能仪表功能往往很多,设定的量程、参数也很多。如果还是用一键一个功能,势必要有一个很大的键盘,面板相应扩大,不美观,而且成本增加。因此在这类仪表中,键盘设计成一键多义,一个键有多种功能。

 

在一键多义的情况下,一个命令不是由一次按键组成,而是由一个按键序列组成。也就是说,对一个按键含义的解释,不仅取决于本次按键,还取决于以前按了些什么键。因此,对于一键多义的监控程序,首先要判断一个按键序列(而不是一次按键)是否已构成一个合法命令。若已构成合法命令,则执行命令,否则等待新按键输入。一键多义键盘管理程序,主要解决键盘按键序列的识别和如何根据键盘的按键序列去找相应的操作程序这两个问题。

 

上述问题可用“一图三表”的方法来解决。即,建立一张键图,依靠分析程序状态表,分析程序入口表和动作例行子程序表来完成。其中分析程序状态表总共分为 4 栏,分别为现状态 PSTi、键码、下一状态、动作例行子程序编号。

 

3 编码开关工作原理

编码开关有 3 个引脚和 5 个引脚的,其中 2 个引脚是按下功能,另外 3 个引脚控制编码开关的左旋和右旋功能,与引脚 1、2 相连的是两个长短不一的金属静片,与引脚 3 相连的是一周有 12 或 24 个齿的金属动片。当脉冲电位器旋转时可出现 4 种状态:引脚 3 与引脚 1 相连,引脚 3 与引脚 2 及引脚 1 全相连,引脚 3 与引脚 2 相连,引脚 3 与引脚 2 及引脚 1 全断开。

 

在实际使用中,一般将引脚 3 接地作为数据输入端。而引脚 1、2 作为数据输出端与单片机 I/0 口相连。本设计中用到 3 个编码开关,其中一个将引脚 1 与单片机的 P4.0 相连,引脚 2 与单片机的 P4.1 相连。当脉冲电位器左旋或右旋时,P4.0 和 P4.1 就会周期性地产生图 1 所示的波形。如果是 12 点的脉冲电位器旋转一圈就会产生 12 组这样的波形,24 点的脉冲电位器就会产生 24 组这样的波形。一组波形(或一个周期)包含了 4 个工作状态。因此只要检测出 P4.O 和 P4.1 的波形,就能识别脉冲电位器是否旋转,是左旋还是右旋。

 

 

4C8051F020 单片机 ADC0

C8051F020 的 ADC0 子系统包括:一个 9 通道的可配置模拟多路开关(AMUX0)、一个可编程增益放大器(PGA0)和一个 100ksps 的 12 位分辨率的逐次逼近寄存器型 ADC。ADC 中集成了跟踪保持电路和可编程窗口检测器。AMUX0、PGA0、数据转换方式及窗口检测器都可用软件通过特殊功能寄存器来配置。只有当 ADC0 控制寄存器(ADCOCN)中的 ADOEN 位被置 1 时,ADC 子系统才被允许工作。当 ADOEN 位为 0 时,ADC 子系统处于低功耗关断方式。

 

ADC0 端口的每一对均可用编程设置成为单端输入或差分输入。差分输入时的端口配对为(0,1)、(2,3)、(4,5)、(6,7),此设置由通道选择寄存器 AMUXOSL 的低 4 位和通道配置寄存器 AMUXOCF 的低 4 位确定。在 AMXOCF 中,位 3~O 各对应 2 个引脚通道。位值=0,表示是独立的单端输入(复位值均为单端输入);位值=1,表示是差分输入对。

 

C8051F 系列单片机中 ADC 的速率都是可编程设置的,但最少要用 16 个系统时钟。一般在转换之前还自动加上 3 个系统时钟的跟踪 / 保持捕获时间(>1.5μs)。设置 F020 内 ADC 速率的方法是通过配置寄存器 ADCOCF 的位 7~3 来进行的,其复位值为 11111(位 7~3=SYSCLK/CLK(SAR)-1)。

 

一般在启动 ADC 之前都要处于跟踪方式,控制寄存器 ADCOCN 的位 6 如果为“O”,则一直处于跟踪方式(此时启动 4 种启动方式都可比跟踪启动快 3 个系统时钟);如为“1”,则有 4 种跟踪启动方式可选择,即对 ADCOCN 中的位 3~2 赋值:00 为向 ADBUSY 写 1 时跟踪(软件命令),01 为定时器 3 溢出跟踪,1O 为 CNVSTR 上升沿跟踪(外部信号),11 为定时器 2 溢出跟踪。

 

5 系统硬件电路设计

键盘部分采用 6×6 矩阵键盘,P7.O~P7.5 为行线,P3.0~P3.5 为列线。P3.0 与 P7.O 交叉处为一键,P7 口接 10kΩ的上拉电阻至 3.3V。3 个编码开关的 1、2 脚直接与单片机的 I/0 引脚相连,这里选择 P4.O~P4.5,3 脚接地,4、5 脚用作按键使用。仅以接 P4.O 和 P4.1 引脚的编码开关为例,电路图如图 2 所示。模数转换部分使用内部电压基准,故将 VREF 引脚与 VREF0 引脚相连即可。采用电位器调节模拟量的输入,单端输入,电位器阻值为 10kΩ,基准电压典型值为 2.43V,电源电压采用 3.3V 供电。为使基准电压达到最大,需要一个阻值约为 3.58kΩ的电阻与电位器串联接到模拟端口,硬件电路如图 3 所示,电位器的 4、5 脚也用作按键使用。

 

 

6 系统软件设计

6.1 一键多义键盘程序设计

在键盘分析中,运用一个工作状态寄存器保存键盘的现状态,当键盘扫描到一个按键时,根据现状态的值从分析程序入口表中找到分析程序状态表地址,从该地址处进入分析程序状态表,找到相匹配的值,把下一状态送到现状态单元里,取出动作号,根据动作号计算出动作子程序入口地址,再执行相应子程序。图 4 为键码匹配子程序的流程图。

 

6.2 编码开关程序设计

由图 1 可以看出,引脚 1 和引脚 2 有同时为高电平的情况,之后如果引脚 2 比引脚 1 先到达高电平则表示左旋,如果引脚 1 比引脚 2 先到达高电平则表示右旋。编程的时候依据这个特点来判断引脚 1、引脚 2 的状态即可。以 1 引脚接 P4.0,2 引脚接 P4.1 为例:

 

 

 

6.3 模数转换软件设计

通过设置 ADCO 控制寄存器 ADCOCN 位 3~2(ADOCM1~O)A/D 转换启动方式选择位,来启动 A/D 转换:位 3~2 为 00 时,向 ADOBUSY(ADCOCN 位 4)写 1 启动 A/D 转换;位 3~2 为 01 时,定时器 3 溢出启动 A/D 转换;位 3~2 为 10 时,CNVSTR 上升沿启动 A/D 转换;位 3~2 为 11 时,定时器 2 溢出启动 A/D 转换。本设计采用第一种启动方式。

 

由于单片机的工作量并不大,所以软件设计时采用查询的方式。单片机不断地查询键盘、编码开关以及电位器的状态,如果有变化时,单片机将动作信息传递给 ARM 主 MCU,等待主 MCU 的处理。由于单片机模数转换的速度非常快,因此在程序中加延时,以便观察到模数转换的变化量。另外,硬件设计时没有考虑滤波,故用软件实现滤波。一般的滤波的方法有限幅滤波法、中位置滤波法、算术平均滤波法等,现在提出一种新的滤波方法。由于使用 12 位 A/D,但只要 8 位就可以达到所要的精度。

 

由于单片机的工作量并不大,所以软件设计时采用查询的方式。单片机不断地查询键盘、编码开关以及电位器的状态,如果有变化时,单片机将动作信息传递给 ARM 主 MCU,等待主 MCU 的处理。由于单片机模数转换的速度非常快,因此在程序中加延时,以便观察到模数转换的变化量。另外,硬件设计时没有考虑滤波,故用软件实现滤波。一般的滤波的方法有限幅滤波法、中位置滤波法、算术平均滤波法等,现在提出一种新的滤波方法。由于使用 12 位 A/D,但只要 8 位就可以达到所要的精度,所以可以采用去掉低 4 位的方法来实现滤波的目的。由于篇幅有限,下面只给出程序的一部分,以 AIN0 为例:

 

 

结语

本文介绍的一键多义的,对多按键的智能仪表可以通用。编码开关的编程方法简单易懂。在 A/D 转换部分,提出的去掉低 4 位的软件滤波方法可靠可行,对精度要求不高的场合非常适用。这 3 部分构成了一个完整的监控程序,当单片机监控到某一部分有变化时,就将其动作信息传递给 ARM 主 CPU,主 CPU 进行相应的处理。