首页 » 互联网 » 单片机控制的OLED简单纯真电子表原型_单片机_屏幕

单片机控制的OLED简单纯真电子表原型_单片机_屏幕

落叶飘零 2024-11-27 22:14:18 0

扫一扫用手机浏览

文章目录 [+]

图16.1 一种常见的拨轮开关

电路事理

1. 主控电路

单片机控制的OLED简单纯真电子表原型_单片机_屏幕 单片机控制的OLED简单纯真电子表原型_单片机_屏幕 互联网

主控电路中最紧张的部分便是STC15L2K60S2的单片机(见图16.2),我选择了SOP28封装的版本,比较小,制作腕表比较得当。
这是一款基于51内核的单片机,最高主频35MHz,具有60KB的ROM和2KB的RAM,虽然配置并不强大,但是做个腕表还是绰绰有余的。
型号中带L的为低电压版本,采取3.3V供电。
实在这个系列的单片机该当是前几年初学者非常常用的,我当时学习的也是STC单片机。
不过近几年随着国外开源硬件的发展,Arduino系的东西大有取代原来STC单片机海内DIY初学者入门必备地位的势头啊。
当然比较Arduino,STC也是有它的上风的:第一便是便宜,一片STC只要5~8元就可以购得;第二是它的电路十分大略,最新的STC15系列,一片芯片就可以组成最小系统,和Arduino Mini一样,装上面包板直接可以用,不必连接外部复位或者晶体振荡器之类的东西;第三便是它的内部高精准RC振荡器可以调节频率,可以等我们把程序写完了再来调节频率,找到功耗和性能的平衡点;第四,它的社区支持并不差,Arduino有许多现成的程序可以利用,STC也一样,在海内有很多谈论51单片机的论坛,里面的程序都可以借鉴。
由于数据量不大,腕表对刷新率也没有很高的哀求,我这个设计没有用到硬件的SPI,通过I/O口仿照SPI与OLED和DS1302通信。

单片机控制的OLED简单纯真电子表原型_单片机_屏幕 单片机控制的OLED简单纯真电子表原型_单片机_屏幕 互联网
(图片来自网络侵删)

图16.2 STC15L2K60S2单片机

2. 屏幕及其外围电路

我利用了Univision出品的一款OLED屏幕(见图16.3),型号UG-2864HMBEG01,尺寸为0.96英寸,分辨率为128像素×64像素,白色单色,支持I2C、3线SPI、4线SPI、I80和68K五种接口协议,可以说全兼容,同时内置了电荷泵,供应OLED驱动所需的高压,给电路设计供应了极大的方便。
OLED显示技能具有自发光的特性,采取非常薄的有机材料涂层和玻璃基板,当有电流利过期,这些有机材料就会发光,而且OLED显示屏幕可视角度大,比拟度非常高,做得好的话,可以做到正无限比为1。
实在这种屏幕在MP3上十分常见,不过现在出厂的MP3大多已经采取LCD了。
但是OLED屏幕也并非没有缺点,永劫鲜明示同样的静止图案会造成烧屏,以是实际上并不是很适宜用来做腕表,而且用OLED做腕表的话,确实费电了一些。
我以为空想的方案还是用一块反射式的STN屏幕。

图16.3 OLED屏幕及其外围电路

3. RTC(实时时钟)电路

DS1302这款芯片实在相信大家都该当比较理解了,是一款高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、周、日、时、分、秒进行计时,具有闰年补偿功能,事情电压为2.5~5.5V,采取三线接口与CPU进行同步通信,并可采取突发办法一次传送多个字节的时钟旗子暗记或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器(见图16.4)。
我这里没有连接备用电池,直接把主供电连上了LDO的输出。
值得一提的是,DS1302利用的是BCD(全称为Binary-Coded Decimal)编码,是一种二进制的数字编码形式,用二进制编码的十进制代码。
这种编码形式利用了4个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷进行。
但是实际上在单片机里面,BCD还给我们带来了一点小麻烦,单片性能处理的是二进制码,而不是BCD码,以是要进行一下转换。

图16.4 RTC(实时时钟)电路

4. 供电电路

供电方面采取了一片ME6219 LDO(低压差线性稳压器),见图16.5,它的压降仅为0.2V,可以知足锂电池供电的须要,像一样平常常用的AMS1117,它的压降达到了1V,也便是当锂电池电压为3.7V时,AMS1117最多只能输出2.7V的电压,完备起不到稳压的浸染。
同时,锂电池要考虑的问题便是电量检测,一方面提醒利用者充电,另一方面也要保护锂电池,电量过低就逼迫关机,以免过放对锂电池造成损伤。
单片机的供电电压是3.3V,而电池的电压则是3.5~4.2V,是高于单片机电源电压的,因此就必须设计一个分压电路,分压之后再接入单片机的ADC进行丈量。
分压电路是始终连接在电池上的,如果电池电量全花费在这个分压上,那也太冤枉了。
以是我选择了两个1MΩ的电阻来分压(见图16.6),也便是2MΩ的阻值,根据欧姆定律可知,在3.7V标准电压下的电流仅为2μA,符合哀求。
但是这样又会涌现一个问题,ADC也不是空想电表,存在一个输入阻抗的问题,我没有研究过STC的输入阻抗,但是明显不可能会远高于1MΩ,这样就必须加一个电容来减少输入阻抗过低对分压的影响。

