基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc

上传人:hw****26 文档编号:4141212 上传时间:2019-09-29 格式:DOC 页数:19 大小:443KB
下载 相关 举报
基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc_第1页
第1页 / 共19页
基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc_第2页
第2页 / 共19页
基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc_第3页
第3页 / 共19页
基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc_第4页
第4页 / 共19页
基于C51单片机的数字时钟课程设计(C语言,带闹钟).doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、单片机技术课程设计 数字电子钟 学院: 班级: 姓名: 学号: 教师: 摘 要 电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到 人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用 AT89C52 单片机为核心,使用 12MHz 晶振与单片机 AT89C52 相连接,通过软件编程的方 法实现以 24 小时为一个周期,同时 8 位 7 段 LED 数码管(两个四位一体数码管) 显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定 好的时间进行蜂鸣报时。该电子钟设有四个按键 KEY1、KEY2、KEY3、KEY4 和 KEY5 键,进行相应的操作就可实现

2、校时、定时、复位功能。具有时间显示、整 点报时、校正等功能。走时准确、显示直观、运行稳定等优点。具有极高的推 广应用价值。 关键词: 电子钟 AT89C52 硬件设计 软件设计 目 录 一、数字电子钟设计任务、功能要求说明及方案介绍 .4 1.1 设计课题设计任务 .4 1.2 设计课题的功能要求说明 .4 1.3 设计课的设计总体方案介绍及工作原理说明 .4 二、设计课题的硬件系统的设计 .5 2.1 硬件系统各模块功能简要介绍 5 2.1.1 AT89C52 简介 .5 2.1.2 按键电路 6 三、设计课题的软件系统的设计 .6 3.1 使用单片机资源的情况 .6 3.2 软件系统个模块

3、功能简要介绍 .7 3.3 软件系统程序流程框图 .7 3.4 软件系统程序清单 .7 四、设计课题的设计结论、仿真结果、误差分析 .9 4.1 设计结论及使用说明 .9 4.2 仿真结果 10 结 束 语 12 参考文献 12 附 录 13 附录 A:程序清单 13 一、数字电子钟设计任务、功能要求说明及方案介绍 1.1 设计课题设计任务 设计一个具有特定功能的电子钟。具有时间显示,并有时间设定,时间调 整 功能。 1.2 设计课题的功能要求说明 设计一个具有特定功能的电子钟。该电子钟上电或按键复位后能自动显示 系统提示符“d.1004-22” , 进入时钟准备状态;第一次按电子钟启动/调整

4、键, 电子钟从 12 时 59 分 0 秒开始运行,进入时钟运行状态;按电子钟 S5 键,则电 子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按 S5 键 再次进入时钟运行状态。 1.3 设计课的设计总体方案介绍及工作原理说明 本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题 的总体方案如图 1 所示: 图1-1总体设计方案图 本电子钟的所有的软件、参数均存放在 AT89C52 的 Flash ROM 和内部 RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采 用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字 钟效果

5、,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读 入当前外部控制状态来改变程序的不同状态,实现不同功能。 二、设计课题的硬件系统的设计 2.1 硬件系统各模块功能简要介绍 2.1.1 AT89C52 简介 (1) 兼容 MCS51 指令系统; (2)8kB 可反复擦写(大于 1000 次)Flash ROM; (3)32 个双向 I/O 口; (4)256x8bit 内部 RAM; (5)3 个 16 位可编程定时/计数器中断; (6)时钟频率 0-24MHz; (7)2 个串行中断,可编程 UART 串行通道; (8)2 个外部中断源,共 8 个中断源; (9)2 个读写中断口

