本帖最后由 gaoyang9992006 于 2013-7-17 22:48 编辑
基于STC89C51制作的具有记录天亮天黑时间功能的时钟.pdf
(1.14 MB)
以上是PDF文档,绝对原创。
下面附件是程序代码文件
基于STC89C5X系统的具有记录天亮天黑功能的时钟.rar
(56.3 KB)
记录天亮天黑时间的仪器,要求能存储时间,并且时钟要精度高,需要的时候可以上传到电脑进行分析处
理。传感器可以用光敏二极管和光敏三极管以及光敏电阻,考虑
到易于调整最终选择了使用光敏电阻。在数码管的驱动上选择了
MAX7219芯片刚好驱动八位共阴极数码管,因为手头上只有三个
按键,所以在按键的设计上,采用一键多能的设计方法,按键的
功能分布如下:
K1:按动一次可以进行小时的调整,且小时位闪烁给出提
示,按动第二次可以对分钟调整,同样给出提示,按下第三次时
候可以对秒进行调整,秒位也闪烁一下进行提示,第四次显示传
感器读数,第五次按下后进入上传和格式化内部EEPROM的操作,
并且都会给出提示。
K2:调整时间时候进行加操作,上传和格式化时候为上传指
令键。
K3:调整时间时候进行减操作,上传和格式化时候为格式化
指令键。
由于手头没有时钟芯片,又不想去买,就考虑如何用定时器
做出高精度的计时器,在进行stc的下载中发现了一个奇怪的现
象,显示我单片机的晶振和标称相差很多,更换了几个做测试,
结果一样,终于被我发现原来定时器不准的最大原因在晶振本身
是不准的,现在我按照STC编程软件提示的频率设计中断程序的
定时器初始值,然后把中断跳转的指令消耗的时间考虑进去,进
行了两天的测量,尽然与我笔记本的时间误差不到1s,获得较为
精准的时间成功,这完全可以和普通的时钟芯片相比了。
考虑到按键的延时函数,以前都是使用for循环那样写太老
套了,在各种书上我们只能看到for循环和while循环的延时函
数,这种软件延时显然不能有效的控制延时时间,于是我考虑在
中断里加上一个延时变量。这样就可以更为精准的控制延时了。
而且会使目标代码更为短小。
以前没有使用过STC的内部EEPROM,由于要求能够存储足够
多的数据,需要能掉电保护的存储器,查看了STC89C51的手册
发现竟然有4K的EEPROM可以使用,心里大喜,把手册上提供的
EEPROM读写和擦除操作代码直接复制过来就行了。
传感器选择了光敏电阻,经过万用表的测量,电阻在光照较
强的时候大约1K,在黑暗环境达到几百K,于是选择了手头上的
一枚10K的电阻进行串联匹配,用于分压比较。因为这样只需要
测量定值电阻上的分压比就行了,不用考虑电压源的稳定性。在
AD转换上采用ADC0832一片就OK,还多出来一个通道呢。
在通过电脑串口上传数据时候发现每次上传一位需要延时一
下,给硬件足够的反应时间,要不接收会出错的,比如没有收到
全部数据,数据丢失,等等。
在判断何时记录时间时候,考虑到传感器可能会出现数值
震荡或者不稳定情况,那么我就通过设定缓冲区来解决这个问
题。定义X1和X2作为触发记录的上下限,其中X1<X2,且X1不等
于X2,那么X1和X2直接的取值就作为了缓冲区了,当传感器读数
X在缓冲区和其任意边界进行跳变时候不进行触发,唯X1(或者
X2)跨越缓冲区进入X2(或者X1)时候触发记录程序,记录下当
时的时间。考虑到干扰发生,并进行延时再判断。
在EEPROM进行写的时候先查找空白区,在空白区进行按组
写入,本程序只写入了小时分钟秒,如果扩展可以加入月份和日
期。擦除的时候逐个熄灭数码管提示进度。
其余的设计细节请参考程序注释。
|