基于STC89C51制作具有记录天亮天黑时间功能时钟.docVIP

基于STC89C51制作具有记录天亮天黑时间功能时钟.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于STC89C51制作具有记录天亮天黑时间功能时钟

基于STC89C51制作具有记录天亮天黑时间功能时钟【摘要】采用具有4K EEPROM的STC89C51作为微控制器,提出了提高定时器计时精度的简单方法,节省了时钟芯片的开销,采用定时器编写延时程序,使目标代码变得精简,通过软缓冲机制使传感器抗干扰性增强。 【关键词】STC89C51;晶振;EEPROM 前段时间做一个记录天亮天黑时间的仪器,要求能存储时间,并且时钟要精度高,需要的时候可以上传到电脑进行分析处理。传感器可以用光敏二极管和光敏三极管以及光敏电阻,考虑到易于调整最终选择了使用光敏电阻。在数码管的驱动上选择了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 sbit DIN=P2; //MAX7219串行数据 1脚 sbit LOAD=P2; //MAX7219片选 12脚 sbit CLK=P2;//MAX7219串行时钟 13脚 sbit k1=P2; sbit k2=P2; sbit k3=P2; sbit AD0832_CLK=P1; sbit AD0832_DIO=P1; sbit AD0832_CS=P1; //寄存器宏定义 #define DECODE_MODE 0x09 //译码控制寄存器 #define INTENSITY 0x0A //亮度控制寄存器 #define SCAN_LIMIT 0x0B //扫描界限寄存器 #define SHUT_DOWN 0x0C //关断模式寄存器 #define DISPLAY_TEST 0x0F //测试控制寄存器 #define X1 15 //这里我把黑夜触发值设置为15 #define X2 20 //把天亮触发值设置为20,实际上天彻底黑的值为0 #define X ADC0832() //定义全局变量 char times[5]=0; //定义hour,minute,second,秒计数,延时计数到数组times,并初始化为0,此处必须为有符号字符,为了下面调时间方便 bit backup;//定义参考变量 unsigned char set_parameter=0; unsigned int add

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档