6、线,3 级加密位; (10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能; (11)有 PDIP、PQFP、TQFP 及 PLCC 等几种封装形式,以适应不同产品的需 求。 它的价格便宜,功能强大,能耗低。很大程度上减少总电路的复杂性,提 高了所设计系统的稳定性。其芯片引脚图如图 2-1 所示。 图 2-1 单片机 AT89S52 引脚图 2.1.2 按键电路 图 22 按键图 三、设计课题的软件系统的设计 3.1 使用单片机资源的情况 设计课题使用单片机资源的情况如下: P0 口输出数码管段选信号,P2 口输出数码管位选信号;晶振 12MHz;调整 选择键 KEY1:P1.0;通过选择键选择

7、调整位,选中位闪烁;增加键 KEY2:P1.1;按一次使选中位加 1;减少键 KEY3:P1.2;按一次使选中位减 1;此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设 定和调整;闹钟的开启和关闭功能,具体如下: (1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间 12- 59-00,且控制闹钟状态的的红色 led 灯为亮的状态; (2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示 时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时 实现小时的减一调节; (3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第 二

8、个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节; (4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个 按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节; (5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个 按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节; (6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态; (7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色 led 灯为 灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则 开启闹钟,且此时红色 led 灯为亮,定

9、时时间到蜂鸣器发出滴滴的闹铃声,同 时按下第二和第三个弹性按键即可关闭闹铃。闹铃状态默认为开启。 3.2 软件系统个模块功能简要介绍 本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、 键盘输入程序模块、数码管及其驱动模块和延时模块。 主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程 序模块的运用及其控制。 中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。 键盘输入程序模块:主要是用于确定按键并得到特定的键码值。 数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。 延时模块:程序中有两种延时子程序,一种是短延时用于判键按下等,一 种是

10、长延时。 3.3 软件系统程序流程框图 系统软件采用汇编语言按模块化方式进行设计,然后通过 Keil 软件开发平台将 程序转变成十六进制程序语言,接着使用 Proteous 进行仿真,读出显示数据。 3.4 软件系统程序清单 本电子钟实现 24 小时制,8 位数码管显示时分秒,显示式:12-59-00。 通过 4 只按键来调整时间: KEY1(P1.0):调整选择键,选中位闪烁; KEY2(P1.1):增加键,按一次使选中位加 1; KEY3(P1.2):减少键,按一次使选中位减 1; Bear(P3.1):到了整点和闹钟就会响; Led (P1.2):闪烁; P0 口输出数码管段选信号,P2

11、 口输出数码管位选信号; 晶振 12MHz。 开始 显示初始化 d . 1 0 0 4 - 2 2 循环扫描检测按键状态 K E Y 1 是否按下 标志位加一 , 进入调整状态 K E Y 2 是否按下 分时加 1 调整 K E Y 3 是否按下 分时减 1 调整 Y Y K E Y 2 , K E Y 3 是否 同时按下 控制闹钟开关 N 图 3-1 主程序流程框图 图 3-2 显示时钟数组子程序 图 3-3 中断服务程序程序 四、设计课题的设计结论、仿真结果、误差分析 4.1 设计结论及使用说明 本设计为基于单片机的电子钟的设计。刚开始,我们很多地方理不清头绪, 无从下手,但通过认真研究设

12、计课题,找书上网查资料,确定基本设计方案, 对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。 本设计用 2 个四位一体的共阳数码管做为显示器,它显示时间值;设计中 有三个按键,其中 KEY1 为启动键,KEY2 为加控制键 KEY3 为减控制键 。 图 41 结果图 4.2 仿真结果 在 Proteus ISIS 的 Debug 菜单中选择 Execute,运行程序,系统仿真结 果如图所示。 实现功能: 可调整运行的电子钟具有三种工作状态:“d.1004-22”状态、运行状态、 调整状态。 图 4-2“d.1004-22”上电初始化运行状态仿真结果 图 4-3 时钟正常运行

13、状态仿真结果 图 4-4 闹钟定时调整状态仿真结果 图 4-5 小时调整状态仿真结果 图 4-6 分钟调整状态仿真结果 结 束 语 单片机课程设计是一门很实用,很复杂的设计。这个设计用到了单片机, 电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定 的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。 完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、 完成几个过程。刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么 困难的,所用的知识书上都有。可是当我动手开始做的时候,才发现其中的算 法,设计是那么繁琐。经过一天的努力,再到图书馆和网上查找资料

14、,在经过 借鉴很多类似的资料,文献后,总算是有点眉目了。埋头苦干的过程是痛苦的, 在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终 于最后完善了程序。其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域” 的困难。但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜 悦,就在这样的痛与快乐的交换中,我学到了知识。 通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍 有很大的差距。知道了很多元器件有什么功效,在仿真仪器中是什么代码。有 的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。 我遇到了不少问题,花费了很多的时间。这让我重新反思我们

15、的学习,深刻领 悟到我们这个专业动手,实践的重要性。理论不经过实践考验,是没法实施的, 就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防 范方法措施。这次的课程设计,让我学到了很多书本上学不到的东西,学到了 实际应用时。最大的收获是:对键盘,显示器,C51 语言的应用有了深刻的了 解。 参考文献 1 百度文库,基于 C51 单片机的程序设计. 2 百度百科,AT89C52 简介 附录 附录 A 程序清单 #include #include #include #define uint unsigned int #define uchar unsigned char sbit

16、KEY1=P11; /切换键 sbit KEY2=P12; /minute ,hour 调整加 1 定义 sbit KEY3=P17; /minute ,hour 调整减 1 定义 sbit bear=P31; /闹铃 sbit led=P12; /闹钟,整时灯闪烁 code unsigned char tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21; /段码控制 char code weikong_code=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x

17、7f; uchar ms8=2,2,10,4,0,0,1,14; uchar StrTab8; uchar minute=59,hour=12,second=0; /正常时钟 秒,分,时 定义 uchar minute1=00,hour1=00; second1=00; /闹钟时钟 秒,分,时 定义 uchar flag=0, flag1=0; /切换标志 uchar num=0; uint count=0; /定时器计数,定时 50ms,count 满 20,秒加 1 /*子函数声明*/ void xianshishuzu(); /显示数组子程序 void alarm(); /闹钟子程序 /

18、* 延时子程序*/ void delay(uint z) uint x,y; for(x=0;xz;x+) for(y=0;y110;y+); /*显示时钟子函数 */ void dispaly(uchar w8) unsigned int i,j,aa; aa=0xfe; /位选初值 1111 1110 for(i=0;i8;i+) /依次将数组 w 中八个数取出,并显示 P2=aa; /位选 j=wi; /取出要显示的数码 P0=tabj; /取出段选编码 aa=_crol_(aa,1); /位选信号循环右移 delay(1); /显示延时 P0=0xff; /消影 /*显示时钟数组子程序

19、 */ void xianshishuzu() StrTab1=second/10; /秒个位 StrTab0=second%10; /秒十位 StrTab2=10; /间隔符 - StrTab4=minute/10; /分个位 StrTab3=minute%10; /分十位 StrTab5=10; /间隔符 - StrTab7=hour/10; /时个位 StrTab6=hour%10; /时十位 /*键盘扫描子程序 */ void keycan() if(KEY1=0) /按一次,正常显示,按第二次,时调整,按第三次,分调这整, delay(10); /按键 1 去抖以及动作 if(KEY

20、1=0) /确认按键是否按下 flag+; /切换标志 while(!KEY1); /释放按键 if(flag=1) if(KEY2=0) delay(10); if(KEY2=0) hour+; /正常时间 小时 加 1 if(hour=24)hour=0; while(!KEY2) /释放按键 dispaly(StrTab); if(KEY3=0) delay(10); if(KEY3=0) hour-; /正常时间小时 减 1 if(hour=0)hour=23; dispaly(StrTab); while(!KEY3) dispaly(StrTab); if(flag=2) if(K

21、EY2=0) /按键去抖以及动作 delay(10); if(KEY2=0) minute+; /分加 1 if(minute=60)minute=0; while(!KEY2) dispaly(StrTab); if(flag=3) /秒表的加 1 if(KEY3=0) delay(10); if(KEY3=0) second+; /秒加 1 if(second=0)second=59; while(!KEY3) dispaly(StrTab); if(flag=3) /闹钟对时 if(KEY2=0) delay(10); if(KEY2=0) hour1+; if(hour1=24)hou

22、r1=0; /闹钟时间 小时 加 1 while(!KEY2) alarm(); if(KEY3=0) delay(10); if(KEY3=0) hour1-; if(hour1=0)hour1=23; /闹钟时间 小时 减 while(!KEY3) alarm(); if(flag=4) if(KEY2=0) /按键去抖以及动作 delay(10); if(KEY2=0) minute1+; if(minute1=60)minute1=0; /闹钟分加 1 while(!KEY2) alarm(); if(KEY3=0) /按键去抖以及动作 delay(10); if(KEY3=0) mi

23、nute1-; if(minute1=0)minute1=59; /闹钟分减 1 while(!KEY3) alarm(); /*蜂鸣器子程序 */ void beng() bear=1; P3=0xfd; delay(100); bear=0; P3=0XFf; delay(100); /*整点报警子程序 */ void zhengdian (void) uchar i=0; if(second=0)i=second1i0) if(flag=1|flag=2) TR0=1; dispaly(StrTab); zhengdian (); /KEY1 按第二次或第二次定时器开始,电子钟和整点报时正常显示 if(flag=3|flag=4) TR0=0;alarm(); /按 KEY1 第三或第四次闹钟开始显示,分时的调整 if(flag=5) dispaly(StrTab); /按 KEY1 第五次返回电子钟正常显示 if(flag=6) TR0=0; flag=0; dispaly(ms); /按 KEY1 第六次定时器关闭,切换标志请零,显示 d.1004-22

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。