搜索
bottom↓
回复: 51

51单片机新手入门实战:可调时钟

[复制链接]

出0入0汤圆

发表于 2012-8-11 12:28:38 | 显示全部楼层 |阅读模式
本帖最后由 304301959 于 2012-8-11 12:28 编辑

一、原因
       其实我接触51也接近快一年的时间了,当时还是在学校里面自学的。自认为自己的51已经算是比较熟练的地步了,后来因为老师的一句“前途无量”更是沾沾自喜。前段时间看了“从单片机初学者迈向单片机工程师”一帖,瞬间感觉自己真的是还没有入门。总结自己之前学的东西,不懂51内部寄存器之间的相互配合不说,编程的思路也是一直延续郭天祥老师的Delay()、While(),说白了就是在原地踏步啊。“单片机工程师”一帖我看了不下5次,但发现自己似乎长进并不大,其实是忘了实践的重要性了。所以这几天就挤出了工作之于,来完成一个可调时钟。
二、感悟
      按照”单片机工程师”上的编程思路和习惯,虽然感觉有点繁琐(以前很短的程序,按照标准化来写就长了很多,连变量的定义名字都长了很多)。但是这样的习惯却让自己对整个系统的框架有了比较清晰的认识,比以前要得心应手一些。这个程序还依稀能看到我以前编程的影子(为了实现一个功能而东拼西凑),仔细想想却发现是自己犯了一个大错——没有画流程图。没有流程图清晰的结构,写起程序来确实是要吃力很多了,反反复复改了很多次。今日看STC烧写软件上的计数居然为253次,这样反而降低了自己做事的效率。
三、问题
1、可调时钟能够实现功能
     A、显示时、分、秒。在时间显示状态下,按下一次“”调整“”键,时、分、秒之间的LED灯闪烁,表示进入时间调整状态。按下第二次,“时”间隔300MS闪烁,加、减键可以对其进行操作,能够识别短按与长按。进入连续调整状态时,不闪烁,时间增加。按下第三次,“分”间隔300MS闪烁,操作与“时”类似。按下第四次,退出调整模式。
     B、在时间显示状态下,同时按下“加”、“减”键,进入闹钟调整模式,显示00-00-00,按下“调整”键第一次,“时”闪烁,“加”、“减”键作相应调整,按下“调整”键第二次,”分“闪烁,“加”、“减”键作相应调整。按下“调整”键第三次,退出模式
     C、当设置闹钟时间与现实时间一致时,报警一分钟。
2、程序存在的问题
    A、程序的结构及技巧性不强,编译出来有6K的HEX。
    B、过5、6个小时时间会慢两分钟左右,之前以为是我写的子程序太多了,于是屏蔽其他程序只留下了显示和时间走动的函数。但是过几个小时,依然会慢一两分钟(整个程序没有用到任何Delay()延时,也没有堵塞CPU的地方,而且通过keil调试发现扫描完所有程序的时间只有0.1ms而已),搞不懂问题出在哪里了。
    C、实现可调时钟的方法有许多,我想了解与当今市场相符的制作方式
真心希望有前辈能够为我上面出现的问题指点一二,若是有大神对我等小菜不屑一顾想喷我,没关系,但请指出喷我的原因
废话说多了,直接上图!(程序由KEIL编译)
由于工作原因,只有周末才会上网。若不能回答大家问题,请见谅,谢谢!

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-8-11 12:30:16 | 显示全部楼层
希望大家多给点意见,多多交流!

出0入0汤圆

发表于 2012-8-11 12:57:07 | 显示全部楼层

出0入98汤圆

发表于 2012-8-11 13:03:39 | 显示全部楼层
罗马法

误差是由晶振造成的
累积出来就大了

google "black roman zero error"
我最早是听@millwood0说的

出0入0汤圆

发表于 2012-8-11 13:21:52 | 显示全部楼层
不对,晶振误差不该这么大,几个小时就差了1,2分钟,2我们一般做1个月才差几十秒。应该还是时钟配置,或软件有问题

出0入0汤圆

发表于 2012-8-11 14:14:42 | 显示全部楼层
时间误差应该是Timer0的手动重装引起的,建议改为自动重装模式.
因为中断发生后并不会立即响应,至少要等当前指令执行完,而51有单周期指令,也有多个周期的指令.

出0入0汤圆

发表于 2012-8-11 15:10:15 | 显示全部楼层
用个时钟芯片就好了。
像你这个我也写过一个,不过没有秒显示。也只是简单的可调时间。显示时间。不过我没试他的误差。在PROTEUS里放真了一下没什么问题就没管了。
整个编译出来才0.7K的程序,不知道LZ还有些什么功能没有。

出0入0汤圆

