51单片机作为常见的通用单片机,在内部资源、处理速度等方面无法与新型高速单片机相比,但其低廉的价格、极低的入门难度、适合简单的应用,使其仍然开发商的首选。 常见的选择之一。
使用51单片机驱动液晶模组通常采用1602、12864等极其简单的液晶模组,这里介绍一种使用51单片机驱动QVGA分辨率TFT液晶模组实现彩色及更复杂内容显示的方法。 同时,本文还将使用DS1302芯片和DS18B20芯片在液晶屏上显示实时时钟和温度。
1 硬件设计
本系统硬件电路的设计主要包括单片机最小系统电路、TFT液晶显示电路、时钟电路、设置电路和温度采集电路。 系统工作原理框图如图1所示。
图1 硬件系统原理框图
1.1 最小微控制器系统
单片机的最小系统包括外部晶振、电源、复位电路等,这是保证单片机正常工作的必要条件。 整个系统可以通过单片机进行控制,包括读取DS18B20芯片的温度数据,读写DS1302芯片的日历时钟数据,检测是否有按钮按下并执行相应的操作,最后将数据写入显示屏驱动芯片。 ,这样就可以在TFT液晶屏上显示所需要的内容了。
1.2 液晶显示电路
驱动 TFT LCD 面板的芯片有多种选择。 本文使用台湾亿利科技的ILI9325芯片。 该芯片可支持320×240(QVGA)分辨率,内置173KB RAM,因此最多可显示26万种颜色。 ILI9325支持的接口模式包括8/9/16/18位i80系统总线、SPI总线、RGB接口和VSYNC接口。 其总线接口电路方法将LCD视为外部数据存储器。 它访问LCD就像访问数据存储器的一个单元一样。 该方法可以充分发挥单片机总线读写功能的优势,且易于升级。 和扩展。 由于本文使用的STC89C54RD+单片机没有SPI总线,为了节省IO的使用,本文最终采用8位系统总线连接ILI9325芯片。 显示部分电路如图2所示。
图2为部分电路图
图2中,除了P0口作为8位总线传输数据外,还需要5个额外的IO口用于片选(CS)、复位(RESET)、命令/数据选择位(RS)驱动芯片的写入位(WR)和读取位(RD)。 但实际上,由于不需要从驱动芯片读取数据,因此实际程序中并没有使用RD位。
1.3 时钟电路
时钟电路主要由DS1302芯片组成。 DS1302是DALLAS公司推出的一款涓流充电时钟芯片。 该芯片包含实时时钟/日历和31字节静态RAM,并可以通过简单的串行接口与微控制器通信。 该芯片可以提供秒、分、时、日、日、月、年等信息。 每月的天数和闰年数可以自动补偿,并可以计算到2100年。 DS1302与单片机之间的通信可以简单地通过同步串行方式进行,并且只需三口线,复位(RES)、I/O 端口和 SCLK 串行时钟均被使用。 DS1302 的工作功耗非常低,具有用于主电源和备用电源的双电源引脚,并提供额外的 7 个字节存储器用于可编程涓流充电电源。 因此,该芯片可广泛应用于便携式仪器如电话和电池供电的仪器仪表等产品中。 图3为DS1302的时钟电路连接图。
此外,设计需要为DS1302提供外部32.768 Hz晶振,无需电容或电阻。
图3 时钟电路连接图
1.4 温度采集电路
DS18B20数字温度计是DALLAS公司生产的单总线器件(1-Wire)。 该芯片具有电路简单、体积小等特点。 因此,由其组成的测温系统电路简单。 只需一根通讯线即可连接多台DS18B20数字温度计,非常方便。 此外,该芯片还具有以下特点:
◇ 只需一个端口即可完成数据读写; ◇ 每颗DS12B20芯片都有唯一的序列号,因此一根数据线上可以挂载多颗芯片; ◇ 测量温度范围-55℃至125℃; ◇ 数字温度计的分辨率可选择9~12位; ◇ 可设置报警温度的上下限。
图4所示为芯片与单片机的连接电路。 表1列出了DS18B20的三个引脚的定义。
图4 温度采集电路图
表1 DS18B20引脚定义
1.5 设置电路
设置电路的主要功能是将时间和日期设置为当前时间和日期。 这样的设计只需要3个按钮就可以完成这个功能。 第一个按钮用于选择要更改的内容。 也就是说,当第一次按下按钮时,时钟停止并出现一个指示器,该指示器指向秒的位置。 以后每次按下该按钮,系统都会依次轮询分钟。 、时、日、月、年、周,以便用户可以修改系统时间和日期。 选择星期几后,再次按下第一个按钮,时钟将从设定的时间继续运行,指示器消失。 另外两个按钮的功能为“+”和“-”,用户可以使用它们来调整时间和日期。 需要注意的是,调整状态时必须按下“+”,“-”按钮才起作用。
在按键去抖方面,本设计采用软件去抖,但在实际应用中,有时需要添加电容或双稳态触发器来实现硬件去抖。 当然,在本文的实验中,仅使用软件debounce也可以很好地工作。 其设置电路原理图如图5所示。
图 5 设置电路原理图。
2 软件系统设计
软件部分的设计主要包括显示子程序、DS1302芯片子程序、DS18B20芯片子程序、按钮处理子程序和主程序。 主程序部分主要用于初始化各个设备,然后扫描键盘,读取时间和温度,最后调用显示子程序。 DS1302芯片子程序主要负责读取内部存储器中的时间和日期,并在有相应的键盘响应时将时间和日期数据存储到存储器中。 DS18B20芯片子程序的功能比较简单。 它只需要以一定的时间间隔读取温度数据。 键子例程的目的是连续轮询键。 一旦按下某个键,程序就会立即执行相应的处理。 显示子程序是项目中最难、编码最多的子程序。 它包含显示驱动芯片的初始化函数,还定义了如何向液晶屏发送指定内容的函数,如文本、字母、图形等。
2.1 主程序设计
主程序完成各设备的初始化后,开始进行键盘扫描,读取芯片数据并显示程序。 主程序流程图如图6所示。
图6 主程序流程图。
2.2 显示编程
显示程序的设计是本次设计的难点。 原因是:首先,显示驱动芯片的寄存器配置比较复杂。 ILI9325 有 40 多个寄存器。 大多数这些寄存器都可以在显示初始化程序中进行配置。 另外,有些可能会在其他程序中再次使用。 例如,每次写入数据之前,首先要确定写入范围,并且需要在寄存器中配置这个范围。
其次,输出任何内容到显示屏都需要手动写入。 如果你在1602液晶屏或12864液晶屏上写英文字母、数字,甚至有些汉字,都可以直接使用现有的指令来写。 不过,ILI9325芯片没有字体库,这会带来一些困难,但也带来了灵活的选择,因为这样,字体和字号就不受限制了。
本文在制作字体库时,我们使用的是常见的字体模型软件。 该软件可以生成任意大小的字体模型,也可以根据图片拍摄模型。 因此,使用该软件可以获取所有需要的汉字和字母。 本文使用的汉字字体大小为40×46,字号为16×31。 正是因为字体大小的差异,本设计生成的两个头文件都采用结构体的方法来定义索引内码和点阵码数据这两个属性。 需要特别注意的是,汉字的内码是2byte,而英文数字的内码是1byte。 因此,必须在两个不同指标方案的判断条件上加以区分。 本文还将一些需要用到的简单标志图形(如表示时钟修改位的标志)纳入英文字体库中。
解决了以上两个难点后,程序设计就基本完成了。 如果需要使用一些复杂的图形,比如圆形、正方形、三角形等,还可以添加一些附加功能。 另外需要注意的是,从温度采集芯片和时钟芯片获取的数据必须转换为ASCII码,否则索引程序无法识别。 本系统的显示程序流程图如图7所示。
图7所示为程序流程图 2.3 DS1302子程序及关键处理子程序:
DS1302时钟和数据芯片子程序中定义了读写数据的函数。 通过这两个函数,可以确定读取芯片中时间、日期等数据的函数和设置这些数据的函数。 设置功能将由键盘扫描仪使用,而读取功能将在主功能中应用。
按钮处理子程序的主要目的是轮询每个按钮是否被按下。 只有当第一个按钮被按下时,第二个和第三个按钮才会被处理。 注意,按下第一个功能键时,必须关闭DS1302的写保护功能,退出设置状态时,必须打开写保护功能。 为了在数据改变时实时显示改变的值,在按键处理时也使用了显示功能。 该过程比较简单,本文不再详细描述。
2.4 DS18B20芯片子程序
DS18B20是温度采集芯片。 在采集温度之前,一般需要先进行初始化,然后进行ROM操作。 只有发出存储器操作命令后才能读取温度数据。 本设计使用定时器0中断每1秒读取一次温度。 这个速度足以满足日常需求。
3 结论
本文采用51单片机和QVGA LCD实现时间、日期和温度的实时显示。 事实上,选择TFT液晶可以更灵活、更丰富多彩地显示内容,这更符合未来的发展趋势。 同时,在处理简单的图像内容时,STC89C54RD+微控制器足以满足要求。 其刷新速度在屏幕第一次刷新后几乎没有延迟,因此能够达到不错的效果。 同时其硬件电路也相当简单,精度良好,具有良好的应用前景。