[Zero]TC1602 红外遥控液晶屏时钟

Photobucket
项目代号:TC1602_5616 (063) / TC1602_5204(059)
主芯片:STC12C5616AD
显示模块:1602
时钟芯片:DS1302
测温芯片:DS18B20
红外遥控:VS1838B + 38K红外遥控器

TC1602_5616元件清单:

元件 数量 备注
7×9 洞洞板 1片 电路基板
STC12C5616AD-DIP28 1片 主芯片
11.0592M晶振 1片 单片机起振
30pF瓷片电容 2枚 单片机起振
10uF电解电容 1颗 电源滤波(可选)
104瓷片电容 1颗 电源滤波(可选)
DS1302-DIP8 1片 时钟芯片
32768k晶振 1颗 时钟芯片起振
CR2032纽扣及电池座 1套 时钟芯片备用电源
DS18B20 1颗 测温芯片
VS1838B红外探头 1颗 接收红外信号
30K 21键红外遥控器 1颗 红外遥控
1602液晶屏 1颗 显示输出
1k电位器 1颗 液晶屏对比度调节
8550三极管 1颗 PWM输出控制1602背光亮度
1k电阻(贴片) 1颗 8550基极限流
蜂鸣器 1颗 整点“报时”,按键反馈
排座、排座 若干
USB串口模块 1个 程序下载,串口对时(可选)

做这个东西,其实给我的感觉,其实更接近于是一个“大作业”。未必会像课程设计或是毕业设计那样,会有不少创新、而是一个所学的综合应用。
Photobucket
这个制作,更多的考验在于各模块的整合,以及UI的设计。接触Arduino,主要还是感觉它提供的一系列函数库,方便新手的调用,并且实现了类的封装。这其实是一个“抽象”的过程,但实际上让编程的逻辑更加“具象”了。这个制作参考网上一些应用的例程,进一步重构,尽量使其模块化(没法用类封装,所以只能说模块化),更具有通用性(底层代码的正确运行,还是离不开硬件平台的各个参数)。

然而终究牵扯到太多底层的操作,拿这个实例来说,使用到了3种中断:计时器中断、外部中断、串口中断,所以还是不得已用到了全局变量。而当这些全局变量在各个文档之间穿越的时候,总会感觉比较诡异。同时,在arduino这样的平台上CPU的主频,某种程度上已经被固定下来,可以获得比较稳定的延时,而51系统的话,延时部分还是会需要更为细致的调整,尤其是遇到像DS18B20以及红外接收这样模块时,延时的长短直接关系到功能的实现,所以例程中“神秘数”就相对比较多。

在进一步理清头绪之前,这个制作还不会继续往功能全的方向发展。不过,目前基本实现了一些特色功能:1602的自定义显示,通过有限的CGRAM呈现别样风格的“大字体”数字显示;PWM背光调节;遥控校时;串口校时;显示模式可调等。

首先尝试的一个版本是以STC12C5204AD为主芯片,它4K的Flash,在实现1602、DS18B20、DS1302、串口校时这几个模块以后,就已经满了。所以,后来又用STC12C5616AD新作了一块板子,这样就把红外的部分也加进去了一部分,也添加了PWM调节背光的模块,目前程序大小,刚刚超过6K。也就是说,目前的用户界面,光标的左右移动,数值的上下调节,一不小心就写了2K的程序。而且在这里面,其实还有一个菜单的逻辑,当进入校时界面以后,“Backward”和“Forward”这2个按键,又有了別的功能(非设置界面下是背光亮度调节)。而更加诡异的是,红外遥控,又是由外部中断触发的。所以就需要全局标志位以及按键代码的介入(这就是前面提到的全局变量开始跨越模块的一个实例)。

UI的逻辑,也是比较麻烦,如果作为一款校时界面完善的时钟,个人觉得应该做到:

  • 每月天数的自动修正:“一三五七八十腊”是不是31天?
  • 闰年处理,是不是先根据当前的年份数,确定闰平年,严格意义上来说,闰年可不是4年一次哦。
  • 如果年份由平年调整为闰年,是不是又进一步改变已经修改过的2月份的总天数?
  • 星期几有必要单独调整吗?这个不应该是自动算出来的吗?

