找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于89C51单片机的数字电子钟设计与上机调试 附源码

  [复制链接]
跳转到指定楼层
楼主
ID:466022 发表于 2019-1-10 17:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、设计的目的

课程设计是自动化专业集中实践环节的主要内容之一。训练正确地应用单片机,培养解决工业控制、工业检测等领域具体问题的能力。学生通过所做课题,熟悉单片机应用系统开发研制的过程,软硬件设计的工作方法、内容及步骤,对学生进行基本技能训练。例如组成系统、编程、调试、绘图等。使学生理论联系实际,提高动手能力和分析问题、解决问题的能力。

通过本课程设计,主要达到以下目的:

1.使学生增进对单片机的感性认识,加深对单片机理论方面的理解。

2.使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等。

3.使学生了解和掌握单片机应用系统的软/硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。

二、课程设计的要求

1.学生需认真阅读课程设计任务书,熟悉有关设计资料及参考资料,熟悉各种设计规范的有关内容,认真完成任务书规定的设计内容。

2.课程设计的成果为“课程设计报告”。课程设计报告内容要正确,概念要清楚,完成任务书所规定的内容,附有原理图及程序流程图,程序清单,文字要通顺,书写要工整,设计图纸必须符合规范。

3.课程设计报告应在2000字以上(含相关图纸和计划书等),用A4纸打印。

三、课程设计的选题参考(可另自行拟题或参考教材和实验指导书)

1.交通灯系统设计                            2.计时器系统设计                            3.出租车计价器系统设计

4.频率计系统设计                            5.温度控制系统设计              6.音乐播放系统设计

四、时间安排及成绩评定

课程设计时间:6月21日(16周周四)下午布置课程设计,6月25日(17周周一)下午4:30在信息行政楼八层自动化系会议室辅导课程设计,6月27日全天(自动化1、2班),6月28日全天(自动化3、4班),6月29日全天(交控1班、创新2班)在信息实验楼2层计算机实验室上机调试电路及程序,7月2日上午各班长收齐设计报告交给辅导老师。辅导老师根据学生的设计表现,设计报告书、图纸等进行评定。课程设计成绩按百分制分评定。



3.设计步骤叙述
3.1选题过程
              本次单片机课程设计的选题我参考了教材第十一章实验及课程设计中的11.3.3课程设计参考题目及要求中的选题示例,选择了电子钟为本次的课程设计题目,同时参考了秒表和定时闹钟课题,准备对电子钟课题进行秒表或者闹钟的功能扩展,从而达到一定的难度系数,然后填写了选题说明书,确定了设计内容与目的功能,最后开始围绕设计的功能开始本次的课程设计。
3.2硬件设计说明
              本电子时钟主要由单片机,键盘,数码管显示接口电路和蜂鸣器电路构成
(1)AT89C51芯片
AT89C51芯片的引脚图如图所示。
AT89C51芯片引脚

其中主要应用到的引脚口介绍:
a.P0口的第一功能是作为一般I/O口使用,第二功能是在CPU访问外部存储器时,分时提供低8位地址和8位双向数据。
b.P1口是8位准双向I/O口,51子系列中P1只能用作一般I/O口,52子系列中P1.0和P1.1引脚还具有第二功能。
c.P2口是8位准双向I/O口,第二功能是在CPU访问外部存储器时,作为高8位地址总线,输出高8位地址。
d.P3口是8位准双向I/O口,其第一功能是用作一般I/O口,第二功能是作为中断信号和外部数据存储器的读写控制信号。
e.RES,复位信号高电平有效。
(2)键盘电路
              键盘电路如图所示
P3口连接按键,当按键没有按下时,P3.0~P3.4为高电平,若按下则变低电平





(3)数码管显示电路
              数码管显示电路如图所示
当对应的P2口输出时,所对应的数码管显示
P0口为低电平的端口所对应的段码显示。
(4)蜂鸣器电路
              蜂鸣器电路如图所示
当P1.0为低电平时,三极管导通,蜂鸣器开始工作,作为闹钟功能的基础

(5)复位电路
              复位电路如图所示
通电瞬间电容充电,RST端出现脉冲,用以复位,只要接通电源就完成了系统的复位
(6)振荡电路
              振荡电路如图所示

              此处晶振为12MHz,提供单片机的时钟频率。晶振频率越高,单片机运行速度越快。



(7)总体电路

3.3程序编制说明

              设计电子时钟使用单片机资源的情况如下:

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)当第五次按下第一个按键时返回正常的显示时间走时状态。

软件系统的各个模块:

时钟系统的软件设计主要采用以下基本模块来实现,主程序、定时中断服务程序、键盘扫描程序模块、时钟显示模块、闹钟显示模块、转换模块、延时模块和蜂鸣器模块。

主程序:对中断程序初值进行设定,在各种情况下对子函数的调用,保证整个程序的顺序执行。

定时中断服务程序:用于电子时钟的准确运行。

键盘扫描程序模块:用于确定按键并在按键按下时调用相应的程序进行显示。

时钟显示模块:用于显示正常走表的时间。

闹钟显示模块:用于显示设定闹钟的时间。

转换模块:用于将默认的24小时制转换为12小时制。

延时模块:程序中调用延时子程序,用于按键消抖动,数码管消影等。

蜂鸣器模块:用于在设定的闹钟时间与走表的时间相等时,闹钟响起。

软件系统程序流程图程序清单附于报告后


