找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16291|回复: 25
收起左侧

使用C语言进行单片机电子时钟设计(仿真+源码+文档全套资料下载)

  [复制链接]
ID:437721 发表于 2018-12-2 15:57 | 显示全部楼层 |阅读模式
0.png

单片微型计算机简称单片机,又称为微控制器,是将CPU、RAM、ROM、定时/计数器、I/O接口电路集成到一块电路芯片上构成的微型计算机。本次设计的系统由单片机系统、数码管显示系统、键盘、蜂鸣器等组成,通过按键来控制单片机实现数字时钟的时、分、秒显示,12、24制转换,设定时间、闹钟等不同功能,并通过P0口的输出在LED上显示。该设计具有结构简单、使用方便等特点。

目录
第一章 设计目的及要求
1.目的
2.题目与要求
第二章 理论基础
1.AT89C52芯片
2.Keil的简单介绍
3.Protues的简单介绍
第三章 设计原理以及方案
1.系统总体框图
2.硬件电路
2.1晶振电路
2.2复位电路
2.3蜂鸣器电路
2.4数码管显示电路
2.5键盘电路
2.6总体电路
3.软件系统设计
3.1单片机的使用情况
3.2软件系统的各个模块
3.3软件系统程序流图
第四章 仿真结果与分析
1.仿真结果
2.仿真结果分析
第五章 总结
参考文献
附录:
程序清单
PCB原理图

第一章 设计目的及要求

1.目的

通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,蜂鸣器的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。
2.题目与要求

本次课程设计的题目为:电子时钟的设计,其具体要求为:
(1)能实现时、分、秒的显示;
(2)能实现12、24小时制的切换;
(3)能设定时间;
(4)能设定闹钟;
整个系统要设计键盘和显示器,利用单片机内部时钟完成定时器的定时设计。

第二章 理论基础
1.AT89C52芯片
AT89C52芯片的引脚图如图1所示。
图1 AT89C52芯片引脚
其中主要应用到的引脚口介绍:
(1)P0口的第一功能是作为一般I/O口使用,第二功能是在CPU访问外部存储器时,分时提供低8位地址和8位双向数据。
(2)P1口是8位准双向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引脚还具有第二功能。
(3)P2口是8位准双向I/O口,第二功能是在CPU访问外部存储器时,作为高8位地址总线,输出高8位地址。
(4)P3口是8位准双向I/O口,其第一功能是用作一般I/O口,第二功能是作为中断信号和外部数据存储器的读写控制信号。
(5)RES,复位信号高电平有效。
2.Keil的简单介绍
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。此处简单介绍一下Keil 工程的建立等,以Keil μVision2界面为例。
(1)建立一个工程,选择菜单栏中的【Project】下的【New Project】,菜单栏如图2所示。
图2 菜单栏
(2)选择工程要保存的路径并且输入工程名,以电子时钟工程的建立为例,如图3所示。
图3 “保存新工程”对话框
(3)选择系统要用的单片机如图4(a)所示,选择添加启动文件如图4(b)所示。
图4(a)“选择单片机”对话框
图4(b)“添加启动文件”对话框
(4)建立文件,选择菜单【File】下的【New】,出现界面如图5所示。
图5 新建文件界面
(5)保存文件为“*.c”文件,并且添加文件到所建的工程下,保存文件截面图如图6所示,添加文件显示界面如图7所示,右键点击SourceGroup添加。
图6 保存文件界面
图7 添加文件界面
3.Protues的简单介绍
Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件,它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具,可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
(1)Keil中生成*.HEX的界面如图8所示。
图8 生成HEX文件界面
(2)Protues中加载HEX文件,在Protues界面中双击AT89C51芯片,所示界面如图9所示。
              图9 加载HEX文件界面
