找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15452|回复: 17
收起左侧

自己做的51单片机日历时钟课程设计报告与仿真源码

  [复制链接]
ID:291754 发表于 2018-3-14 19:34 | 显示全部楼层 |阅读模式
资料包:
QQ截图20180314193258.png
2014级单片机原理与应用
课程设计报告
课题名称
单片机原理及应用
姓    名
刘*
学    号
070814009 070814012 070814032        070814041
计算机与信息学院
专    业
物联网工程
指导教师
汪*

一、设计任务及要求:
设计任务:
1、利用内部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为:  年月日:19-06-09
时分秒:09-34-15
也可自行设定显示格式,两部分可按键切换显示;
2、能按键调整日期、时间的数值;
3、设置有整点提醒功能,用一个LED亮灭代替效果
4、设置有闹钟功能,当前时间与设定的闹钟时间一致时,用四个LED代替闪烁一分钟

要 求:
首先进行预设计,根据设计的任务要求,先确定设计的硬件电路方案,然后进行硬件电路的初步设计,在计算机上画出硬件电路图,在老师的指导下进行修正硬件电路图,并对所涉及的参数进行计算。
在确定硬件的基础上,要进行软件的总体设计,包括软件主流程的设计以及各子程序的设计,同时,要写出详细的操作说明,如时间的调整方法,显示窗口的时间切换等,以配合软件的设计。
然后进入硬件的调试及编程工作,设计组内的同学可根据任务分工,有调试硬件各功能模块的,如键盘子程序、显示子程序等,有进行整体程序的编制的,各模块的编制过程中要注意资源的衔接。
最后进入联机调试,联机调试的原则也要采用分步走的原则,各个功能模块要逐步套入,通过一个再增加一项功能,从而达到设计的总体要求,不要上来编制个最大的程序,最后无法查找错误。
最后写出设计报告。

指导教师签名:
2016年  月  日   

三、成绩


                                    指导教师签名:
年  月  日      
目录
一、 绪 言1
二、系统设计1
2.1系统整体流程图1
2.2日历时钟的控制方案论证1
2.3单片机的选择方案论证2
2.4键盘选择方案论证2
2.5显示模块的选择方案论证2
2.6模块的选择方案论证2
三、硬件电路设计2
3.1日历时钟的控制电路图2
3.2行列式键盘的设计3
3.3数码管显示电路的设计3
3.4主要元器件选择4
四、程序流程图5
五、 c语言程序设计5
六、日历时钟的控制器仿真19
6.1 Keil调试19
6.2 Proteus调试19
7、结束语20

    参考文献21


1、绪 言

    近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。 电子时钟是现代社会中的主要计时工具之一,广泛应用于手机,电脑,汽车等社会生活需要的各个方面,及对时间有要求的场合。本设计采用AT89C51单片机作为主要核心部件,附以上电复位电路,时钟电路及按键调时电路组成。数字钟已成为人们日常生活中: 必不可少的必需品, 广泛用于个人家庭以及车站、 码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。 由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性 能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

2、系统设计2.1 设计任务
1、利用内部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为:                    年月日:15-06-09
时分秒:09-34-15
也可自行设定显示格式,两部分可按键切换显示;
2、能按键调整日期、时间的数值;
3、设置有整点提醒功能,用一个LED亮灭代替效果
4、设置有闹钟功能,当前时间与设定的闹钟时间一致时,用四个LED代替闪烁一分钟

2.2 方案比较与论证

2.2.1 系统整体流程图

2.2.2 电子密码锁的控制方案论证

用4*1的行列式键盘组成切换键,调整键等,从矩阵键盘输入调整时间日历和闹钟,起始状态由程序设定。用8位数码管组成显示时间和日历。当整点时,则有一个led灯闪烁一次。当时间与设定的闹钟时间一致时,四个led灯同时闪烁一分钟。

2.2.3 单片机的选择方案论证

方案一:采用可编程逻辑期间CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高,且从使用及经济的角度考虑我们放弃了此方案。

方案二:采用Atmel公司的AT89C51单片机作为控制器。AT89C51是一个低功耗,高性能的CMOS 8位微处理器,其片中还有4K字节的程序存储器,可反复擦除1000次。AT89C51具有51系列单片机的所有优点,有5个中断源,两个16位的定时器/计时器。