发表于 2012-8-11 15:42:14 来自手机 | 显示全部楼层
运行20分钟,确实有误差

出0入0汤圆

发表于 2012-8-11 17:26:07 | 显示全部楼层
用单片机定时精确性是不会太高的,用时钟芯片应该会好一些

出0入0汤圆

发表于 2012-8-11 17:59:10 | 显示全部楼层
确实该用下时钟芯片

出0入0汤圆

 楼主| 发表于 2012-8-11 22:14:33 | 显示全部楼层
lcw_swust 发表于 2012-8-11 14:14
时间误差应该是Timer0的手动重装引起的,建议改为自动重装模式.
因为中断发生后并不会立即响应,至少要等当前 ...

似乎有点道理,我去试试,谢谢!

出0入0汤圆

 楼主| 发表于 2012-8-11 22:18:11 | 显示全部楼层
谢谢大家的建议,不过时钟芯片我用过,比如1302。用程序来写时间的目的,就是为了训练自己写好程序结构,模块化等等。若直接用时钟芯片,那么似乎对我来说意义就不大了哦。

出0入0汤圆

 楼主| 发表于 2012-8-11 22:20:04 | 显示全部楼层
rclong 发表于 2012-8-11 13:03
罗马法

误差是由晶振造成的

晶振误差也不会有这么大的吧

出400入0汤圆

发表于 2012-8-11 22:23:06 | 显示全部楼层
发一个我写的时钟吧,郭天翔tx-1c开发板上的。误差大概一天一分钟。用的定时器自动重装。hex有4k,也不是很小。多多指教

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-8-11 22:26:20 | 显示全部楼层
Tliang 发表于 2012-8-11 15:10
用个时钟芯片就好了。
像你这个我也写过一个,不过没有秒显示。也只是简单的可调时间。显示时间。不过我没 ...

你好!1、功能也就是一般的时间调整,调整时闪烁,能够区分短按、长按、组合按键。
         2、也加了闹钟的设置和显示,调整方式和调整时间的方式是一样的。
         3、写程序的目的是为了训练自己的程序设计结构和模块化思想,时钟芯片不能达到我的目的的。
能否把你的以前做过的给我看看呢?

出0入0汤圆

 楼主| 发表于 2012-8-11 22:30:47 | 显示全部楼层
rainyuoko 发表于 2012-8-11 22:23
发一个我写的时钟吧,郭天翔tx-1c开发板上的。误差大概一天一分钟。用的定时器自动重装。hex有4k,也不是很 ...

您好!建议您去看看“单片机向工程师迈近”这个帖子

出400入0汤圆

发表于 2012-8-11 23:02:00 | 显示全部楼层
304301959 发表于 2012-8-11 22:30
您好!建议您去看看“单片机向工程师迈近”这个帖子

呵呵,我传上来了,给有需要的网友吧

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2012-8-11 23:19:53 | 显示全部楼层
谢谢分享 很不错的资料啊

出0入0汤圆

 楼主| 发表于 2012-8-11 23:43:00 | 显示全部楼层
rainyuoko 发表于 2012-8-11 23:02
呵呵,我传上来了,给有需要的网友吧

谢谢分享!

出0入0汤圆

 楼主| 发表于 2012-8-11 23:43:49 | 显示全部楼层
自由的梦想 发表于 2012-8-11 23:19
谢谢分享 很不错的资料啊