图16.5 ME6219低压差线性稳压器

图16.6 分压电路

5. 充电电路

充电利用了常见的TP4056作为充电管理IC (见图16.7),TP4056是一款完全的单节锂离子电池恒流/恒压线性充电器,其底部带有散热片的SOP8封装与较少的外部元件数目,这使得TP4056成为便携式运用的空想选择。
TP4056适用于USB电源和适配器电源,其输入电压范围为4~8V,充电电流最大1000mA。
它的充电电流是通过一个外部电阻来调节的。
实在TP4056的外部电路设计还是挺大略的,但是我还是单独利用了一块现成的充电板,由于主洞洞板上放不下了,终极也导致全体作品非常厚,也算是一点遗憾吧。

图16.7 充电电路

实在现在大多数的高等点的移动设备都会选择专门的PMIC (电源管理集成电路),它们常日供应了多路DC-DC和LDO输出,知足不同设备的供电需求,内置锂电池充电管理功能,部分还内置了库仑计,可以更精确地测定电池电量,并进行功耗掌握。
这类PMIC常日供应了I2C接口,主处理器可以通过I2C和PMIC进行通信,获取电量、电流之类的数据,并且可以直接通过软件来调度电压之类的参数,十分强大。
不过像51这种设计就用不上那种东西啦,那种一样平常都是给Cortex-A级别的处理器用的。

硬件制作

由于用到的元器件并不繁芜,连接也不是很多,以是我选用了洞洞板+飞线的形式,虽然这样比较麻烦,但是可以省下打样的钱,不过对“手艺”有一定的哀求。
工具方面,一把好用的电烙铁,一把美工刀,以及一把热熔胶枪就够了,都是比较常规的工具。
材料方面,请准备事理图里面涌现的各种元器件、一卷焊锡丝、一卷漆包线、一块洞洞板,以及你的激情亲切和耐心。

首先,把洞洞板裁成须要的大小,然后在上面得当的位置用美工刀割出SOP28的焊盘(见图16.8),由于SOP28的引脚间距为1.27mm,而洞洞板的洞间距为2.54mm,因此把每个洞的焊盘割成两半就可以焊接SOP28的芯片了。
割的时候不一定要在正中间,但是一定要割干净,最好空出一条,避免短路之类的事情发生。

割完焊盘就可以焊接主MCU了,这个没有什么值得把稳的,不要让引脚短路就可以了(见图16.9)。
如果短路了,用把好点的烙铁,加点助焊剂(或者带助焊剂的焊锡也可以),烙铁可以把多余的焊锡吸起来,然后用海绵擦掉烙铁头上的锡就好了。

图16.8 割出SOP28的焊盘

图16.9 焊上单片机

然后,处理和MCU连接最多的屏幕部分。
虽然采取了四线制SPI通信,但是这个OLED内部电荷泵须要几个外部的电容,相对比样比较麻烦的。
屏幕的引脚间距仅为0.8mm,比较磨练“焊功”(见图16.10)。
建议漆包线在焊接之前先镀好锡,会方便很多。
屏幕部分完成之后,看起来便是一团糟的样子(见图16.11)。

图16.10 处理屏幕与单片机的连接

图16.11 连接好的样子

STC单片机利用串口下载,准备好串口的接口也是必不可少的。
如果利用插针,担心会刺得手(实在是我多虑了,不会发生这种事情),于是我选择了排孔,并且是没有出头的设计,这样可以说是对本来就不充裕的电路板空间的巨大摧残浪费蹂躏,但是凸出来实在太丢脸,于是我还是这样做了,如图16.12所示。

这个接口只要“飞”上VCC、TXD、RXD和GND这4个引脚就够了,不过我这里先只连接了VBAT,也便是锂电池电源。
下一步是焊接LDO,在LDO焊接完成之后,就可以开始调试OLED驱动了(见图16.13),顺便检讨之前的连接是否可靠。

图16.12 用于串口下载的排孔

图16.13 焊接LDO

事实上,这个OLED困扰了我大半个小时,一贯没有显示,检讨连接也彷佛没什么问题,也没有虚焊,后来仔细看了Datasheet才创造我犯了一个十分低级的缺点,OLED的VCC并非逻辑电源输入,而是屏幕驱动电压输入,该当接上12V外部电源,在利用内部电荷泵升压的时候该当在外部对底连接一个电容。
办理问题后,显斧正常了(见图16.14)。

下面便是用同样的方法处理DS1302,也就不多说了。
我利用了一条铁丝架在拨轮开关上加强固定,再顺便焊上锂电充电板。
由于该电路的功耗很低,以是不须要利用很粗的漆包线,用最细的来连接电路完备不成问题,充电板直接和锂电池连接就好,如图16.15所示。

图16.14 OLED驱动正常了

图16.15 充电板和掌握板接到一起

