提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 基本要求
  • 设计思路
  • 代码
  • 最终效果

基本要求

使用定时器/计数器实现电子钟,用LED数码管显示时、分、秒,24小时制,数码管上电初始显示为“12.00.00”,到24小时清零,然后反复,晶振11.0592MHz。理论误差小于0.1秒/天

扩展要求:简单的可调电子钟。增加“时增加”、“分增加”2个按键,按下“时增加”按键,时显示加1,加满24归零,按下“分增加”按键时,分显示加1,加满60归零。


设计思路

开启定时器中断,在定时器中断函数中设置时间变量,用于在main函数中计算小时, 分钟,秒。这里我采用的是定时器0的工作方式一,因为从定时,计数器产生中断请求到响应中断,需要3~8个机器周期。定时中断子程序中的数据人栈和重装定时,计数器的初值还需要占用数个机器周期。此外,从中断入口转到中断子程序也要占用一定的 机器周期。所以要在定时器中断中进行误差补偿,我开发板中用的是11.0592M的晶振, 那么一个机器周期为(1/11.0592M)*12,定时50ms为(50*10^-3)/机器周期=46080。可以 将TH0和TL0从产生溢出到被重新赋值的已有的计数值读出,并补偿到计数值初值中去,可以消除定时/计数器的定时误差。

先在定时器中断中禁止所有中断请求,关闭T0,即EA=0,TR0=0,将TL0中已计数 值写入修正变量fixtime,并加上修正操作所需的机器周期,经过仿真调试大概为10 个机器周期,即0x0A,所以fixtime=TL0+0x0A,再将fixtime赋给TL0,因为 (65536-46080)%256=0,所以新的TL0=0+fixtime,因为(65536-46080)/256=76=0x4C,且在 修正TL0时可能产生进位,要补偿到TH0,所以TH0=0x4C+(char)CY,CY为PSW寄存器中的进位标志位,之后再开启所有中断请求,开启T0,即EA=1,TR0=1。这样就完成了整个定时器误差补偿的过程。

利用数码管的动态扫描方式,将计算得出的时间分别给到给数码管显示数组中的常量表达式中,让数码管动态显示时间。

利用两个按键改变小时和分钟的数值,那么按键应进行消抖处理,且不能用while语句 进行按键释放处理,那样可能会导致数码管闪动。可以先定义一个有返回值的按键扫描 函数Key_Scan( ),让它返回按键值1或2,无按键按下则返回0。再定义一个按键处理 函数KEY_Handle( ),在函数中进行位运算,key_value用于记录按键 值,key_up用于记 录按键释放,key_down用于记录哪个按键按下,key_old用于记录上次的按键值,此函数可以实现“记忆”功能,即如果按键一直按着,也不会出现多次触发的现象,也解决了用while语句检测按键释放而导致数码管闪动的问题。再将此函数放入定时器1的中断处理函数中,进行每50ms一次的按键扫描,定时器1同样也进行误差补偿处理。

代码

代码如下:

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned intsbit dula = P2^6;
sbit wela = P2^7;
sbit key1 = P3^4;
sbit key2 = P3^5;uchar fixtime;    uint count_miao,count_fen0,count_fen1,count_shi,num_miao,num_fen,num_shi; uint ge,shi,bai,qian,wan,shiwan;uchar key_value,key_up,key_down,key_old;float number,uwTick,uwTick_KEY;uchar table[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};uchar table_dot[]=
{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1
};void delay(unsigned int x)
{unsigned int i,j;for(i=1;i>0;i--)for(j=x;j>0;j--);
}void clean()
{wela = 1;P0 = 0xff;wela = 0;dula = 1;P0 = 0x00;dula = 0;
}void dula_open()
{dula = 1;dula = 0;P0 = 0xff;
}void wela_open()
{wela = 1;wela = 0;delay(1);clean();
}void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge)
{P0 = table[shi];dula_open();P0 = 0xef;wela_open();P0 = table[ge];dula_open();P0 = 0xdf;wela_open();P0 = table[qian];dula_open();P0 = 0xfb;wela_open();P0 = table_dot[bai];dula_open();P0 = 0xf7;wela_open();P0 = table[shiwan];dula_open();P0 = 0xfe;wela_open();P0 = table_dot[wan];dula_open();P0 = 0xfd;wela_open();
}uchar key_scan()
{uchar key = 0;if(key1 == 0){return key = 1;}if(key2 == 0){return key = 2;}return key;
}void key_handle()
{key_value = key_scan();key_down  = key_value & (key_value ^ key_old);key_up    = ~key_value & (key_value ^ key_old);key_old   = key_value;if(key_down == 1){num_shi++;if(num_shi == 24)num_shi = 0;}if(key_down == 2){if(num_fen == 59){num_fen = 0;num_shi++;if(num_shi == 24)num_shi=0;}elsenum_fen++;}
}void T0_Handle_Program()
{if(count_miao == 20){count_miao = 0;num_miao++;if(num_miao == 60)num_miao = 0;}if(count_fen0 == 1200){count_fen0 = 0;num_fen++;if(num_fen == 60){num_fen=0;num_shi++;if(num_shi == 24)num_shi=0;}if(count_fen1 == 72000){num_fen=0;}}if(count_shi == 72000){count_shi = 0;num_shi++;if(num_shi == 24)num_shi = 0;        }}void main()
{TMOD = 0x11;TH0  = (65536-46080)/256;TL0  = (65536-46080)%256;TH1  = (65536-46080)/256;TL1  = (65536-46080)%256;EA   = 1;ET0  = 1;ET1  = 1;TR0  = 1;TR1  = 1;num_shi = 12;while(1){        shiwan = num_shi/10;wan        = num_shi%10;qian = num_fen/10;bai  = num_fen%10;shi = num_miao/10;ge  = num_miao%10;display(shiwan,wan,qian,bai,shi,ge);}}void T0_Handle() interrupt 1
{EA  = 0;TR0 = 0;fixtime = TL0+0x0A;TL0 = fixtime;TH0 = 0x4C+(char)CY;EA = 1;TR0 = 1;count_fen0++;count_fen1++;count_shi++;count_miao++;T0_Handle_Program();
}void T1_Handle() interrupt 3
{EA  = 0;TR1 = 0;fixtime = TL1+0x0A;TL1 = fixtime;TH1 = 0x4C+(char)CY;EA = 1;TR1 = 1;key_handle();}