而单纯考虑这个又显得没什么意义,因为

  • 如果掉电不掉时,自行去调节时间的概率又有多高呢?
  • 时钟芯片如1302,包括更高档的DS3231,都包含月份天数的控制,以及闰平年的自动转换,至少走时到公元2100年,我们又需要设计得那么长远呢?你要知道,即便到了今天,市面上在销售的绝大多数电子表,年份只管到2029年。对于我来说,总感觉那是一个更加临近的“千年虫”问题。如果是喜欢电子表的朋友,购买之前,不妨查查这个指标哦。
  • 手工对时(用遥控器),又能提供多少的精度?
  • 如果我已经实现了更为方便快捷的一键串口自动校时,你还会想着手工对时吗?而直接从计算机读取时间的话,闰平年、星期几之类的问题,肯定早都考虑到了。

嗨,原来整一个界面这么麻烦,在51上面,直接在硬件上编码,就会显得更加崩溃。所以TC1602目前就日期的调节,都是比较诡异,为了编程简单,所以日期的范围都固定在1-31,没有格外的逻辑。星期几也是单独调节的。真是佩服那些用机械就实现这些自动调整的表,那技艺就不仅仅是精湛了。另外,关于38K红外遥控器,虽然按键布局有很多种,但实际上只是面板不同而已,按键的图案有所不同,而实际上各个键位的编码是一样的。

所以,目前对于TC1602的定位,更多的是一个软件方面的尝试,当一个系统包括较多模块的时候,如何对其进行统筹和规划,是一个实验作品。

TC1602_5616的布线图如下:
Photobucket

Photobucket
Photobucket

有兴趣的朋友,可以结合照片以及相关芯片数据手册,实现搭接。如果需要HEX文件,欢迎留言索取。

在视频中,有大致介绍一下我编程时的Keil界面布局,有兴趣的朋友不妨看看,个人的做法,是把宽屏的屏幕分割成垂直的3条来编程:功能代码、模块代码、头文件。

Photobucket

圣源电子 的大力协助下,现在 TC1602 已经移植到 Arduino 平台下,并制成成品套件,欢迎点击《[Arduino|Micro] TCA1602 红外遥控液晶屏时钟》查看。

关于aGuegu

向着更高的逼格
此条目发表在初號機 | Zero分类目录,贴了, , , , , , , , , , , , , 标签。将固定链接加入收藏夹。
  • norda

    大哥,表示很崇拜你,能把源程序发给我学习下么?

  • sdl301

    大师,求源程序,学习学习,谢谢了!

    • 源程序,暂不公开,但是可以发Hex文件给你。

  • 张少利

    支持你啊,哈哈

  • sdl301

    大哥 给份hex 谢谢了 sdl301@yeah.net

    • 已发送至您邮箱,如果发布自己的制作,烦请注明Hex来源哦~ 🙂

  • 张继宏

    我要仿制下,可有原理图求hex, xiazai908@qq.com

    • Hex文件已经发出,没有原理图,可以根据元件清单和布线图,自己花一个么,很简单的,: )

  • 龙将

    前辈,崇拜。求hex

    • 已发,作品做出来的话,提一下我这边就好咯,嘿嘿~

  • 李玲枫

    大哥 给份hex 我要仿制玩

  • 李玲枫

    大哥,我想仿制个玩玩,麻烦给个HEX文件

    • Hex以发送至邮箱,请查收。

  • hh

    背板的连线都是用焊锡丝实现的吗?

    • 没有丝,就是焊锡。

  • jinhua tang

    大师,求个HEX文件,学习学习,谢谢了!
    bdya820619@yahoo.com.cn

  • 1126174099@qq.com求hex学习

  • 哇。。。超厉害耶,我也要试试

    • 不久会有Arduino的版本吧,到时候直接开源码吧。

      • 好的,谢谢大虾

      • 能先给我hex,让我试试吗?很想先试试。。。

        • 有往你的人人邮箱发,结果被退信了,再留个邮箱咯

  • 用起来很不错哦,谢谢你,阿古!以后还要向你多学习学习哈

  • 舒欢欢

    很不错 要向你好好学了 最近也在做这个 给个HEX吧 有程序最好 谢了

    • Hex 文件已发至您邮箱。

  • 李建强

    很不错,想做一个学习学习,官哥给个hex吧

    • 李建强

      能把电路原理图发一下吗

      • 没有原理图呢, 不太会画那个东西……

  • 李建强

    好的谢谢官哥

  • Pingback: [Arduino|Micro] TCA1602 红外遥控液晶屏时钟 | Agu's Mill 古作坊()

  • 杨晓聪

    学习下 比我自己的好很多 给个hex吧 andy.33@163.com