第三章 设计原理以及方案
1.系统总体框图
本电子时钟主要由单片机、键盘、数码管显示接口电路、蜂鸣器电路和复位电路构成,设计的总体方案如图10所示:
图10 总体方案
2.硬件电路
2.1晶振电路
晶振电路如图11所示。
图11 晶振电路
2.2复位电路
复位电路如图12所示。
图12 复位电路
2.3蜂鸣器电路
蜂鸣器电路如图13所示。
图13 蜂鸣器电路
2.4数码管显示电路
数码管显示电路如图14所示。
图14 数码管显示电路
2.5键盘电路
键盘电路如图15所示。
图15 键盘电路
2.6总体电路
在Protues中仿真的总体电路图如图16所示。
图16 总体电路
3.软件系统设计
3.1单片机的使用情况
设计电子时钟使用单片机资源的情况如下:
P0口输出数码管段选信号,P2口输出数码管位选信号;调整功能选择键kgnxz:P3.0口,通过其选择调整时钟还是调整闹钟;调整秒 ksec:P3.1口,按一次使秒加1;调整分kmin:P3.2;按一次使分加1;调整小时khour:P3.3口,按一次使时加1;12与24小时制的转换键kzh:P3.4,默认24小时制,按一次键之后转换为12小时制。具体如下:
(1)实现基本的走时间和显示时间的时、分、秒,上电自动显示初始时间00-00-00。
(2)当第一次按下第一个弹性按键时进入时间的调节状态,按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。
(3)当第二次按下第一个弹性按键时进入闹钟的调节状态(闹钟初始值设定为01-00-30),按下第二个按键时实现秒的加一调节,按下第三个按键时实现分的加一调节,按下第四个按键时实现小时的加一调节。
(4)当第三次按下第一个弹性按键时进入原显示时间的状态。
(5)按下第五个按键时实现24到12小时制的转换。
(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态。
3.2软件系统的各个模块
时钟系统的软件设计主要采用以下基本模块来实现,主程序、定时中断服务程序、键盘扫描程序模块、时钟显示模块、闹钟显示模块、转换模块、延时模块和蜂鸣器模块。
主程序:对中断程序初值进行设定,在各种情况下对子函数的调用,保证整个程序的顺序执行。
定时中断服务程序:用于电子时钟的准确运行。
键盘扫描程序模块:用于确定按键并在按键按下时调用相应的程序进行显示。
时钟显示模块:用于显示正常走表的时间。
闹钟显示模块:用于显示设定闹钟的时间。
转换模块:用于将默认的24小时制转换为12小时制。
延时模块:程序中调用延时子程序,用于按键消抖动,数码管消影等。
蜂鸣器模块:用于在设定的闹钟时间与走表的时间相等时,闹钟响起。
3.3软件系统程序流图
主程序的顺序流图如图17所示。
图17 主程序顺序流图
显示程序的顺序流图如图18所示。
图18 显示程序顺序流图
中断程序的顺序流图如图19所示。
图19 中断程序顺序流
第四章 仿真结果与分析
1.仿真结果
上电走表仿真结果图如图20所示。
图20 上电之后走表仿真结果图
按下一次kgnxz键,再分别调整时、分、秒各按键,使得显示时间为15-15-15仿真结果图如图21所示。
图21 调整时分秒仿真结果图
按下kzh键,使得显示时间为03-15-19仿真结果图如图22所示。
图22 24小时制转换为12小时制仿真结果图
按下第二次kgnxz键,再分别调整时、分、秒各按键,即调整的便是闹钟的设定时间(初始设定为01-00-30),仿真结果图如图23所示。
图23 闹钟显示仿真结果图
调整闹钟的设定时间为03-20-30,仿真结果图如图24所示。
图24 闹钟调整显示仿真结果图
按下第三次kgnxz键时,显示走表的时间,并且在到达设定的闹钟时间时蜂鸣器发出声音,即在蜂鸣器发声过程中P1.0口会由原高电平变为低电平,仿真结果图如图25所示。
图25 蜂鸣器发声仿真图
2.仿真结果分析
让手机中的秒表与Protues仿真中的秒同时开始,可以发现他们几乎是同步的(由于个人反应导致按下手机秒表瞬间有微小误差)。而闹钟设定值是完全没有误差的,当时间与设定闹钟时间完全相等时蜂鸣器就会发声。
第五章 总结
本次课程设计利用Keil以及Protues软件,完成了电子时钟系统的程序编写与电路图搭建,并对所设计的电子时钟系统进行了仿真测试。
完成本次课程设计的过程,经历了兴奋、自信、失落、奋发、所悟、完成几个过程。刚开始做课程设计时,仔细阅读设计的题目和要求,想到理论课学得也还差不多,以为没什么太大困难,所用的知识书上都有,各部分程序大都可以参考课本例题完成。开始前两天我就熟悉课本,参考课本内容在稿纸上把自己的思路和各部分程序写了下来,然后就是衔接起来在Keil中编写。经过三天的努力,毫无结果。埋头苦干的过程是痛苦的,尤其是在按自己觉得理论上合理的算法和程序做完,发现根本显示不了的时候,是迷茫,烦躁的。在第三天下午参考别人只是显示出来走表就可以的程序,并且接受别人建议按一步一步调试去编写的情况下,编写运行找错地不断循环中,终于在第五天完善了程序。
通过这次课程设计,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。学习理论课时也是有实践课的,但当时自己只是追求明白课本例题的程序,几乎很少在Protues上去画例题中的仿真图,导致自己对Protues的应用不熟悉,而且也没深入想过课本上那些小的程序之间的联系应用。所以学习知识不能太局限于理论,要与实践结合。学会了单片机的一般设计过程,通常都要进行系统扩展与配置,因此,要完成一个单片机的设计工作,必须依次做到下述工作:
  • 硬件电路的设计、组装与调试;
  • 应用软件的编写、调试;
  • 完整应用软件的调试、固化和脱机运行。
而在进行硬件系统设计时我们应当尽量做到:
  • 尽可能的选择典型电路,并符合单片机的常规使用方法;
  • 在充分满足系统功能要求前提下,留余地以便于二次开发;
  • 硬件结构设计应与软件设计方案一并考虑;
  • 整个系统相关器件要力求性能的匹配;
  • 硬件上要有可靠性与抗干扰设计;
  • 充分考虑单片机的带载驱动能力。
所以我用单片机编写了上面的程序,因为基础知识学的不怎么好,如有错误之处,还望老师理解,并加以批改。通过这次设计使我对单片机有了更深入的了解。培养了我的动手实践能力。


PCB原理图

单片机源程序如下:


  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<absacc.h>
  4. sbit kgnxz=P3^0; //功能选择键,按一次设定时间,按两次设定闹钟时间,按三次又显示时间表  
  5. sbit ksec=P3^1;//调整秒
  6. sbit kmin=P3^2;//调整分
  7. sbit khour=P3^3;//调整时
  8. sbit kzh=P3^4;//24与12小时制转换
  9. sbit bear=P1^0;//蜂鸣器控制口
  10. unsigned char secshi=0,secge=0,minshi=0,minge=0,hourshi=0,hourge=0,flag=0,//flag是按键的计数
  11.                secshi1=0,secge1=0,minshi1=0,minge1=0,hourshi1=0,hourge1=0;//定义存储时间和闹钟时分秒的个位和十位
  12. unsigned int num=0,sec=0,min=0,hour=0,sec1=30,min1=0,hour1=1, num1=0;//定义时间和闹钟的时分秒
  13. unsigned char code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段控口
  14. void keyscan();//键盘扫描函数
  15. void display();//时钟显示函数
  16. void display1();//闹钟显示函数
  17. void clock();//闹钟函数即蜂鸣器函数
  18. /***延时函数****/
  19. void delay(unsigned char z)
  20. {unsigned char x,y;
  21.   for(x=z;x>0;x--)
  22.    for(y=255;y>0;y--);
  23. }
  24. /***中断函数****/
  25. void time0() interrupt 1
  26. {num++;
  27. TH0=(65536-50000)/256;
  28. TL0=(65536-50000)%256;
  29. if(num==20)
  30.    {num=0;
  31.     sec++;
  32.     if(sec==60)
  33.      {sec=0;
  34.       min++;
  35.       if(min==60)
  36.         {min=0;
  37.          hour++;
  38.          if(hour==24)
  39.            {hour=0;
  40.             }
  41.          }
  42.       }
  43.   display(); }
  44. }
  45. /******时钟显示函数******/
  46. void display()
  47. {
  48. secge=sec%10;
  49. secshi=sec/10;
  50. minge=min%10;
  51. minshi=min/10;
  52. hourge=hour%10;
  53. hourshi=hour/10;
  54. P2=0xfe;
  55. P0=table[secge];
  56. delay(5);
  57. P2=0xfd;
  58. P0=table[secshi];
  59. delay(5);
  60. P2=0xfb;
  61. P0=0x40;
  62. delay(5);
  63. P2=0xf7;
  64. P0=table[minge];
  65. delay(5);
  66. P2=0xef;
  67. P0=table[minshi];
  68. delay(5);
  69. P2=0xdf;
  70. P0=0x40;
  71. delay(5);
  72. P2=0xbf;
  73. P0=table[hourge];
  74. delay(5);
  75. P2=0x7f;
  76. P0=table[hourshi];
  77. delay(5);
  78. }
  79. /*****闹钟显示函数****/
  80. void display1()
  81. {
  82. secge1=sec1%10;
  83. secshi1=sec1/10;
  84. minge1=min1%10;
  85. minshi1=min1/10;
  86. hourge1=hour1%10;
  87. hourshi1=hour1/10;
  88. P2=0xfe;
  89. P0=table[secge1];
  90. delay(10);
  91. P2=0xfd;
  92. P0=table[secshi1];
  93. delay(15);
  94. P2=0xfb;
  95. P0=0x40;
  96. delay(15);
  97. P2=0xf7;
  98. P0=table[minge1];
  99. delay(15);
  100. P2=0xef;
  101. P0=table[minshi1];
  102. delay(15);
  103. P2=0xdf;
  104. P0=0x40;
  105. delay(15);
  106. P2=0xbf;
  107. P0=table[hourge1];
  108. delay(15);
  109. P2=0x7f;
  110. P0=table[hourshi1];
  111. delay(15);
  112. }
  113. /*****键盘扫描*********/
  114. void keyscan()
  115. {if(kgnxz==0)     //功能选择键是否按下
  116.     {  delay(10);//延时消抖            
  117.         if(kgnxz==0)//再次判断键是否按下              
  118.           {flag++;}        //计数,功能选择键按键次数加一         
  119.           while(!kgnxz);} //释放键  
  120.    if(flag==1)//功能选择键
  121.    {if(ksec==0)//秒调整键
  122.    {delay(10);//延时消抖        
  123.     if(ksec==0)//再次判断键是否按下
  124.       {sec++;//秒加加
  125.        if(sec>=60)//如果秒大于60
  126.        sec=0;//秒清零
  127.        }
  128.   while(ksec==0)//释放键
  129.   display();}
  130.   if(kmin==0)
  131.     {delay(10);
  132.      if(kmin==0)
  133.        {min++;
  134.         if(min>=60)
  135.         min=0;
  136.         }
  137.   while(kmin==0)
  138.   display();
  139.      }
  140.   if(khour==0)
  141.     {delay(10);
  142.      if(khour==0)
  143.        {hour++;
  144.         if(hour==24)
  145.         hour=0;
  146.         }
  147.   while(khour==0)
  148.   display();
  149.   }
  150. }
  151. if(flag==2)//闹钟调整
  152.      {if(ksec==0)
  153.         {delay(5);
  154.          if(ksec==0)
  155.           {sec1++;
  156.           if(sec1==60)
  157.            sec1=0;}
  158.            while(!ksec)
  159.            {display1();delay(50);}                  
  160.              }
  161.           if(kmin==0)
  162.          {delay(5);
  163.            if(kmin==0)
  164.              {min1++;
  165.              if(min1==60)
  166.                min1=0;}
  167.            while(!kmin)
  168.                    {display1();}
  169.                  }
  170.        if(khour==0)
  171.          {delay(5);
  172.             if(khour==0)
  173.              {hour1++;
  174.              if(hour1==24)
  175.               hour1=0;}
  176.              while(!khour)
  177.              {display1();} } }}
  178. /*****蜂鸣器*********/
  179. void clock()
  180.    {    unsigned int i;
  181.        for(i=1000;i>0;i--)
  182.         {bear=1;
  183.                 P1=0xfe;
  184.                 delay(10);
  185.                 bear=0;
  186.                 P1=0xff;
  187. ……………………

  188. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载(由于我初学,程序还存在一些bug,欢迎大家指正,一起学习研究):
单片机电子时钟.rar (1.47 MB, 下载次数: 618)

评分

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

查看全部评分

回复

使用道具 举报

ID:437803 发表于 2018-12-3 09:15 | 显示全部楼层
感谢分享 非常喜欢
回复

使用道具 举报

ID:424947 发表于 2018-12-8 15:54 | 显示全部楼层
好强啊,向你学习
回复

使用道具 举报

ID:241454 发表于 2018-12-9 12:57 | 显示全部楼层
下载后没有原理图
回复

使用道具 举报

ID:443378 发表于 2018-12-10 16:58 | 显示全部楼层
非常棒的帖子 点赞
回复

使用道具 举报

ID:656305 发表于 2019-12-5 16:46 | 显示全部楼层
可以,非常好
回复

使用道具 举报

ID:648640 发表于 2019-12-6 10:15 | 显示全部楼层
谢谢楼主。
回复

使用道具 举报

ID:658927 发表于 2019-12-8 20:56 | 显示全部楼层
请问怎么下载啊
回复

使用道具 举报

ID:693628 发表于 2020-4-4 10:38 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:769484 发表于 2020-6-6 10:44 | 显示全部楼层
挺好的,谢谢分享
回复

使用道具 举报

ID:765729 发表于 2020-6-7 09:49 来自手机 | 显示全部楼层
谢谢,非常感谢,
回复

使用道具 举报

ID:646877 发表于 2020-6-11 14:00 | 显示全部楼层
非常好啊
回复

使用道具 举报

ID:757976 发表于 2020-6-11 16:06 | 显示全部楼层
谢谢分享,正好需要下载来学习
回复

使用道具 举报

ID:780693 发表于 2020-6-17 08:10 | 显示全部楼层
东西很棒 很实用
回复

使用道具 举报

ID:782979 发表于 2020-6-18 15:49 | 显示全部楼层
真的很有参考价值
回复

使用道具 举报

ID:784577 发表于 2020-6-19 22:22 | 显示全部楼层
太强了
回复

使用道具 举报

ID:785748 发表于 2020-6-21 13:41 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:769385 发表于 2020-6-21 17:05 | 显示全部楼层
为什么我这个数码管不能亮啊
回复

使用道具 举报

ID:798706 发表于 2020-7-7 00:12 来自手机 | 显示全部楼层
为啥运行不出来
回复

使用道具 举报

ID:328014 发表于 2020-7-7 00:17 | 显示全部楼层
fnfn36 发表于 2020-7-7 00:12
为啥运行不出来

我刚刚用Proteus8.8版本打开后,双击单片机选择hex,出来这个效果:

51hei.png
回复

使用道具 举报

ID:805507 发表于 2020-7-22 12:12 | 显示全部楼层
你好 我想问下你仿真的图在哪个地方
回复

使用道具 举报

ID:864111 发表于 2020-12-27 00:29 | 显示全部楼层
程序有问题啊,调闹钟的时候会和正常走时有冲突,调时间也只能调一次
回复

使用道具 举报

ID:375637 发表于 2021-4-24 12:16 | 显示全部楼层
感觉是有问题的,不能调整闹钟
回复

使用道具 举报

ID:28992 发表于 2021-4-25 04:22 | 显示全部楼层
great job, thank you for your sharing.
回复

使用道具 举报

ID:948794 发表于 2021-7-5 13:20 | 显示全部楼层
仿真后无法实现相应功能,收到请回复
回复

使用道具 举报

ID:997916 发表于 2022-1-4 14:07 | 显示全部楼层
斤斤计较2 发表于 2021-4-24 12:16
感觉是有问题的,不能调整闹钟

我这边的问题是调整闹钟的时候,数码管一直在快速闪烁,您那边这些问题解决了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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