最终效果

误差:

可以看到在调试中,1分钟内的误差为0,理论误差满足设计要求。

效果:

基于51单片机的高精度时钟设计相关推荐

  1. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  2. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  3. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  4. 毕业设计 - 基于51单片机的电子时钟设计与实现

    文章目录 单片机电子时钟程序设计 实现效果 最后 单片机电子时钟程序设计 共用体除非必要,否则学长不推荐使用,枚举的用法比较简单,在本书19章的项目实践中有很好的示例,这节课我们先来练习一下结构体的使 ...

  5. 基于51单片机的实时时钟设计

    功能: 通过8位数码管实现实时时钟,可以设置时间,切换显示模式,显示年月日,时分秒信息:可通过按键修改信息,增加.减少.确定.取消.上一个.下一个.切换模式.设置等功能. 时分秒 年月日: 部分程序: ...

  6. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  7. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  8. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...

  9. 51单片机8255扩展c语言,参阅:基于51单片机的实时时钟的设计与开发8255扩展io口1V0.1...

    <基于51单片机的实时时钟的设计与开发(8255扩展io口) (1).doc>由会员分享,可免费在线阅读全文,更多与<基于51单片机的实时时钟的设计与开发(8255扩展io口) (1 ...

最新文章

  1. 爆炸销毁动画组件Explosions
  2. Java Review - 并发编程_DelayQueue原理源码剖析
  3. python算法与数据结构-数据结构中二叉树的介绍
  4. oracle 挖掘日志,Oracle 日志挖掘(LogMiner)使用详解
  5. 不是每个人都适合linux
  6. Android之URL “page={page}category_id={***} string For dynamic query parameters use @Query.
  7. MATLAB字符串转换函数
  8. H3C服务器系统配置ip,H3C交换机DHCP 服务器动态分配地址典型配置指导
  9. Netty工作笔记0044---scheduledTaskQueue
  10. 返回目录中所有JPG图像的文件名列表
  11. Controller的生命周期是Transient还是PerWebRequest?
  12. 各种编程技术资料分享
  13. 强烈推荐收藏!3W 字Python 操作 Excel 报表自动化指南
  14. nginx配置-优化静态资源
  15. 什么样男人必出轨 震惊!出轨男子名字中居然都有这字
  16. Dubbo源码解析(九)Dubbo系列 源码总结+最近感悟
  17. ROS之msg文件定义以及自定义发布主题消息类型
  18. 徐家骏的华为十年:从DBA到副总裁的辛酸与喜悦[转载]
  19. mysql数据库之备份和恢复
  20. 很遗憾,你们的问题我无法回答--Leo谈应届生求职 10

热门文章

  1. 【ros】ROS架构
  2. opengl曲面贴图
  3. 商品SKU选择DEMO
  4. 【毕业设计_课程设计】基于mtcnn的实时高精度人脸检查算法实现
  5. Python基础之day06-面向对象基础1
  6. 【工程化】Android开发电脑中都装了哪些软件
  7. 如何用python画一条蟒蛇_Python之绘制蟒蛇
  8. [C语言编程练习][05]输入水的夸脱数,显示水的分子数量
  9. 解决加载NIDAQmx 报error 2019的Bug
  10. linux openssl安装路径,ubuntu 14.04下安装openssl