周鹏
(华侨大学 信息学院,福建 厦门 361021)
图文菜单界面是一种操作简便、高效的交互形式,现已在各类嵌入式应用系统中广泛采用,如智能电子产品(智能测试仪、智能手机),它成为系统功能的”标准配置”。随着单片机功能的提高和带中文字库的液晶显示器成本降低,单片机系统上应用图文菜单已成为可能[1]。
本文设计了基于 STC12C5A60S2(简称 STC12C)单片机的图文菜单交互式系统,系统以图文菜单驱动系统功能(时间显示、温度显示和周期/频率显示),系统操作直观、简便。
系统由内置增强型8051的STC12C单片机、数字温度传感器DS18B20、时钟芯片DS1302、液晶显示器LCD12864(ST7920)和独立键盘电路组成,如图 1所示。STC12C单片机运行交互式程序,是系统的核心;数字温度传感器测试温度;时钟芯片输出时间;单片机内置的可编程计数器阵列模块(PCA)用于测周期/频率;液晶显示器显示系统界面和被测参数。
图1 系统硬件框图
单片机系统由STC12C单片机、时钟电路和复位电路组成,如图2所示。STC12C单片机主要参数如下[2]:内置60 KB的Flash程序存储器;片内集成1 280 B数据存储器;2个 16 bit定时器/计数器,内置两路 PCA模块,可用于外部脉冲的捕捉、软件定时和高速输出,即实现外部信号的周期/频率测试。
测周期/频率电路由STC12C单片机内置两路可编程计数器阵列(PCA)模块构成,PCA工作在捕捉模式时实现,如图3所示。
图2 STC12C单片机系统结构图
PCA测周期/频率的原理为[3]:将 CAPPn或 CAPNn(n=0,1)置 1,外部信号由 P1.3(n=0)或 P1.4(n=1)输入,同时将 CCON中的 CCFn(n=0,1)和 CCAPMn中的ECCFn(n=0,1)置 1,当电路采样到外部信号的边跳沿(上跳沿、下跳沿或上/下沿),则引起中断。如设置为上跳沿中断,当信号的第1个上跳沿来到,引起中断触发定时器T1计数;当信号的第2个上跳沿来到,引起中断触发定时器T1停止计数;读取计数值,根据机器周期算出被测信号的周期和频率。
图3 PCA模块结构原理图
数字测温电路由数字温度传感器DS18B20组成,如图4所示。它具有以下特点[4]:(1)测温范围为-55℃~+125℃,最高12位分辨率,精度可达±0.5℃;(2)可通过编程的方式实现9~12位的数字温度直读;(3)可设置超限温度报警,并有搜索命令识别报警条件;(4)单总线接口,仅需一条输入输出线(DQ)就能与单片机(P1.0)进行通信。
图4 DS18B20数字测温电路
时钟电路由时钟芯片DS1302组成,如图5所示。它是一种高性能、低功耗、采用三线接口的实时时钟电路,可对时间和日期进行计时[5]。
图5 DS1302时钟电路
显示器选用带中文字库、内置ST7920控制芯片的液晶显示器LCD12864,实现系统的图文界面和运行状态显示,是重要的硬件接口。LCD12864与单片机接口电路如图6所示。
图6 LCD12864与单片机接口电路
LCD12864由 DDRAM(显示数据 RAM)、CGROM(字型产生ROM)、CGRAM (自定义字型产生 RAM)和GDRAM(绘图 RAM)等组成[6],DDRAM 和 GDRAM 是本系统图文菜单显示的主要模块。
DDRAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示HCGROM字型 (半角)、CGRAM字型及 CGROM的中文字型3种字型。液晶显示器屏幕坐标(AC地址)与DDRAM地址的对应关系如表1所示。
表1 屏幕AC地址与DDRAM地址的对应关系表
GDRAM提供64×32 B的空间,实际可控制 128×64点阵的二维绘图缓冲空间。GDRAM的二维地址与液晶屏幕坐标的对应关系如图7所示。
键盘电路由3个独立按键组成,分别对应菜单的图标上下移动、确定和返回功能,如图8所示。系统以巡回方式查询是否有键按下并由软件判定是何键按下,并执行相应的功能。
图7 GDRAM二维地址与屏幕坐标的对应关系图
报警电路(如图 9所示)由 PNP三极管(9012)、蜂鸣器及单片机的控制引脚(P21)组成。当温度超限,P21引脚输出一定频率的信号,触发蜂鸣器工作从而实现报警。
图8 独立键盘电路
图9 报警电路
程序采用模块化设计,流程框图如图10所示。
图10 程序流程框图
系统主要函数如下。
液晶显示器函数包括液晶显示器底层驱动函数、中西文字符显示函数和打点/绘线函数。
(1)驱动函数
TestLcdIdle()、WriteLcdCommand()、WriteLcdData()和ReadLcdData()分别为液晶显示器的忙检测、写入命令、写入数据和读出数据。
(2)中西文字符显示函数
Set DdramDot、DisplayDdramChar()和 DrawGdramSelfChar()分别为设定显示中文字符的坐标起点、中西文字符显示和自定义字符显示。
(3)打点/绘线函数
SetGdramDot()、DrawGdramLine()和 DrawGdramCircle()分别为描点、画线和画圆。
DS18B20测温函数包括启动温度转换函数、读写数据函数和字符转换函数。
InitDs18b20()、WriteOneByte()、ReadData()、DataToString()和 DisplayTEMP()分别为启动 DS18B20、写命令/数据、读出温度(实测温度/上下限温度)、转换为显示字符以及显示实测温度/上限温度。
菜单操作函数包括菜单/图标显示函数、键值获取函数以及相应的跳转函数。
InitMenu()、ShowMenu()、GetKeyValue()和 GetUserChoose()分别为初始化菜单(定义一个结构体,内含菜单项目数,函数指针和父/子菜单指针)、菜单界面显示、判定/获取键值函数(状态机方式实现[1],以提高系统运行效率)以及调用与键值相关函数。
系统实际运行结果如图11所示。
图11 系统实际运行
(1)图 11(a)中的图标 指向“时 间显示”,按 下“确定”键(P23)后,即跳转到时间显示(图 11(b))。 图 11(b)中,阳历日期的格式为年/月/日;数字时钟的格式为小时:分钟:秒;指针时钟的圆心以屏幕坐标(0,0)为起点,坐标是(96,32),时钟半径为 31;秒/分/时针与实时数字时钟对应;初始时间可通过程序设定;按 “返回”(P24)即可跳回菜单界面。
图11(d)中,“29.07℃”代表实测温度值;“S:25℃”代表设定的上限温度值;温度曲线中的实线为实测点绘制,虚线为上限温度值,曲线直观地反映了实时温度变化情况。
图11(f)中,被测信号为信号发生器输出的方波,周期为 100 μs~1 000 μs, 幅值为+5 V;T 为周期,f为频率;所绘方波为被测信号的示意波形,每刻度一个周期;所测周期误差≤5 μs。
实验表明,基于STC12C单片机的图文菜单系统采用模块设计,系统运行稳定可靠。系统操作直观、简便,功能达到预期目标,为下一步开发多级菜单系统奠定了基础。
[1]贾志成,程敏,宋涛,等.基于状态机的 LCD多级菜单设计[J].单片机与嵌入式系统应用,2012(2):73-75.
[2]刘晋,王政林,薛凯方.基于STC12C5A60S2单片机的LED 显示屏硬件设计[J].微型机与应用,2011,30(22):24-27.
[3]陈桂友.增强型 8051单片机实用开发技术[M].北京:北京航空航天大学出版社,2010.
[4]孙明利,鲍健,张烁.单总线技术及 DS18B20的温度测量实现[J].大气与环境光学学报,2010,5(4):322-326.
[5]黄明强.DS1302在单片机系统中的应用[J].保定师范专科学校学报,2004,17(2):30-33.
[6]田开坤.基于LCD12864显示器的数字示波器设计[J].电子制作,2011(5):30-37.