综合考虑,选择方案二,采用Atmel公司的AT89C51单片机作为控制器。

2.2.4 键盘选择方案论证

方案一:采用独立式键盘。由于各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。此种键盘适用于按键较少或操作速度较高的场合。但本题发挥部分要求12个功能键,按键数目较多,这就需要较多的输入口线,而且电路结构复杂。故此方案不可取。

方案二:采用行列式键盘。它由行线和列线组成,按键位于行列的交叉点上,行线信号和列线信号分别通过两个接口和CPU相连,通过行列扫描法判定按键的位置,此方案适用于按键较多的场合。

通过对题目的分析,采用4*1行列式键盘。

2.2.5 显示模块的选择方案论证

方案一:采用带字库LCD模块显示。能显示复杂的信息,具有质量轻,体积小,功耗低,指令功能强,接口简单,可靠性强等优点,显示内容丰富,图形美观,易于人机交流。但是价格昂贵。

方案二:采用LED数码管显示。数码管能显示数字和符号,但是占用IO口资源较多,对于简单的电路可以选用此方案。

电子密码锁,电路简单,选用方案二,显示所需信息。

2.2.6 模块的选择方案论证

程序默认显示当前时间,当按下键1时,时钟切换为显示日历信息,再按一次键1则切换为显示设定闹钟时间,再次按下键1则返回显示当前时间;在分别显示时间、日历和闹钟的时候,按下键2则是分别让小时、年份和小时加1,键3与键2同理,按下时分别让分钟、月份、分钟加1,键4同理,按下时分别让秒、日、秒加1。当整点时,D5灯灭,否则灯亮,则实现整点提醒效果;闹钟时间与当前时间一致时,D1、D2、D3、D4同时闪烁一分钟,实现闹钟并持续闪烁一分钟。

3 硬件电路设计

3.1行列式式键盘的设计

键盘电路如图3所示:

图3 键盘电路

3.2数码管显示电路的设计

数码管驱动采用8 个共阴极数码管显示,其电路图如下:

图4 数码管显示电路

3.3 主要元器件选择

主要元器件选用型号和数量如表1所示:

表1  主要元器件清单

序号

材料名称

规格型号

数量

元件代号

1

单片机

AT89C51

1

U1

2

晶振

12MHz

1

X1

3

led

30PF

5

D1

4

键盘

4*1

4

5

数码管

MPX8

8

6

锁存器

74hc138

2


3.4 程序流程图                          时间程序流程图3.5 C语言程序设计3.6带有闹钟功能的日历时钟仿真

在完成了电子密码锁硬件设计和软件设计以后,便进入系统的调试阶段。系统的调试步骤和方法基本上是相同的,但具体细节和所采用的开发系统以及用户系统选用的单片机型号有关,如可选用Keil软件进行软件调试,用Proteus软件完成硬件调试。

6.1 Keil调试

6.2 Proteus调试


图一:时间截图

图二:日期截图

图三:闹钟截图

3.7结束

通过这次课程设计,使我得到了一次用专业知识和专业技能去分析问题、解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及用c语言设计程序的思路技巧等方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。

3.8 参考文献
[1] 周润景.基于 Proteus的电路与单片机系统设计与仿真 [M].北京:北京航空航天大学出版社,2005.
[2] 金炯泰,金奎焕.如何使用KEIL8051C编译器[M].北 京:北京航空航天大学出版社,2002.  
[3] 程相波,卫安军.基于MCS-51单片机的八路抢答器设计方法研究文献名[J].北京工业职业技术学院学报,2007(2).
[4] 张齐. 单片机应用系统设计技术———基于 C 语言编程[M] .北京: 电子工业出版社,2004.   
[5] 潘永雄.新编单片机与应用[M].西安 :西安电子科技大学出版社,2003.

1.期刊类

【格式】[序号]作者.篇名[J].刊名,出版年份,卷号(期号):起止页码.

【举例】

[1] 王海粟.浅议会计信息披露模式[J].财政研究,2004,21(1):56-58.

[2] 夏鲁惠.高等学校毕业论文教学情况调研报告[J].高等理科教育,2004(1):46-52.

[3] Heider, E.R.& D.C.Oliver. The structure of color space in naming and memory of two languages [J]. Foreign Language Teaching and Research, 1999, (3): 62 – 67.

2.专著类