在终极打胶并把充电板装上去之前,一定要确保所有硬件部分都已调试正常了,由于打胶基本上是不可逆的,等打完胶再创造有什么缺点就太迟了。
还有记得一定要设计一个断电的方法,由于STC单片机必须要断电一下才能进入ISP模式。
我利用了一个跳线来办理这个问题。
于是,就有了图16.16、图16.17所示的成品了。

图16.16 制作好的LOED腕表正面

图16.17 背面是锂电池

个人觉得这个做完的“腕表”还是厚了一点,屏幕也有点小,如果往后有机会再改进。

软件编写

由于目前就只打算实现时钟显示这一单一功能,以是代码设计十分大略。
首先便是要办理各个部件的驱动。

1. 屏幕驱动

屏幕的分辨率为128像素×64像素。
由于是单色的,以是一个1bit就可以表示一个像素,一个字节中有8个像素,以是全体屏幕显示内容所要占用的内存空间为1KB (128×64/8),可以放进STC的RAM,以是我就在RAM里面建立了一个屏幕缓冲区,所有绘图操作都在缓冲区里面进行,这样可以大幅减少和屏幕的通信,加快绘图速率。
怎么理解呢?比如要点亮屏幕上的一个像素,但是像素因此8个为单位存在一个字节里面的,要操作里面某一位,只能先把这个字节读出来,修正后再写回去,也便是读改写。
把稳,单片机和屏幕的通信速率并烦懑,一贯这样读改写速率会非常慢。
可以打算一下,这样操作一个像素就要传输两个字节的数据,一共8192个像素,就要传输16384个字节的数据,也便是16KB,而如果先在缓冲区内画完,再传输,只要传输1024个字节就足够了,速率自然就快了。

其余还有一点,一样平常绘图都要清空屏幕,不然后来的东西会和先前有的叠在一起,就看不清楚了。
清空的代价便是闪烁,屏幕会先变全黑再显示出须要的东西,如果利用了缓冲的设计,就不会有这种问题。

2. DS1302 驱动

DS1302的驱动程序在网上很常见,也不困难,我就大略说下BCD和二进制的互转吧。
BCD是什么意思呢?大略理解便是在十进制数前面加个0x,然后就变成十六进制了。
举个例子,35的BCD编码便是0x35,而二进制编码却该当是0x23。
在C措辞中,写程序的时候写十进制或者十六进制都没有关系,程序里面写35,编译器会自动认为便是0x23。
如果把BCD码用在程序里面,就会涌现问题,紧张是加减法的问题。
还是之前的35,如果加上5,该当是40,这点用二进制码表示是没有问题的,但如果是BCD呢?BCD 0x35加上BCD 0x05该当变成BCD 0x45,但是在程序里面写0x35+0x05结果是0x3A,3A在BCD码中是没故意义的,该当直接进位才对。
不过BCD实在转换起来并不困难,由于BCD码4bit对应一个十进制数,一个字节对应两个十进制数。
在DS1302驱动中,只涉及1个字节的转换,以是程序就十分大略,以下是大略的BCD转二进制代码的方法。

BIN=(BCD/16)×10+(BCD%16);

除以16和取模16便是得到一个字节中前4bit和后4bit,比如0x35,分别返回3和5,然后第一位乘以十加上第二位便是终极须要的结果了。

3. 主程序设计

我的主程序设计十分大略,先读取韶光,比较和上次读取到的韶光是否有变革,如果有就显示在屏幕上,然后检测按键是否按下,如果按下,则启动修正韶光的函数。
详细设计大家还是看代码吧,主函数大家可以自己来写,这样也知足个性化的需求。

后记

制作这个东西加起来须要的韶光没有超过24小时,紧张的韶光还是花费在了飞线上,或许这样飞线的难度有点太高了,并不适宜大家仿制。
不过采取飞线制作紧张还是为了一种心情,本日想到了,第二天就能把它做出来,这是打样PCB做不到的。

多年前我就买过0.96英寸的OLED模块,想用它DIY一个非常酷的腕表,但是非常遗憾的是,被我欠妥心把正负极接反给烧了。
然后,我为了玩大屏,买了STM32开拓板,为了做成品,自己画了不少PCB。
结果便是一个项目所要耗费的韶光越来越长,比如我现在在折腾的一款图形打算器,上高下下设计、打样、写程序,再改设计、修正bug什么的,已经做了4版硬件,花了近1年的韶光,到现在我还是不满意,准备用ARM9处理器连续做第5版硬件,我也不知道什么时候能完成。
虽然工程越做越大,所谓的技能含量也越来越高,但是却彷佛少了当初那份纯粹的乐趣,那份朴实的冲动。

先容一个分歧凡响的淘宝店铺:首页-数码达人小二-淘宝网,点开有惊喜!

标签:

相关文章

企业和家庭组网简单的窍门_端口_这款

往常我们说到交流机,都会想到机房里那轰鸣做响的一个“大箱子”。对付中小企业来说,办公室内的组网既须要交流机来完成,但是经济上和空间...

互联网 2025-01-22 阅读0 评论0