过奖了,只是程序设计的大体思路有的,不过还存在一些BUG(比如时间误差

出0入98汤圆

发表于 2012-8-11 23:48:03 | 显示全部楼层
304301959 发表于 2012-8-11 22:20
晶振误差也不会有这么大的吧

累积起来就大了 即使是硬件自动重装
毕竟你的初值是按照理论晶振频率设定的

看看下面这个帖子中11楼的回复
STC 单片机使用定时器 定时1S 求助!
http://www.amobbs.com/thread-5467559-1-1.html

出0入0汤圆

发表于 2012-8-11 23:51:26 | 显示全部楼层
本帖最后由 chengzepeng 于 2012-8-11 23:52 编辑

等下我也去写一个看看有多大,

想找我可以在某企鹅里面搜我图片里的拼音(不含中文)加我讨论。

好像论坛限制回帖数量!

出0入0汤圆

 楼主| 发表于 2012-8-12 07:35:22 | 显示全部楼层
rclong 发表于 2012-8-11 23:48
累积起来就大了 即使是硬件自动重装
毕竟你的初值是按照理论晶振频率设定的

我去好好看看,谢谢!

出0入0汤圆

发表于 2012-8-12 08:45:26 | 显示全部楼层
304301959 发表于 2012-8-11 22:26
你好!1、功能也就是一般的时间调整,调整时闪烁,能够区分短按、长按、组合按键。
         2、也加了闹 ...

我写的没有功能键组合,没有区分长按短按,没有闹钟,只是一个简单的调时间的。调时的时候秒指示灯停止,相应数码管闪烁.

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-8-12 08:55:24 | 显示全部楼层
Tliang 发表于 2012-8-12 08:45
我写的没有功能键组合,没有区分长按短按,没有闹钟,只是一个简单的调时间的。调时的时候秒指示灯停止, ...

谢谢分享

出10入10汤圆

发表于 2012-8-12 09:05:29 | 显示全部楼层
用专用的时钟芯片也会因为32768晶振精度引起误差,楼主误差很大,因该跟程序有关。

出0入0汤圆

发表于 2012-8-12 09:26:52 | 显示全部楼层
终于能直接用手上的廉价AT89C52玩玩数码管时钟了。顶顶楼主^_^

出0入0汤圆

 楼主| 发表于 2012-8-12 09:30:52 | 显示全部楼层
szxszx 发表于 2012-8-12 09:05
用专用的时钟芯片也会因为32768晶振精度引起误差,楼主误差很大,因该跟程序有关。 ...

应该是,不过看了很久都没有看到任何堵塞CPU的地方,所以我想仔细考虑一下中断的问题了

出0入0汤圆

 楼主| 发表于 2012-8-12 09:32:11 | 显示全部楼层
sunny503 发表于 2012-8-12 09:26
终于能直接用手上的廉价AT89C52玩玩数码管时钟了。顶顶楼主^_^

呵呵,其实操作不难的。等我把BUG修复了,再给你发个完整的吧

出0入0汤圆

发表于 2012-8-12 09:48:36 | 显示全部楼层
多谢楼主!楼主你这个时钟的数码管是共阳极的还是共阴极的呢?我的邮箱67194028@qq.com,能加我QQ好友吗?

出0入0汤圆

 楼主| 发表于 2012-8-12 09:54:14 | 显示全部楼层
sunny503 发表于 2012-8-12 09:48
多谢楼主!楼主你这个时钟的数码管是共阳极的还是共阴极的呢?我的邮箱,能加我QQ好友吗? ...

共阳数码管哦,单片机写0点亮,这样可以降低单片机负担。我企鹅就是我用户名啦,大家多多交流哦

出0入0汤圆

发表于 2012-8-12 12:36:06 | 显示全部楼层
本帖最后由 chengzepeng 于 2012-8-12 12:39 编辑

http://www.amobbs.com/thread-5491557-1-1.html

特意写了个新手测试程序,
有兴趣可以看看!

不准的原因有两种,
一种是软件,在填充定时器占用时间,
另外一个是硬件,晶体的负载电容不合适或者晶体不合格(精度不高),
可以使用高精度的频率计测扫描位的IO来逆算晶体频率!

出0入0汤圆

 楼主| 发表于 2012-8-12 15:55:00 | 显示全部楼层
chengzepeng 发表于 2012-8-12 12:36
http://www.amobbs.com/thread-5491557-1-1.html

特意写了个新手测试程序,

是可以考虑这方面问题了

出0入0汤圆

发表于 2012-8-12 19:49:33 | 显示全部楼层
代码编译出来连2K都不到,哪来的6K?你看文件?那个是hex字符文件,不是bin
Program Size: data=48.3 xdata=0 code=1871
                    内存消耗                 闪存消耗

出0入0汤圆

发表于 2012-8-16 18:49:12 | 显示全部楼层
本帖最后由 sunny503 于 2012-8-17 14:26 编辑

曾答应楼主一定要用万能板搭建个楼主提供的51单片模拟时钟板玩玩的(平时都是热转印的多,苦于制作资料没有热转印图,自己就绘画个OO版草图,也当去怀念一下高中时期自己找不到FECL腐蚀液体的苦闷时光O(∩_∩)O哈哈~,说多了)。由于这3天较忙,勉强也OO出来了O(∩_∩)O哈哈~,OO板尺寸68X92MM:
我仿做的68X92MM万能板实物下图:

我仿做的万能板实物单个共阳LED的字段A_B_C_D_E_F_G-(Dp)字段的辛苦连接,数码管全用IC针座方便换用其他颜色或测试数码管用^_^下图:

我仿做的万能板实物底部飞线图(用废旧硬盘线软驱线连接)下图:

我仿做的万能板实物工作走时图,原理图中EA要接+5V否则不工作,下图:

至此多谢阿莫论坛结识的楼主的热心帮助!
        祝大家也玩的开心,阿莫论坛人气旺旺^_^
             Sunny503
           2012.08.16

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2012-8-17 21:50:45 | 显示全部楼层
sunny503 发表于 2012-8-16 18:49
曾答应楼主一定要用万能板搭建个楼主提供的51单片模拟时钟板玩玩的(平时都是热转印的多,苦于制作资料没有 ...

看到出来做得很认真,值得鼓励

出0入0汤圆

 楼主| 发表于 2012-8-17 21:56:38 | 显示全部楼层
找到问题的解决原因了,是定时器和晶振没有设置好。用11.0592M,定时初值为5MS。TH0=0XEE,TL0=0,充分发挥TL0的误差补偿!运行了一天,一秒不差!

出0入0汤圆

发表于 2012-8-17 23:00:40 | 显示全部楼层
这么晚楼主还没休息呢^_^,解决问题的原因说的是“B、过5、6个小时时间会慢两分钟左右”--的原因吧?(处理方法就是“用11.0592M,定时初值为5MS。TH0=0XEE,TL0=0,充分发挥TL0的误差补偿!运行了一天,一秒不差!”)我也试试对比电脑上的走时情况后说说

出0入0汤圆

 楼主| 发表于 2012-8-18 15:09:41 | 显示全部楼层
这个是修改后的程序了,目前没出现什么问题啦!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2012-8-20 05:03:58 | 显示全部楼层
Thank you to share

出0入0汤圆

发表于 2012-8-20 07:53:37 来自手机 | 显示全部楼层
用DS12C887 误差会小很多 还有内置锂电 断电走时 应该会好一点

出0入0汤圆

发表于 2012-8-20 07:57:26 来自手机 | 显示全部楼层
chengzepeng 发表于 2012-8-12 19:49
代码编译出来连2K都不到,哪来的6K?你看文件?那个是hex字符文件,不是bin
Program Size: data=48.3 xdata ...

貌似你错了 CODE和HEX的大小不一样 请看[再谈代码大小前后不一问题:资源管理器显示比CODE大了5K!]一帖

出0入0汤圆

发表于 2012-8-20 08:07:21 | 显示全部楼层
为何不用定时器2的自动重载方式?
DS1302之类的,如果处理不好32K晶振,那误差也会大的离谱。

出0入0汤圆

发表于 2012-8-22 15:31:53 | 显示全部楼层
本帖最后由 chengzepeng 于 2012-8-22 15:33 编辑
XA144F 发表于 2012-8-20 08:07
为何不用定时器2的自动重载方式?
DS1302之类的,如果处理不好32K晶振,那误差也会大的离谱。 ...


AT89X51里面没有定时器2的!
STC的就不知道了。

出0入0汤圆

 楼主| 发表于 2012-8-22 20:00:14 | 显示全部楼层
gaoyichuan000 发表于 2012-8-20 07:53
用DS12C887 误差会小很多 还有内置锂电 断电走时 应该会好一点

谢谢,我的目的是为了训练自己模块化的编程思路哦。用时钟芯片就意义不大啦

出0入0汤圆

 楼主| 发表于 2012-8-22 21:12:18 | 显示全部楼层
chengzepeng 发表于 2012-8-22 15:31
AT89X51里面没有定时器2的!
STC的就不知道了。

STC有的,准确的说是具有51内核的单片机都会有的

出0入0汤圆

 楼主| 发表于 2012-8-22 21:14:11 | 显示全部楼层
XA144F 发表于 2012-8-20 08:07
为何不用定时器2的自动重载方式?
DS1302之类的,如果处理不好32K晶振,那误差也会大的离谱。 ...

只是想看看方式1的精度能达到多少,好像网上有一种算法可以补偿晶振的误差,后面了解一下。

出0入0汤圆

发表于 2012-11-20 19:29:23 | 显示全部楼层
rclong 发表于 2012-8-11 23:48
累积起来就大了 即使是硬件自动重装
毕竟你的初值是按照理论晶振频率设定的

看了google "black roman zero error" 的内容,但是英语水平实在太菜,而看翻译出来的也让我有点糊涂,弄不清楚具体的思想,前辈看了吗?能不能分享下这里面的主要是怎样精确定时的啊

出0入0汤圆

发表于 2012-11-21 09:55:43 | 显示全部楼层
最近也看了那个帖子,不过我是新手,啥都不会。来跟着楼主学习学习

出10入113汤圆

发表于 2016-12-4 08:32:57 | 显示全部楼层
抛开晶体自身频率漂移,定时器自动重装应该是没有误差的,对不对?

出0入0汤圆

发表于 2016-12-4 09:51:16 | 显示全部楼层
不错 动手能 还 可以  

出0入0汤圆

发表于 2016-12-19 15:31:44 | 显示全部楼层
恭喜你啊,之前些年也做了一个和你的一样的,直到前些天搬家才摘掉。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 00:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表