【格式】[序号]作者.书名[M].出版地:出版社,出版年份:起止页码.

【举例】[4] 葛家澍,林志军.现代西方财务会计理论[M].厦门:厦门大学出版社,2001:42.

[5] Gill, R. Mastering English Literature [M]. London: Macmillan, 1985: 42-45.

3.报纸类

【格式】[序号]作者.篇名[N].报纸名,出版日期(版次).

【举例】

[6] 李大伦.经济全球化的重要性[N]. 光明日报,1998-12-27(3).

[7] French, W. Between Silences: A Voice from China[N]. Atlantic Weekly, 1987-8-15(33).

4.论文集

【格式】[序号]作者.篇名[C].出版地:出版者,出版年份:起始页码.

【举例】

[8] 伍蠡甫.西方文论选[C]. 上海:上海译文出版社,1979:12-17.

[9] Spivak,G. “Can the Subaltern Speak?”[A]. In C.Nelson & L. Grossberg(eds.). Victory in Limbo: Imigism [C]. Urbana: University of Illinois Press, 1988, pp.271-313.

[10] Almarza, G.G. Student foreign language teacher’s knowledge growth [A]. In D.Freeman and J.C.Richards (eds.). Teacher Learning in Language Teaching [C]. New York: Cambridge University Press. 1996. pp.50-78.

5.学位论文

【格式】[序号]作者.篇名[D].出版地:保存者,出版年份:起始页码.

【举例】

[11] 张筑生.微分半动力系统的不变集[D].北京:北京大学数学系数学研究所, 1983:1-7.

6.研究报告

【格式】[序号]作者.篇名[R].出版地:出版者,出版年份:起始页码.

【举例】

[12] 冯西桥.核反应堆压力管道与压力容器的LBB分析[R].北京:清华大学核能技术设计研究院, 1997:9-10.

7.条例

【格式】[序号]颁布单位.条例名称.发布日期

【举例】[15] 中华人民共和国科学技术委员会.科学技术期刊管理办法[Z].1991—06—05

8.译著

【格式】[序号]原著作者. 书名[M].译者,译.出版地:出版社,出版年份:起止页码.

说明:

1 正文部分采用宋体小四,1.5倍行距。

2 一级标题黑体小三号加黑,二级标题黑体四号加黑,三级标题黑体小四号加黑。全部标题均不居中,段前段后都为0行,行间距为1.5倍。

3 参考文献不少于10个。

