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

在单片机技术日趋成熟的今天,其灵活的硬件电路和软件电路的设计,让单片机得到广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。基于单片机的定时和控制装置在许多行业有着广泛的应用,而电子时钟是其中最基本的,也是最具有代表性的一个例子[1] ,用数字电路实现对时、分、秒数字显示的计时装置。因为机具有体积小、功耗低、功能强、性价比高、易于推广应用的优点,在自动化装置、智能仪器表、过程控制、通信、家用电器等许多领域得到日益广泛的应用[2],因此具有很大的研究价值。


 

2 单片机介绍

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统[3]。由于单片机的这种结构形式及它所采取的半导体工艺[4],使其具有很多显著的特点,因而在各个领域都得到了迅猛的发展。单片机主要有如下特点[5]:(1)性价比高;(2)集成度高、体积小、可靠性强。机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。另外,其体积小,对于强磁场环境易于采取屏蔽措施,适合在恶劣环境下工作;(3)控制功能强;(4)功耗小、电压低、便于生产的携式产品。;(5)外部总线采用串行总线连接,以此缩小了体积;(6)单片机的系统扩展和系统配置典型、规范,容易构成各种规模的应用系统。

3 电子时钟硬件设计3.1 系统方案的确定

硬件电路是一个系统的重要部分,在本次设计中主要是以AT89C51为核心控制器,外加一些控制电路来实现电子时钟的基本功能。单片机芯片作为控制系统的核心部件,它除了具备微机CPU的数值计算功能外,还具有灵活强大的控制功能,以便实时检测系统的输入量、控制系统的输出量,实现自动控制[6],外围控制电路主要包括晶振电路模块、复位电路模块、按键电路模块以及数码管显示电路模块,通过这些控制电路的连接构成完整的电路,其结构框图如图1所示。

图1 电子时钟系统结构图

3.2功能分析

1.准确计时,以数字形式显示时、分、秒的时间;2. 小时的计时为24小时制,分和秒的计时要求为60进位;3. 八位数码管 显示HH-MM-SS(时分秒),按键“模式键”依次选择调整“时”,“分”,“秒”, 按键“加键”依次加1,按键“减键”依次减1 ;4.晶振电路起到减小误差,提高精确度的作用;5.复位电路是对单片机的初始化操作。

3.3电子时钟设计原理

电子时钟的实现一般有两种方法:其一是直接用单片机的定时计数器产生固定时间,这种方法的优点是可以省去一些外围的芯片,其缺点是只能适用于一些要求不是十分精确、不作长期保留的场合;而对于要求较高的场合,则必须选用专用的芯片[7],本设计采用的是第一种方法。
直接用单片机的定时计数器产生固定时间,这种方法的工作原理是利用单片机芯片的定时器产生固定时间,模拟时钟的时、分、秒。基于这一原理构成的电子时钟系统主要由以下几部分组成:89C51单片机控制器电路,按键开关电路,8位数码管显示电路,复位电路,晶振电路五部分构成。其工作原理电路图如图2所示。

图2  电子时钟设计原理图

3.3.1键盘控制电路

电子时钟最基本的功能除了能正常显示时间外,还需要对时间进行设置和调整,所以要配以相应的键盘控制电路。该设计的键盘控制电路主要包括8个按键: P1.0控制系统时间暂停,P1.4控制系统时间继续;P1.1、P1.2、P1.3作为增加时分秒调整时按键,P1.5、P1.6、P1.7作为增加时分秒调整时按键。键盘控制电路的硬件连接图如图3所示。

         图3 键盘控制电路

3.3.2晶振电路

晶振的全称叫晶体振荡器,它在单片机系统里作用非常大,主要作用是产生单片机所需的时钟频率,单片机执行程序所需的时间完全取决于单片机晶振所提供的时钟频率,时钟频率越高,那么单片机运行速度就越快[8]。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。晶振电路如图4所示。

图4 晶振电路

3.3.3复位电路

复位是单片机的初始化操作。单片机启动运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。 当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作:07H写入堆栈指针SP,P0口—P3口均置1,程序计数器PC和其他特殊功能寄存器SFR全部清零。只要RST持续为高电平,单片机就处于循环复位状态[9]。
单片机的复位方式有上电自动复位和手工复位两种,本设计采用的是手动复位方式,其电路图如图5所示。

             图5 复位电路

3.3.4数码显示电路

