单片机控制的OLED简易电子表原型
在多年以前,我刚开始学单片机的时候,就想着要用51单片机加上0.96英寸的OLED DIY一个电子表,但是可惜当时水平有限,没能实现。现在我早已玩转了STM32,准备向ARM9进发,突然想到了当年的想法,今天终于亲手实现了它。
整体设计
毕竟是要实现当年的想法,所以整体还是选择了常见的STC单片机作为主控,以及当时选定的0.96英寸OLED作为屏幕。一般STC都会选择搭配DS1302 RTC芯片用来计时,那么也一起加上。按键方面,为了操作方便,我没有使用普通的微动开关,那种太硬了,戴在手上摁起来不方便。我选择了一种拨轮开关(见图16.1),它上面有一个摇柄,可以上下推动,也可以按下去。一个开关可以同时实现上下选择和确定选择,这在MP3上比较常见,网上价格也不贵,大约三毛钱一个。另外,考虑到OLED比较费电,使用纽扣电池作为电源并不妥,于是我采用了可充电的锂聚合物电池作为主电源,另加了一块TP4056作为充电管理IC。
图16.1 一种常见的拨轮开关
电路原理
1. 主控电路
主控电路中最主要的部分就是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通信。
图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版硬件,我也不知道什么时候能完成。虽然工程越做越大,所谓的技术含量也越来越高,但是却似乎少了当初那份纯粹的乐趣,那份质朴的感动。
■介绍一个与众不同的淘宝店铺:首页-数码达人小二-淘宝网,点开有惊喜!
单片机是什么?单片机和计算机、PLC的区别
近些年来消费类电子产品可谓百花齐放,各式各样的设备让人眼花缭乱,那么有一些人可能就会问了,这些电子产品到底是用什么做的呢?本期,我们主要探讨的是这些电子产品后的一种控制核心------单片机。
1、单片机可以用来做什么?
目前单片机渗透到我们生活的各个领域,我们几乎每天都能看到它的踪迹。小到各类玩具、手机、电脑键盘、彩电、冰箱、空调、抓娃娃机、售货机,大到汽车、飞机、动车组,甚至是前段时间中国月球背面软着陆的探测器,这些设备里面都有一个或者多个单片机。单片机存在于我们看见或者看不见的地方,它的数量远比电脑多的多,甚至比全球人类的数量还要多。因此,对单片机或者电子电路感兴趣的朋友,请关注我吧,后期我会为大家分享单片机的学习过程和一些小制作。
2、什么是单片机?它和计算机、PLC等有什么区别? 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器、串口等功能集成到一块硅片上构成的一个小而完善的计算机系统,通常称为微控制器。
它不同于个人计算机,个人计算机由若干块芯片模块组装而成,比如硬盘、内存条等,安装在一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了。计算机偏向于计算,而单片机更倾向于硬件的逻辑控制。比如我们要做一个动画等,不需要和硬件打交道,那么就用计算机。如果我们想要控制家里的灯,那么我们就牵涉到灯的控制,需要使用单片机。
单片机和计算机各有强弱只是侧重不同,现在也有一部分纠结到底是学习使用安卓工控机还是学习使用单片机,其实这个完全可以根据个人兴趣和实际应用来决定。想写手机软件之类的那么就玩安卓,想控制些电机或者灯之类的就耍单片机,它们两个侧重点不一样。有时候他们两个会同时用到,比如智能家居就是这两者的结合,一个侧重于数据的计算,一个侧重于硬件的控制,它们相辅相成。
对于初学者而言,单片机和PLC是比较容易混淆的两个东西。这个也难怪,因为它们两个乍一看真的很像,特别是在学校里,一般做实验都是做简单的控制,有的用单片机控制LED灯,有的在试验箱上用PLC控制一个照明灯,所以大家难免混淆,都是控制硬件,不知道具体的区别,也不知道到底该学哪一个。笔者之前也有这样的困惑,直到我两个都接触之后我才发现它们的差别如此之大。
咱们直接可以这么理解,PLC就是用单片机加光耦、继电器等外围器件做的一个东西,它是单片机的一种应用。比如电子表,也是单片机的一种应用。电子表用来看时间,单片机用来搞控制,大家都不会混淆。但是PLC和单片机都可以用来控制,这样就比较容易混淆了。可以这么说,用PLC的地方都可以用单片机,但是用单片机的地方不一定能用PLC。那可能有人问了,既然单片机都可以搞定为什么还要有PLC呢?其实PLC还是很有用武之地的。
PLC使用的是梯形图编程,相对于C语言比较简单,对初学者的要求不高,很容易就入门了。一般在大型项目,或者产品数量不多的情况下使用PLC控制,PLC的特点是模块化、抗干扰、研发成本低、可以迅速组建产品,但是价格昂贵,适用于定制化工程项目。单片便宜,适用于批量化生产的产品中,比如玩具、电话等。但是前期研发成本比较高,需要从原理图和PCB入手,一遍一遍的迭代产品,前期研发成本较高。可以这么简单理解,如果是做工程项目首选PLC。如果做产品批量生产,首选单片机。
3、我们常说的51单片机和8051、8031、89C51等到底有什么关系? 平时我们总是听说51单片机或者8051、8031,还有89C51,89s51等,那么它们之间究竟是什么关系?
所谓的51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括很多的型号,如8031、8051、8751、8032、8052、8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上演变而来的,所以有的人习惯于用8051来称呼51系列单片机。而目前网上资料最多的就是STC89c51或者AT89c51的单片机,所以我们现在常说的51单片机指的就是这个,可能还有STC89c52,其实它也是51系列的单片机,只是内存大了一点而已,程序基本是兼容的。
4、学习单片机的编程语言到底是学汇编还是学C语言? 很明确的告诉你,首先学C语言,特别是初学者,一定要从C语言入手。简单的语法,可读性强,可移植性强,而且后期的编程都是基于c语言完成的。对于单片机初学者或者是只想用单片机进行DIY的小伙伴就可以不用理会汇编语言了。如果想要深入了解单片机工作原理的应该学习一下汇编。
5、学习单片机需要具备哪些知识呢?
一些简单的C语言知识,一些简单的模电和数电知识,说是一些其实真的也不多,如图使用单片机驱动一个LED灯的电路,其实很容易理解。想要学习这些知识的可以关注我,后续我会一点点分享单片机的学习知识。学习过程中我们既可以使用proteus模拟,也可以使用单片机开发板或者单片机模块进行学习。
相关问答
用51 单片机 做电子钟,自动校时方面最简单的能用什么方法?[回答]数字电子钟的时间跟你晶振频率有密切关系,秒钟走慢原因是晶振频率太小;电子钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计...
51 单片机 可以做哪些有趣的专题制作?51系列单片机,种类是非常多的,当然可做的东西也就非常多。截止目前,还有很多做控制的人在使用51系列单片机,原因就是控制精准,好扩展。以下从特性,应用分别...
51 单片机 电路的工作原理是什么?单片机应用,从来不讲原理。只知道怎么用就行了。ds1302是时钟芯片。单片机软件用p3口三根线读出时间,说白了就是块电子表。单片机应用,从来不讲原理。只知...
高中物理如何判断电压表测谁的电压一般是考虑内阻的,是不是还...[回答]这问题用文字说明有点麻烦,希望对你有用.首先,只要出题人没有毛病,高中的电压表肯定是机械表(指针的那种,电子表涉及单片机数电模电等方面,其基本原...
汽车里的电子钟是按什么原理工作的?和家里最普通的电子表无异。车用的有的是电瓶供电,电瓶大线切断后时间就归零了,接通电瓶后需要重新调试时间的。但也有的是电子钟后面自带纽扣电池的,电瓶大线...
数码管 电子表 的价格是多少?-家居装修–手机房天下问答[回答]做一个3V干电池或(纽扣电池)供电的数码管的电子表(表只是其中一部分,还有其它功能!),我不知道有没有现成的数码管时钟表头,就是88:88那种,要低功耗...
电表选择三个原则?这里就需要看具体使用要求了。系统组成:普通家用电表主要由两个系统组成:测量系统和单片机处理系统。测量系统:是一块单相电子式电能表。工作原理为:由分...
DS1302的介绍和引脚图-ZOL问答DS1302是时钟芯片,有计时的作用,和日常接触的电子表差不多,可以对年月日、时分秒、星期计时。可以用单片机往DS1302里面写入时间进行时间设置,也可...
请问:77G毫米波雷达24G雷达多少钱?[回答]毫米波雷达的应用;炮火控制:毫米波雷达可用于对低空目标的炮火控制,已研制成94吉赫的单脉冲雷达。雷达测量:高分辨力和高精度的毫米波雷达可用于测...
跑步机klaus故障代码-ZOL问答控制器、电子表、通讯线出现不良都可能会导致上下控不通讯出现E01。维修时可使用同类型控制器、电子表及控制线替换确定故障部位后再逐步修理。解决办法:通常...