4 图和表分别采用通篇编号方式,必须有标题。图的标题在图下方,表的标题在表上方。


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit dula=P3^1;
  6. sbit wela=P3^2;
  7. uint bb=0;
  8. sbit led1=P3^3;
  9. uint x=0,t0=0;
  10. uchar num,temp,ch=1;
  11. uchar shi=23,fen=59,miao=55,shi1,shi2,fen1,fen2,miao1,miao2;
  12. uint nian=2016,yue=2,ri=28,nian1,nian2;
  13. Uchar yue1,yue2,ri1,ri2,year=00,month=00,day=00,year1,year2,month1,month2,day1,day2;
  14. uchar code table[]={
  15. 0x3f,0x06,0x5b,0x4f,
  16. 0x66,0x6d,0x7d,0x07,
  17. 0x7f,0x6f,0x77,0x7c,
  18. 0x39,0x5e,0x79,0x71,
  19. 0x76,0x79,0x38,0x3f,0};

  20. void delay(uint z)
  21. {
  22.               uint t1,y;
  23.               for(t1=z;t1>0;t1--)
  24.                             for(y=110;y>0;y--);
  25. }


  26. void display(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
  27. {

  28.               wela=1;
  29.               P2=0xfe;
  30.               wela=0;

  31.               dula=1;
  32.               P2=table[shi1];
  33.               delay(5);
  34.               dula=0;

  35.               wela=1;
  36.               P2=0xfd;
  37.               wela=0;

  38.               dula=1;
  39.               P2=table[shi2];
  40.               delay(5);
  41.               dula=0;

  42.               wela=1;
  43.               P2=0xfb;
  44.               wela=0;

  45.               dula=1;
  46.               P2=table[fen1];
  47.               delay(5);
  48.               dula=0;

  49.               wela=1;
  50.               P2=0xf7;
  51.               wela=0;

  52.               dula=1;
  53.               P2=table[fen2];
  54.               delay(5);
  55.               dula=0;

  56.               wela=1;
  57.               P2=0xef;
  58.               wela=0;

  59.               dula=1;
  60.               P2=table[miao1];
  61.               delay(5);
  62.               dula=0;

  63.               wela=1;
  64.               P2=0xdf;
  65.               wela=0;

  66.               dula=1;
  67.               P2=table[miao2];
  68.               delay(5);
  69.               dula=0;
  70. }

  71. void init()
  72. {
  73.               TMOD=0x11;
  74.               TH0=(65536-50000)/256;  //定时器初始化
  75.               TL0=(65536-50000)%256;
  76.               TH1=(65536-50000)/256;
  77.               TL1=(65536-50000)%256;
  78.               EA=1;
  79.               ET0=1;
  80.               ET1=1;
  81.               TR1=1;

  82. }

  83. uchar keyscan()
  84. {
  85.               P3=0xfe;//检测第一行
  86.               temp=P3;
  87.               temp=temp&0xf0;
  88.               while(temp!=0xf0)
  89.               {
  90.                             delay(5);
  91.                             temp=P3;
  92.                             temp=temp&0xf0;
  93.                             while(temp!=0xf0)
  94.                             {

  95.                             switch(temp)
  96.                                           {
  97.                                                         case 0xe0:num=1;
  98.                                                                       break;
  99.                                                         case 0xd0:num=2;
  100.                                                                       break;
  101.                                                         case 0xb0:num=3;
  102.                                                                       break;
  103.                                                         case 0x70:num=4;
  104.                                                                       break;
  105.                                           }
  106.                             while(temp!=0xf0)
  107.                                           {
  108.                     temp=P3;
  109.                     temp=temp&0xf0;
  110.          }
  111.       }
  112.   }                             
  113.    return shi,fen;
  114. }

  115. void jisuan()
  116. {
  117. if(num==1)
  118. {
  119. ch++;
  120. if(ch==4)
  121. ch=1;
  122. num=0;
  123. }
  124. if(num==2)
  125. {
  126. if(ch==1)
  127. shi++;
  128. if(ch==2)
  129. nian++;
  130. if(ch==3)
  131. year++;
  132. num=0;
  133. }
  134. if(num==3)
  135. {
  136. if(ch==1)
  137. fen++;
  138. if(ch==2)
  139. yue++;
  140. if(ch==3)
  141. month++;
  142. num=0;
  143. }
  144. if(num==4)
  145. {
  146. if(ch==1)
  147. miao++;
  148. if(ch==2)
  149. ri++;
  150. if(ch==3)
  151. day++;
  152. num=0;
  153. }
  154. }
  155. void shijian()
  156. {
  157.     shi1=shi/10;
  158.               shi2=shi%10;
  159.               fen1=fen/10;
  160.               fen2=fen%10;
  161.               miao1=miao/10;
  162.               miao2=miao%10;

  163.               if(fen==0&miao==0)/*
  164.               当时间为整时时灯灭,否则灯亮

  165.               */
  166.               {
  167.                             led1=0;
  168.                             }else{
  169.                                           led1=1;

  170.                             }  

  171.               if(shi==24)
  172.               {
  173.                             shi=0;
  174.                             ri++;            
  175.               }
  176.               if(fen==60)
  177.               {
  178.                             fen=0;
  179.                             shi++;
  180.               }
  181.               if(miao==60)
  182.               {
  183.                             miao=0;
  184.                             fen++;
  185.               }
  186. }
  187. void riqi()           
  188. {
  189.               nian1=nian/10;
  190.               nian2=nian%10;
  191.               yue1=yue/10;
  192.               yue2=yue%10;
  193.               ri1=ri/10;
  194.               ri2=ri%10;
  195.               if(yue==12)
  196.               {
  197.               nian++;
  198.               yue=1;
  199.               }
  200.               switch(yue)//判断月份大小
  201.               {
  202.               case 1:case 3:case 5:case 7:case 8:case 10:case 12:
  203.               if(ri==32)
  204.               {
  205.               ri=1;
  206.               yue++;
  207.               }
  208.               break;
  209.               case 4:case 6:case 9:case 11:
  210.               if(ri==31)
  211.               {
  212.               ri=1;
  213.               yue++;
  214.               }
  215.               break;
  216.               case 2:              //判断闰年
  217.               if((nian%4==0&nian%100!=0)||nian%400==0)
  218.               {
  219.               yue++;
  220.               ri=1;
  221.               }
  222.               else if(nian%400!=0&ri==29)
  223.               {
  224.               yue++;
  225.               ri=1;
  226.               }
  227.               break;
  228.               }            
  229. }
  230. void naozhong()    //闹钟
  231. {
  232.               year1=year/10;
  233.               year2=year%10;
  234.               month1=month/10;
  235.               month2=month%10;
  236.               day1=day/10;
  237.               day2=day%10;
  238.               if(year==24)
  239.               {
  240.                             year=0;            
  241.               }
  242.               if(month==60)
  243.               {
  244.                             month=0;
  245.                             year++;
  246.               }
  247.               if(day==60)
  248.               {
  249.                             day=0;
  250.                             month++;
  251.               }
  252. }
  253. void main()  //shi代表当前时间 year代表闹钟时间
  254. {
  255.               init();            
  256.               P1=0x00;              //P1四个灯 初始化为灭
  257.               while(1)
  258.               {            
  259.               jisuan();
  260.               keyscan();
  261.               shijian();
  262.               riqi();
  263.               naozhong();
  264.               if(shi==year&fen==month&miao==day)
  265.               TR0=1;
  266.               if(ch==1)
  267.               display(shi1, shi2, fen1, fen2, miao1, miao2);
  268.     if(ch==2)
  269.               display(nian1,nian2,yue1,yue2,ri1,ri2);
  270.               if(ch==3)
  271.               display(year1,year2,month1,month2,day1,day2);
  272.               }
  273. }
  274. void time1() interrupt 3
  275. {
  276.               TH1=(65536-50000)/256;
  277.               TL1=(65536-50000)%256;
  278.               x++;
  279.               if(x==20)
  280.               {
  281.               x=0;
  282.               miao++;
  283.               if(miao==60)
  284.               {
  285.               miao=0;
  286.               fen++;
  287.               if(fen==60)
  288.               {
  289.               fen=0;
  290.               shi++;
  291.               if(shi==24)
  292.               {
  293. ……………………

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

所有资料51hei提供下载(仿真+源码+word格式的设计报告带清晰图片):
日历时钟.rar (134.02 KB, 下载次数: 311)

评分

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

查看全部评分

回复

使用道具 举报

ID:319768 发表于 2018-5-1 12:00 | 显示全部楼层
大神!
回复

使用道具 举报

ID:322150 发表于 2018-5-4 16:09 | 显示全部楼层
大神!!!!
回复

使用道具 举报

ID:324423 发表于 2018-5-7 19:07 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:324697 发表于 2018-5-8 00:07 | 显示全部楼层
大神!!!
回复

使用道具 举报

ID:341804 发表于 2018-5-30 22:18 | 显示全部楼层
大神!!!
回复

使用道具 举报

ID:358231 发表于 2018-6-25 10:30 | 显示全部楼层
真好需要
回复

使用道具 举报

ID:358382 发表于 2018-6-28 00:56 | 显示全部楼层
目标未创建,代码有错误
回复

使用道具 举报

ID:368293 发表于 2018-7-12 15:05 | 显示全部楼层
厉害,值得学习
回复

使用道具 举报

ID:378310 发表于 2018-9-11 14:48 | 显示全部楼层
棒棒哒
回复

使用道具 举报

ID:397024 发表于 2018-9-12 16:37 | 显示全部楼层
厉害,值得学习
回复

使用道具 举报

ID:440341 发表于 2018-12-14 14:14 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

ID:505337 发表于 2019-4-23 01:44 来自手机 | 显示全部楼层
不行,不好用,时间不对
回复

使用道具 举报

ID:508017 发表于 2019-5-11 00:50 | 显示全部楼层
代码运行出错了
回复

使用道具 举报

ID:558263 发表于 2019-6-9 16:17 | 显示全部楼层
厉害膜拜
回复

使用道具 举报

ID:566010 发表于 2019-6-20 18:07 | 显示全部楼层
代码有点错误,时间会闪跳
回复

使用道具 举报

ID:608305 发表于 2019-9-6 09:45 | 显示全部楼层
大神!
回复

使用道具 举报

ID:611687 发表于 2019-10-22 15:42 | 显示全部楼层
大神,非常感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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