打印

51单片机新手上路之电子钟——持续更新中……

[复制链接]
3073|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yumpie|  楼主 | 2011-9-7 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我不是学电的,确切的说我是学机械的。

前段时间开始迷上了单片机,汇编看了几天,写了个流水灯,实在受不了了。

下了个 郭天祥的视频看,还没看完呢。

前几天开始着手实践,准备用手头的学习版编一个功能比较齐全的电子钟程序。

目前还没有完工。发此贴以自勉。

欢迎前辈拍砖,欢迎新手共同讨论。

相关帖子

沙发
yumpie|  楼主 | 2011-9-7 22:42 | 只看该作者
设计目标:
1、准确计时并用数码管显示时间
2、按键依次显示年、月日、星期
3、闹钟功能
4、倒计时功能
5、秒表功能
6、手动控制打开/关闭继电器(闹钟和倒计时器可以定时开或关继电器)

使用特权

评论回复
板凳
yumpie|  楼主 | 2011-9-7 22:44 | 只看该作者
学习板硬件资源:
a) STC89C51单片机一片
b) 4位数码管一个
c) 按键开关4个(S1~S4)
d) LED灯8个
e) 蜂鸣器1个
f) 继电器1个

使用特权

评论回复
地板
yumpie|  楼主 | 2011-9-7 22:47 | 只看该作者
4位数码管为主要显示设备,用以实现以下显示功能:
 显示时间:前两位显示小时(24时制),后两位显示分钟,第二位点,作为秒点闪  烁。
 显示年:四位显示完整年份,范围从1901-2100年
 显示月日:前两位月份,后两位显示日,第二位点亮。
 显示星期:前三位显示“-”,最后一位显示星期的数字1~6,星期日显示“8”
 在秒表功能中显示时间:前三位为秒数,第三位显示小数点,最后一位显示小数点后一位。
 在倒计时功能中显示时间:前两位为分钟数,第二位显示秒点,后两位位显示秒。 在设置或功能选择时显示相应的功能项。

使用特权

评论回复
5
yumpie|  楼主 | 2011-9-7 22:58 | 只看该作者
本帖最后由 yumpie 于 2011-9-7 23:00 编辑

这是个电子钟程序,功能比较复杂。需要精确计时、数码管扫描显示、扫描键盘等操作。因此,采用计时器中断来计时,每10ms产生一个中断,为时间计数器加1。主程序循环检查时间计数器,当计数器数值大于100时,秒加1,计数器减100。这样通过中断能够严格产生10ms计数,即主循环检查计数器时数值大于100,也只会产生局部误差,不造成累计误差。以下给出了主程序流程:
void main()
{

init();
//初始化
while(1)
{

scanbtn();        //扫描键盘状态
updatetime();    //更新时间
showled();        //设置数码管显示内容
desplaynum();   //显示数码管
delay(3);          //延时,保证数码管显示效果
}}

使用特权

评论回复
6
a81716554| | 2011-9-7 23:25 | 只看该作者
哥们。你的成功了没有啊。我是新手想请教你呢

使用特权

评论回复
7
yumpie|  楼主 | 2011-9-7 23:42 | 只看该作者
本帖最后由 yumpie 于 2011-9-7 23:45 编辑

回4楼,现在刚刚实现日期时间的显示和调整。     
     现在编译完了已经快满了,恐怕很难实现所有的功能了,伤不起啊!!!
     哪位大侠有时间帮我看看如何简化啊,我可以Email代码。还没有完工就先不上传了。我会在后面的帖子中逐渐介绍我的思路及局部代码,等整个程序完成后上传代码。

ps:每小时只能发5个帖子,崩溃中。。。

使用特权

评论回复
8
gogogobomb| | 2011-9-8 09:08 | 只看该作者
楼主你很有前途啊,机电一体以后赚钱大大地!

使用特权

评论回复
9
yumpie|  楼主 | 2011-9-8 20:24 | 只看该作者
人气不旺啊 自己先顶下 过会更新

使用特权

评论回复
10
simgong| | 2011-9-8 22:49 | 只看该作者
顶起来

使用特权

评论回复
11
yumpie|  楼主 | 2011-9-8 22:58 | 只看该作者
我将程序分成了两个模块:系统模块和时钟应用模块

在系统模块中进行系统主循环,实现键盘扫描、计时、时间日期计算、数码管循环显示等功能。

时钟应用模块实现时钟显示、菜单操作、设置时间、设置闹钟、秒表等功能

这样在编写时钟应用模块时就不必考虑键盘、数码管显示、日期时间换算等底层工作,降低编程复杂度。

而且系统模块具有很大的可移植性,编写其他程序时只需根据需要增减系统模块的接口,即可方便的进行移植。

使用特权

评论回复
12
yumpie|  楼主 | 2011-9-8 23:05 | 只看该作者
本帖最后由 yumpie 于 2011-9-8 23:09 编辑

系统模块提供了数码管显示、按键被按下、按键被松开、半秒事件、每秒事件、两个软timer七个事件接口。

所谓事件接口,就是在事件发生时,系统模块调用应用模块中相应的函数。应用模块中必须有相应的函数存在,否则编译失败。

系统模块中定义了一些模块操作函数,供用户程序调用,如读取、设置时间、设置Timer等。

系统模块中定义了两个基本函数:
void initsys();   //系统初始化函数,必须在主程序中首先调用该函数,初始化系统。
void sys_main_loop(); //主循环调用函数,主程序中最后调用该函数,进入主循环,不再返回。

必须在用户程序主函数中被调用,否则无法实现系统功能。

应用模块程序主函数:
void main()
{
//主函数变量定义
//这里禁止写任何变量定义以外的代码!
initsys();  //系统初始化
//客户程序初始化,需要在主循环之前的东西一定要写在这里
//写在sys_main_loop();之后的东西将不会被执行
sys_main_loop();
//这里禁止写任何代码!
}

使用特权

评论回复
13
likeliao| | 2011-9-15 16:07 | 只看该作者
···真是怀念啊··
   我当初学单片机的时候也做个这个···
    现在回想起来感觉那个其实非常简单·虽然有点烦杂···

使用特权

评论回复
14
375606426d| | 2011-9-15 16:12 | 只看该作者
感觉楼主的思路挺清晰,学这个主要靠思路有了思路才会继续上升加油昂
顶你个肺:victory:

使用特权

评论回复
15
dengm| | 2011-9-16 17:18 | 只看该作者
把delay(3);  功能合并入      desplaynum();

使用特权

评论回复
16
Wwilliam| | 2011-9-16 20:14 | 只看该作者
我也在写,可不会在郭天祥的基础上扩展年月日和星期,求指点,学习中……

使用特权

评论回复
17
xd54622| | 2011-9-16 20:26 | 只看该作者
加油加油

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

44

帖子

1

粉丝