发光二极管显示器驱动(点亮)的方法有两种。一种是静态驱动法,即给欲点亮的LED通以恒定的定流。这种驱动方法要有寄存器,译码器,驱动电路等逻辑部件。当需要显示的位数增加时,所需的逻辑部件及连线也相应增加,成本也增加。另一种是动态驱动方法,这种方法是给欲点亮的LED通过通以电流,此时LED的亮度是通断的平均亮度。为保证亮度,通过LED的脉冲电流应数倍于其额定电流值。利用动态驱动法可以减少需要的逻辑部件和连线,单片机应用系统中常采用动态驱动法[10]。数码管有两种接法即共阳极接法和共阴极接法。所谓共阳共阴,是针对数码管的公共脚而言的。一个1位典型的数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。共阳指的是公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合形成我们看到的数字或字母。共阴刚好相反,也就是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮,本次设计选择共阴极数码管,其中有6位显示“时”,“分”,“秒”,剩下两位显示“—”数码管A~DP接单片机P0端口用于段选,1~9接单片机P2端口用于位选。各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极,为了防止驱动数码管电流过大而损坏,各端口接1K电阻。8位共阴极LED数码显示电路如图6所示。

                    图6 八位8段共阴极LED数码显示

4.电子时钟的软件设计4.1程序设计内容

单片机软件设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。设计步骤如下所示。
1. 采用模块化程序结构设计软件,首先将整个软件分成若干功能模块;
2. 根据流程图,编写源程序;
3. 上机调试各模块程序;
4. 与硬件一起联调,最后完成全部调试工作。

4.2源程序

  1. #include<reg52.h>
  2. /*共阴数码管编码*/
  3. unsigned char code tab1[]={
  4. 0x3f,0x06,0x5b,0x4f,0x66,
  5. 0x6d,0x7d,0x07,0x7f,0x6f};
  6. /*共阳数码管编码
  7. unsigned char code tab1[]={
  8. 0xc0,0xf9,0xa4,0xb0,
  9. 0x99,0x92,0x82,0xf8,
  10. 0x80,0x90,0x88,0x83,
  11. 0xc6,0xa1,0x86,0x8e};
  12. */
  13. /*位选编码*/
  14. unsigned char code tab2[]={            
  15. 0xfe,0xfd,0xfb,0xf7,
  16. 0xef,0xdf,0xbf,0x7f};
  17. sbit duanxuan=P1^0;
  18. /*按键位定义*/
  19. sbit key0=P1^0;
  20. sbit key1=P1^1;
  21. sbit key2=P1^2;
  22. sbit key3=P1^3;
  23. sbit key4=P1^4;
  24. sbit key5=P1^5;
  25. sbit key6=P1^6;
  26. sbit key7=P1^7;
  27. /*秒、分、时的初始化*/
  28. unsigned char tt=0;
  29. unsigned char miao=0;
  30. unsigned char fen=0;
  31. unsigned char shi=0;
  32. /*延时函数*/
  33. void delay(unsigned char t)
  34. {
  35.               unsigned i;
  36.               while(t--)
  37.               for(i=0;i<75;i++);
  38. }
  39. /*定时器0初始化函数*/
  40. void chushihua()
  41. {            
  42.               TMOD=0x01;
  43.               EA=1;
  44.               ET0=1;
  45.               TH0=(65535-50000)/256;
  46.               TL0=(65535-50000)%256;
  47.               TR0=1;
  48. }
  49. /*时分秒处理函数*/
  50. void timedeal()
  51. {
  52.               if(miao==60)
  53.               {
  54.                             miao=0;
  55.                             fen++;
  56.                             if(fen==60)
  57.                             {
  58.                                           fen=0;
  59.                                           shi++;
  60.                                           if(shi==24)
  61.                                           {
  62.                                                         shi=0;
  63.                                           }
  64.                             }
  65.               }
  66. }
  67. /*显示函数*/
  68. void display()
  69. {            
  70.               P2=tab2[0];
  71.               P0=tab1[miao%10];
  72.               delay(1);
  73.               P0=0x00;//消影
  74.               P2=tab2[1];
  75.               P0=tab1[miao/10];
  76.               delay(1);
  77.               P0=0x00;//消影
  78.               P2=tab2[2];
  79.               P0=0x40;
  80.               delay(1);
  81.               P0=0x00;//消影
  82.               P2=tab2[3];
  83.               P0=tab1[fen%10];
  84.               delay(1);
  85.               P0=0x00;//消影
  86.               P2=tab2[4];
  87.               P0=tab1[fen/10];
  88.               delay(1);
  89.               P0=0x00;//消影
  90.               P2=tab2[5];
  91.               P0=0x40;
  92.               delay(1);
  93.               P0=0x00;//消影
  94.               P2=tab2[6];
  95.               P0=tab1[shi%10];
  96.               delay(1);
  97.               P0=0x00;//消影
  98.               P2=tab2[7];
  99.               P0=tab1[shi/10];
  100.               delay(1);
  101.               P0=0x00;//消影
  102. }
  103. /*按键设定函数*/
  104. void sheding()
  105. {
  106.               if(key0==0)
  107.               {
  108.                             delay(10);
  109.                             if(key0==0)
  110.                             {
  111.                                           EA=0;                           
  112.                             }                                         
  113.               }
  114.               if(key1==0)
  115.               {
  116.                             delay(10);
  117.                             if(key1==0)
  118.                             {
  119.                                           miao++;
  120.                                           if(miao==60)
  121.                                           miao=0;
  122.                                           while(!key1);
  123.                             }                                         
  124.               }
  125.               if(key2==0)
  126.               {
  127.                             delay(10);
  128.                             if(key2==0)
  129.                             {
  130.                                           fen++;
  131.                                           if(fen==60)
  132.                                           fen=0;
  133.                                           while(!key2);
  134.                             }                                         
  135.               }
  136.               if(key3==0)
  137.               {
  138.                             delay(10);
  139.                             if(key3==0)
  140.                             {
  141.                                           shi++;
  142.                                           if(shi==24)
  143.                                           shi=0;
  144.                                           while(!key3);
  145.                             }                                         
  146.               }
  147.               if(key5==0)
  148.               {
  149.                             delay(10);
  150.                             if(key5==0)
  151.                             {
  152.                                           miao--;
  153.                                           if(miao==0)
  154.                                           miao=59;
  155.                                           while(!key5);
  156.                             }                                         
  157.               }
  158.               if(key6==0)
  159.               {
  160.                             delay(10);
  161.                             if(key6==0)
  162.                             {
  163.                                           fen--;
  164.                                           if(fen==0)
  165.                                           fen=59;
  166.                                           while(!key6);
  167.                             }                                         
  168.               }
  169.               if(key7==0)
  170.               {
  171.                             delay(10);
  172.                             if(key7==0)
  173.                             {
  174.                                           shi--;
  175.                                           if(shi==0)
  176.                                           shi=23;
  177.                                           while(!key7);
  178.                             }                                         
  179.               }
  180.               if(key4==0)
  181.               {
  182.                             delay(10);
  183.                             if(key4==0)
  184.                             {
  185.                                           EA=1;
  186.                             }                                         
  187.               }
  188. }
  189. /*主函数*/
  190. void main()
  191. {
  192.               chushihua();
  193.               while(1)
  194.               {
  195.                             sheding();
  196.                             timedeal();
  197.                             display();
  198.               }                                         
  199. }
  200. /*定时器0中断函数*/
  201. void time0() interrupt 1
  202. {
  203.               TH0=(65535-50000)/256;
  204.               TL0=(65535-50000)%256;
  205.               tt++;
  206.               if(tt==20)
  207.               {
  208.                             tt=0;
  209.                             miao++;
  210.               }
  211. }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/338060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 的 GPT-4o 是目前最先进的人工智能模型!如何在工作或日常生活中高效利用它?