4.上机调试及修改,优化过程过程

4.1上机调试过程

              本次课程设计于6月28日进行了上机调试,在上级调试之前,我认真思考了设计内容和要求,认为自己理论课学的还差不多,认为困难不是很大,各部分的程序可以分别完成。然后按照自己的思路开始了自己的程序编写,但是在上机调试过程中,发现自己认为逻辑合理的程序根本运行不起来,只好从头开始一步步将程序分解找错,然后对程序进行完善,经过了大半天的努力,终于做到实现了大部分的功能,而且在调试过程中发现当初写选题报告时有很多设想和实际调试中不太相符,比如接口的分配,部分功能的实现,在选题说明中设想的秒表功能因为个人能力原因没有实现,为了代替这部分功能,我在程序设计中增加了闹钟功能来弥补程序的不足,通过这个问题我也了解了实践检验的重要性,只靠天马行空的想像是不可能将工作目标完成的。

4.2 上机调试过程中的问题、解决办法及分析

              在本次上机调试过程中,还没有在单片机上运行程序,我就遇到了一个大问题,在软件中运行程序时,程序出现了错误报告,在上网查询后也没能解决问题,只好在后来更换电脑,才进行了程序调试。

在程序调试中还遇到了一些问题比如按下按键却没有对应的功能运行,经过寻找我发现忘记编写子程序调用语句导致子程序没有运行,添加了语句果然运行了,还有在单片机上接线时,将段选与位选的端口接反,键盘防抖动,数码管显示延时时间不合适等,还有定时计数器中断忘记开启等问题,均通过自己调试或者询问同学将问题解决,完成了这次上机调试。

5.设计总结

5.1设计结果

              本次课程设计我设计了基于51单片机的数字电子时钟,可以显示时间并对时间进行手动调节以及复位,扩展了闹钟功能,可以设置闹钟时间并在时间到达后使蜂鸣器响起。

5.2收获与体会

              通过这次课程设计,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。学习理论课时也是有实验课的,但当时自己只是追求明白课本例题的程序,也没深入想过课本上那些小的程序之间的联系应用。所以学习知识不能局限于理论,要与实践结合。学会了单片机的一般设计过程,通常都要进行系统扩展,因此,要完成一个单片机的设计工作,必须依次做到硬件电路的设计、组装与调试,软件的编写、调试,完整软件的调试和下载运行。

而在进行硬件系统设计时应当尽量做到尽可能的选择典型电路,并符合单片机的常规使用,硬件结构设计应与软件设计方案一同考虑。因为基础知识学的也并不是很牢固,程序若有不完善之处还请老师见谅。

通过这次课程设计,我对单片机有了更深入的了解,同时也培养了我的动手实践能力,使我获益良多。





附:软件系统程序流程图

主程序:

显示程序:

中断程序:


单片机源码:
  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.                             delay(10);}}
  188. /*****24转12小时制*********/
  189. void to12()
  190. {if(hour>=12)
  191.     {hour=hour-12;}
  192.   if(hour1>=12)
  193.     {hour1=hour1-12;}}
  194. /*****主函数*********/
  195. main()
  196. {TMOD=0x01;
  197. TH0=(65536-50000)/256;
  198. TL0=(65536-50000)%256;
  199. EA=1;ET0=1;TR0=1;
  200. while(1)
  201. {     
  202. keyscan();display();
  203. if(flag==1) {keyscan(); display();}
  204. if(flag==2) {keyscan(); display1();}
  205. if(flag==3)  {display();}
  206. if((hour==hour1)&&(min==min1)&&(sec==sec1))
  207.    {clock();}//闹钟设定时间与时钟时间相等,调用蜂鸣器函数
  208. if(kzh==0){to12();}
  209. }
  210. }
复制代码

完整的Word格式文档51黑下载地址:
图文.doc (8.42 MB, 下载次数: 92)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:362364 发表于 2019-5-3 20:56 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:500339 发表于 2019-5-4 16:29 | 只看该作者
为啥我按键按第二下就给复位了,不会跳到闹钟函数
回复

使用道具 举报

地板
ID:638115 发表于 2019-11-8 16:19 | 只看该作者
为什么我做出来以后是液晶屏上是乱的呀。。。
回复

使用道具 举报

5#
ID:69408 发表于 2019-11-9 11:49 | 只看该作者
谢谢分享,学习学习!
回复

使用道具 举报

6#
ID:661415 发表于 2019-12-17 20:57 来自手机 | 只看该作者
问一下怎么我的烧录不进去啊
回复

使用道具 举报

7#
ID:661415 发表于 2019-12-17 20:57 来自手机 | 只看该作者
这个头文件在哪里啊
回复

使用道具 举报

8#
ID:661415 发表于 2019-12-17 21:00 来自手机 | 只看该作者
楼主在嘛 有头文件吗
回复

使用道具 举报

9#
ID:661737 发表于 2019-12-18 12:24 | 只看该作者
感谢分享
回复

使用道具 举报

10#
ID:678266 发表于 2019-12-31 11:30 | 只看该作者
感谢分享!
回复

使用道具 举报

11#
ID:683548 发表于 2020-1-8 14:21 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

12#
ID:97678 发表于 2020-1-9 16:42 | 只看该作者
没有设置数据保存功能, 能不能增加 这个功能?
回复

使用道具 举报

13#
ID:695017 发表于 2020-2-19 11:42 | 只看该作者
头文件能给一下吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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