[国产单片机] 【快乐分享】+基于STC89C51

[复制链接]
3874|20
 楼主| gaoyang9992006 发表于 2013-7-17 22:46 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2013-7-17 22:48 编辑




以上是PDF文档,绝对原创。
下面附件是程序代码文件




记录天亮天黑时间的仪器,要求能存储时间,并且时钟要精度高,需要的时候可以上传到电脑进行分析处
理。传感器可以用光敏二极管和光敏三极管以及光敏电阻,考虑
到易于调整最终选择了使用光敏电阻。在数码管的驱动上选择了
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进行写的时候先查找空白区,在空白区进行按组
写入,本程序只写入了小时分钟秒,如果扩展可以加入月份和日
期。擦除的时候逐个熄灭数码管提示进度。
其余的设计细节请参考程序注释。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 2威望 -3 收起 理由
地瓜patch + 2 赞一个!
qin552011373 -5 山寨

查看全部评分

ayb_ice 发表于 2013-7-18 10:52 | 显示全部楼层

不要乱下结论,什么晶振不准引起的时间不准

TH0=(65536-46068)/256;         
TL0=(65536-46068)%256;         

你这样的代码本身就有问题,赋初值时定时器仍在运行,怎么可能准呢,这需要动态调整来消除误差

评分

参与人数 1威望 +2 收起 理由
地瓜patch + 2 技术总监

查看全部评分

ayb_ice 发表于 2013-7-18 10:57 | 显示全部楼层
按键不松,程序基本都停了(只有中断还在运行,但显示已经被冻结了),有什么意义
ayb_ice 发表于 2013-7-18 10:59 | 显示全部楼层
还有数据调整,已经出现非法数据了,居然没有任何处理
outstanding 发表于 2013-7-18 14:38 | 显示全部楼层
这么多问题么?
 楼主| gaoyang9992006 发表于 2013-7-18 22:53 | 显示全部楼层
ayb_ice 发表于 2013-7-18 10:52
不要乱下结论,什么晶振不准引起的时间不准

TH0=(65536-46068)/256;         

真不准,我那晶振五毛钱一个。

评分

参与人数 1威望 -5 收起 理由
qin552011373 -5 山寨

查看全部评分

 楼主| gaoyang9992006 发表于 2013-7-18 22:54 | 显示全部楼层
ayb_ice 发表于 2013-7-18 10:59
还有数据调整,已经出现非法数据了,居然没有任何处理

哪儿,告诉我。我去瞧瞧。

评分

参与人数 1威望 -4 收起 理由
qin552011373 -4

查看全部评分

 楼主| gaoyang9992006 发表于 2013-7-18 22:55 | 显示全部楼层
ayb_ice 发表于 2013-7-18 10:52
不要乱下结论,什么晶振不准引起的时间不准

TH0=(65536-46068)/256;         

你详细说说。跟大侠学习学习。

评分

参与人数 1威望 -4 收起 理由
qin552011373 -4

查看全部评分

ayb_ice 发表于 2013-7-19 09:29 | 显示全部楼层
首先这个理论值就不准
其次在2L已经说的很清楚了
 楼主| gaoyang9992006 发表于 2013-7-19 12:27 | 显示全部楼层
ayb_ice 发表于 2013-7-19 09:29
首先这个理论值就不准
其次在2L已经说的很清楚了

理论值啊?呵呵。能让它精确回去就行啊。我这个方法能让系统时间更接近北京时间。走好几天也不会错几秒
ayb_ice 发表于 2013-7-19 15:32 | 显示全部楼层
你这个方法是因为你只有这一个中断,中断多了就不行了,

而且还随系统规模的大小有变化,没有什么可扩展性
 楼主| gaoyang9992006 发表于 2013-7-19 23:03 | 显示全部楼层
ayb_ice 发表于 2013-7-19 15:32
你这个方法是因为你只有这一个中断,中断多了就不行了,

而且还随系统规模的大小有变化,没有什么可扩展性 ...

en ,你说对了,谢谢你,呵呵,这个是我以前刚学51的时候做的一个小东西。现在不用定时器做了,用时钟芯片。就不占用系统的时钟周期了。
 楼主| gaoyang9992006 发表于 2013-7-19 23:03 | 显示全部楼层
ayb_ice 发表于 2013-7-19 15:32
你这个方法是因为你只有这一个中断,中断多了就不行了,

而且还随系统规模的大小有变化,没有什么可扩展性 ...

en ,你说对了,谢谢你,呵呵,这个是我以前刚学51的时候做的一个小东西。现在不用定时器做了,用时钟芯片。就不占用系统的时钟周期了。
llyyff1636 发表于 2013-8-9 17:27 | 显示全部楼层
很好,有时间做一个
logokfu 发表于 2013-8-10 09:17 | 显示全部楼层
既然做有关时间的,就得用专用的RTC,用单片机的timer,做这个没有意义。
 楼主| gaoyang9992006 发表于 2013-8-10 09:27 | 显示全部楼层
**kfu 发表于 2013-8-10 09:17
既然做有关时间的,就得用专用的RTC,用单片机的timer,做这个没有意义。

呵呵,省钱
dong_abc 发表于 2013-8-11 02:19 | 显示全部楼层
用keil软件仿真 可以调整精确度。
 楼主| gaoyang9992006 发表于 2013-8-11 21:26 | 显示全部楼层
dong_abc 发表于 2013-8-11 02:19
用keil软件仿真 可以调整精确度。

讲讲
dong_abc 发表于 2013-8-11 21:48 | 显示全部楼层
gaoyang9992006 发表于 2013-8-11 21:26
讲讲

在中断入口设置个断点,调整两次运行时间刚好为5ms。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| gaoyang9992006 发表于 2013-8-11 22:19 | 显示全部楼层
dong_abc 发表于 2013-8-11 21:48
在中断入口设置个断点,调整两次运行时间刚好为5ms。

Very Good, 非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部