OpenAI 的 GPT-4o 是目前最先进的人工智能模型&#xff01;如何在工作或日常生活中高效利用它&#xff1f; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大…

oracle 12c DB卸载流程

1.运行卸载程序 [rootprimary1 ~]# su - oracle [oracleprimary1 ~]$ cd $ORACLE_HOME/deinstall [oracleprimary1 deinstall]$ ./deinstall Checking for required files and bootstrapping ... Please wait ... 这里选择3 、回车、y、y、回车、ASM 这里输入y 2.删除相关目录…

C# TcpClient

TcpClient 自己封装的话&#xff0c;还是比较麻烦的&#xff0c;可以基于线程&#xff0c;也可以基于异步写&#xff0c;最好的办法是网上找个插件&#xff0c;我发现一个插件还是非常好用的&#xff1a;STTech.BytesIO.Tcp 下面是这个插件作者的帖子&#xff0c;有兴趣的可以…

迅为RK3562开发板专为3562编写10大分类2900+页文档

iTOP-3562开发板采用瑞芯微RK3562处理器&#xff0c;内部集成了四核A53Mali G52架构&#xff0c;主频2GHZ&#xff0c;内置1TOPSNPU算力&#xff0c;RK809动态调频。支持OpenGLES1.1/2.0/3.2、0penCL2.0、Vulkan 1.1内嵌高性能2D加速硬件。 内置独立NPU, 算力达 1TOPS,可用于轻…

软件架构设计属性之5:可维护性属性分析与应用

