找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16402|回复: 19
打印 上一主题 下一主题
收起左侧

基于51单片机的电子时钟设计论文与源码

  [复制链接]
跳转到指定楼层
楼主
ID:313242 发表于 2018-4-21 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘 要
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
单片机模块中最常见的是电子时钟,电子时钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
本课题主要研究的是基于单片机的电子时钟设计,采用AT89C51单片机作为系统的主控芯片,外接LED显示电路,按键电路,晶振电路,复位电路模块构成一个简单的电子时钟。通过按键电路能对时、分、秒分别进行设置和实时调整,并将结果显示在数码管上。
1



目 录

1 引 言              3
2 单片机介绍              4
3 电子时钟硬件设计              4
3.1系统方案的确定              4
3.2功能分析              4
3.3电子时钟设计原理              5
3.3.1键盘控制电路              5
3.3.2晶振电路              6
3.3.3复位电路              7
3.3.4数码显示电路              7
4.电子时钟的软件设计              8
4.1程序设计内容              8
4.2源程序              9

1



                                                                                                                     

1
在单片机技术日趋成熟的今天,其灵活的硬件电路和软件电路的设计,让单片机得到广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。基于单片机的定时和控制装置在许多行业有着广泛的应用,而电子时钟是其中最基本的,也是最具有代表性的一个例子[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. }
复制代码


完整的Word格式文档51黑下载地址:
基于51单片机的电子时钟设计.doc (136.5 KB, 下载次数: 199)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶6 踩
回复

使用道具 举报

沙发
ID:357979 发表于 2018-6-24 20:17 | 只看该作者
很好 很有用
回复

使用道具 举报

板凳
ID:360819 发表于 2018-6-28 10:05 | 只看该作者
非常有帮助
回复

使用道具 举报

地板
ID:409029 发表于 2018-10-13 14:34 | 只看该作者
很有帮助,非常感谢楼主!!!
回复

使用道具 举报

5#
ID:408168 发表于 2018-10-18 14:20 | 只看该作者

很有帮助,非常感谢楼主!!
回复

使用道具 举报

6#
ID:422939 发表于 2018-11-8 13:33 | 只看该作者
很好,很给力
回复

使用道具 举报

7#
ID:422939 发表于 2018-11-8 13:34 | 只看该作者
很好,很感谢楼主
回复

使用道具 举报

8#
ID:430837 发表于 2018-11-21 21:11 | 只看该作者
很感谢,感谢楼主
回复

使用道具 举报

9#
ID:430978 发表于 2018-11-22 09:32 | 只看该作者
非常有帮助,,谢谢大佬
回复

使用道具 举报

10#
ID:430837 发表于 2018-11-22 12:39 | 只看该作者
很感谢楼主
回复

使用道具 举报

11#
ID:434567 发表于 2018-11-27 21:49 | 只看该作者
很感谢大佬
回复

使用道具 举报

12#
ID:337883 发表于 2018-12-2 15:07 | 只看该作者
很有用感谢楼主
回复

使用道具 举报

13#
ID:438992 发表于 2018-12-4 09:54 来自手机 | 只看该作者
开封彭于晏 发表于 2018-11-22 12:39
很感谢楼主

能不能加我微信1974045913我有关于电子方面的问题,问一下你
回复

使用道具 举报

14#
ID:439767 发表于 2018-12-5 09:42 来自手机 | 只看该作者
感谢感谢
回复

使用道具 举报

15#
ID:454501 发表于 2018-12-25 16:44 | 只看该作者
有清晰的原理图吗
回复

使用道具 举报

16#
ID:530516 发表于 2019-5-9 18:59 | 只看该作者
虽然没有整点报时功能,但是简单的功能可以实现,给你点赞
回复

使用道具 举报

17#
ID:627964 发表于 2019-10-21 23:10 | 只看该作者
好用 给你点赞
回复

使用道具 举报

18#
ID:633645 发表于 2019-12-18 21:43 来自手机 | 只看该作者
如果再加个闹钟功能就好了
回复

使用道具 举报

19#
ID:772389 发表于 2020-6-8 08:39 | 只看该作者
很棒的程序啊解决了燃眉之急
回复

使用道具 举报

20#
ID:1082311 发表于 2023-6-7 10:08 来自手机 | 只看该作者
这个采用的仿真软件是什么版本
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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