基于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.mzph.cn/news/846023.shtml

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

相关文章

计算机图形学入门04:视图变换

1.MVP变换 将虚拟场景中的模型投影到屏幕上&#xff0c;也就是二维平面上&#xff0c;需要分三个变换。 1.首先需要知道模型的位置&#xff0c;也就是前面提到的基本变换&#xff0c;像缩放、平移&#xff0c;旋转&#xff0c;也称为模型(Model)变换。 2.然后需要知道从…

归并排序C++代码详解,思路流程+代码注释,带你完全学会归并排序

归并排序 归并排序是一种经典的排序算法&#xff0c;属于分治算法的一种。其核心思想是将一个大问题分解成若干个较小的子问题来解决&#xff0c;然后根据子问题的解构建原问题的解。在排序问题中&#xff0c;归并排序将数组分成两半&#xff0c;分别对这两半进行排序&#xf…

车载软件架构 - AP AUTOSAR 设计思想及原理

车载软件架构 - AP AUTOSAR 设计思想及原理 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…

物联网实战--平台篇之(十一)设备管理后台

目录 一、设备数据库 二、添加设备 三、排序设备 四、重命名设备 五、删除设备 六、移动设备 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/categ…

港科夜闻 | 香港科大于首尔高峰论坛分享三十载发展里程,并与韩国知名机构学府加强交流...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大于首尔高峰论坛分享三十载发展里程&#xff0c;并与韩国知名机构学府加强交流。香港科大致力加强与韩国机构和产业的联系&#xff0c;大学高层管理人员于5月29-30日出席首尔一个备受瞩目的论坛&#xff0c;并与当…

Codeforces Round 949 (Div. 2 ABCD) 视频讲解

A. Turtle and Piggy Are Playing a Game Problem Statement Turtle and Piggy are playing a number game. First, Turtle will choose an integer x x x, such that l ≤ x ≤ r l \le x \le r l≤x≤r, where l , r l, r l,r are given. It’s also guaranteed that …

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

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

RabbitMQ延时队列

一、RabbitMQ下载并使用插件 1、查看RabbitMQ插件的文件路径 docker inspect rabbitmq 找到Mounts下面Name:rabbitmq_plugin的Source即为插件路径 使用 cd 进入到该目录 2、下载插件 wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download…

vue-el-steps 使用1(上一步、下一步)

vue代码 <template> <div class"app-container"> <el-steps :active"active" finish-status"success" simple style"margin-top: 20px"> <el-step title"选择分类"></el-step> <el-step t…

字典树,AcWing 5726. 连续子序列

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 5726. 连续子序列 - AcWing题库 二、解题报告 1、思路分析 字典树存储前缀和 考虑边遍历计算前缀和&#xff0c;边查询字典树 查询流程&#xff1a; 记当前前缀和为s 如果当前位k为1&#xff0c;那么s …

苹果电脑如何清理最近打开的文稿记录 Mac如何移除浏览痕迹保护隐私

日常使用苹果电脑的过程中&#xff0c;我们经常会打开各种文稿&#xff0c;浏览网页等操作。然而&#xff0c;这些操作可能会留下一些记录&#xff0c;涉及到个人隐私和数据安全问题。下面我们来看看苹果电脑如何清理最近打开的文稿记录&#xff0c;Mac如何移除浏览痕迹保护隐私…

C++进阶篇章:set与map(pair , multiset , multimap)

目录 1.关联式容器与序列式容器 2.pair&#xff08;键值对&#xff09; 3.set 构造函数 find函数 count函数&#xff1a; insert函数 4.multiset 5.map insert函数 operator[] 1.关联式容器与序列式容器 C中关联式容器与序列式容器是两种不同的容器 1.关联式容器 关…

力扣--双指针15.三数之和

详细思路 排序数组&#xff1a;首先对数组 nums 进行排序&#xff0c;目的是为了方便后续使用双指针查找和避免重复结果。遍历数组&#xff1a;使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素&#xff1a;如果当前元素 nums[i] 与前一个元素…

SpringBoot项目实现自定义注解方式的接口限流

一&#xff0c;实现原理 该限流方式使用的是令牌桶算法&#xff0c;令牌桶算法是基于漏桶算法的一种改进&#xff0c;主要在于令牌桶算法能够在限制服务调用的平均速率的同时&#xff0c;还能够允许一定程度内的突发调用。 系统以固定的速率向桶中添加令牌当有请求到来时&#…

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生&#xff0c;就是努力工作&#xff0c;买房&#xff0c;买车&#xff0c;送孩子上好的学校&#xff0c;为了孩子不要输在起跑线上&#xff0c;拼命报各种补习班等&#xff0c;这些都是普通人认为的主流价值观文化&#xff0c;也造就了一批批的赚钱机器&#xf…

带DSP音效处理D类数字功放TAS5805M中文资料

国产替代D类数字功放中文资料访问下方链接 ACM8628 241W立体声182W单通道数字功放中文寄存器表 内置DSP多种音频处理效果ACM8628M-241W立体声或182W单通道数字功放 1 特性 具有增强处理能力和低功率损耗的 TAS5805M 23W、无电感器、数字输入、立体声、闭环 D 类音频放大器 …

华为设备配置静态路由和默认路由

华为设备配置静态路由和默认路由 理论部分知识&#xff1a; 路由分为两个大类&#xff1a;静态路由-----动态路由 静态路由&#xff1a;手工指定&#xff0c;适用于小规模的网络应用场景&#xff0c;如果网络规模变大&#xff0c;这样的方式非常不适合而且容易出错。 语法&…

Java之IO流

一、引言 &#xff08;1&#xff09;解释&#xff1a; i&#xff1a;input &#xff08;输入&#xff09; o&#xff1a;output &#xff08;输出&#xff09; &#xff08;2&#xff09;图解 注意&#xff1a; 1、Xxx 这个程序一旦在桌面关闭掉了&#xff0c;也就是运行完…

动态路由OSPF单区域和多区域配置实验

动态路由OSPF的配置 OSPF分类两种情况&#xff1a;单区域 多区域路由 OSPF单区域路由配置 OSPF&#xff1a;开放最短路径优先的路由协议。属于大型动态路由协议&#xff0c;适用于中大型的园区网。 网络拓扑&#xff1a; 配置步骤&#xff1a; 1.完成基本配置&#xff08;略&…