文章目录 引言一、可维护性定义和重要性1.1 定义1.2 重要性 二、可维护性关键要素2.1 模块化2.2 单一职责2.3 低耦合2.4 高内聚2.5 抽象和封装2.6 实践建议 三、设计原则3.1 开闭原则3.2 依赖倒置原则3.3 评估方法3.4 挑战与解决方案 四、实战应用总结 引言 在当今数字化飞速发…

一篇文章讲透数据结构之树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

MySQL--主从复制

目录 一、主从复制原理 1.简要原理 2.涉及到的文件 3.涉及到的线程 4.主从复制执行步骤&#xff08;重点&#xff09; 二、主从复制搭建 1.准备两台以上的数据库实例&#xff0c;要求数据库版本一致 2.区分不同角色 3.主库开启二进制日志 4.主库创建专用复制用户&…

文件IO(三)

文件IO&#xff08;三&#xff09; 左移右移Linux的man 手册文件IO打开文件操作文件关闭文件 caps lock开灯关灯读取按键文件IO操作目录文件打开目录文件操作目录文件 库动态库和静态库的优缺点创建静态库创建动态库 按下右ctrl键 亮灭灯 左移右移 Linux的man 手册 文件IO 打开…

【计算机毕设】基于SpringBoot的教师工作量管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 随着高校规模的扩大和教学任务的增加&#xff0c;教师的工作量管理变得越来越复杂和重要。传统的教师工作量管理方式效率低下&#xff0c;容易出错&…

真机调试 Error:系统错误,xxx exceed max limit 2MB

我们在使用微信开发者工具开发小程序、小游戏等应用时&#xff0c;往往会点击“真机调试”&#xff0c;微信扫描查看真实情况。 但是会出现下面的报错提示&#xff0c;是因为主包体积超过了2MB。 小程序有体积和资源加载限制&#xff0c;在微信小程序中&#xff0c;每个包不能…

Java事务入门:从基础概念到初步实践

Java事务入门&#xff1a;从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务&#xff1f;1.2 为什么需要事务&#xff1f; 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…

【图解IO与Netty系列】Reactor模型

Reactor模型 Reactor模型简介三类事件与三类角色Reactor模型整体流程 各种Reactor模型单Reactor单线程模型单Reactor多线程模型主从Reactor模型 Reactor模型简介 Reactor模型是服务器端用于处理高并发网络IO请求的编程模型&#xff0c;与传统的一请求一线程的同步式编程模型不…

ssm汉服文化平台网站

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【NumPy】深入了解NumPy的multiply函数:高效矩阵和数组乘法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

区块链合约开发流程

区块链合约开发&#xff0c;尤其是以太坊智能合约开发&#xff0c;是一个多步骤的过程&#xff0c;从需求分析到部署和维护&#xff0c;每一步都需要仔细规划和执行。以下是详细的开发流程。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions

NextJs 数据篇 - 数据获取 | 缓存 | Server Actions 前言一. 数据获取 fetch1.1 缓存 caching① 服务端组件使用fetch② 路由处理器 GET 请求使用fetch 1.2 重新验证 revalidating① 基于时间的重新验证② 按需重新验证revalidatePathrevalidateTag 1.3 缓存的退出方式 二. Ser…

Window下VS2019编译WebRTC通关版

这段时间需要实现这样一个功能&#xff0c;使用WebRTC实现语音通话功能&#xff0c;第一步要做的事情就是编译WebRTC源码&#xff0c;也是很多码友会遇到的问题。 经过我很多天的踩坑终于踩出来一条通往胜利的大路&#xff0c;下面就为大家详细介绍&#xff0c;编译步骤以及踩…

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种&#xff0c;如果是切换 Hash 的方式&#xff0c;那么依靠浏览器 Hash 变化即可&#xff1b;如果是切换网址中的 Path&#xff0c;就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时&#xff0c;还需要在…

【基本数据结构】平衡二叉树

文章目录 前言平衡二叉树1 简介2 旋转2.1 左旋2.2 右旋2.3 何时旋转 3 插入节点4 删除节点5 代码 参考资料写在最后 前言 本系列专注更新基本数据结构&#xff0c;现有以下文章&#xff1a; 【算法与数据结构】数组. 【算法与数据结构】链表. 【算法与数据结构】哈希表. 【…

前端Vue小兔鲜儿电商项目实战Day06

一、本地购物车 - 列表购物车 1. 基础内容渲染 ①准备模板 - src/views/cartList/index.vue <script setup> const cartList [] </script><template><div class"xtx-cart-page"><div class"container m-top-20"><div…