收藏 分销(赏)

基于C单片机的数字时钟专业课程设计.doc

上传人:二*** 文档编号:4519467 上传时间:2024-09-26 格式:DOC 页数:24 大小:417.54KB 下载积分:5 金币
下载 相关 举报
基于C单片机的数字时钟专业课程设计.doc_第1页
第1页 / 共24页
本文档共24页,全文阅读请下载到手机保存,查看更方便
资源描述
单片机技术课程设计 数字电子钟 学院: 班级: 姓名: 学号: 老师: 摘 要 电子钟在生活中应用很广泛,而一个简单方便数字电子钟则更能受到大家欢迎。所以设计一个简易数字电子钟很有必需。本电子钟采取AT89C52单片机为关键,使用12MHz 晶振和单片机AT89C52 相连接,经过软件编程方法实现以二十四小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒要求,并在计时过程中含有定时功效,当初间抵达提前定好时间进行蜂鸣报时。该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行对应操作就可实现校时、定时、复位功效。含有时间显示、整点报时、校正等功效。走时正确、显示直观、运行稳定等优点。含有极高推广应用价值。 关键词: 电子钟 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 软件系统个模块功效简明介绍 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”, 进入时钟准备状态;第一次按电子钟开启/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。 1.3 设计课设计总体方案介绍及工作原理说明 本电子钟关键由单片机、键盘、显示接口电路和复位电路组成,设计课题总体方案图1所表示: 图1-1总体设计方案图 本电子钟全部软件、参数均存放在AT89C52Flash ROM和内部RAM中,降低了芯片使用数量简化了整体电路也降低了整机工作电流。键盘采取动态扫描方法。利用单片机定时器及计数器产生定时效果经过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理数据,同时经过端口读入目前外部控制状态来改变程序不一样状态,实现不一样功效。 二、设计课题硬件系统设计 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个读写中止口线,3级加密位; (10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功效; (11)有PDIP、PQFP、TQFP及PLCC等多个封装形式,以适应不一样产品需求。 它价格廉价,功效强大,能耗低。很大程度上降低总电路复杂性,提升了所设计系统稳定性。其芯片引脚图图2-1所表示。 图2-1 单片机AT89S52引脚图 2.1.2 按键电路 图2—2 按键图 三、设计课题软件系统设计 3.1 使用单片机资源情况 设计课题使用单片机资源情况以下: P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;调整选择键KEY1:P1.0;经过选择键选择调整位,选中位闪烁;增加键KEY2:P1.1;按一次使选中位加1;降低键KEY3:P1.2;按一次使选中位减1;此数字钟可实现基础走时和显示时间时、分、秒;时间调整;闹钟设定和调整;闹钟开启和关闭功效,具体以下: (1)实现基础走时和显示时间时、分、秒,上电自动显示初始时间12-59-00,且控制闹钟状态红色led灯为亮状态; (2)当第一次按下第一个弹性按键时进入时间调整状态,此时实现对显示时间小时调整,按下第二个按键时实现小时加一调整,按下第三个按键时实现小时减一调整; (3)当第二次按下第一个弹性按键时进入显示时间分钟调整状态,按下第二个按键时实现分钟加一调整,按下第三个按键时实现分钟减一调整; (4)当第三次按下第一个弹性按键时进入闹钟小时调整状态,按下第二个按键时实现闹钟小时加一调整,按下第三个按键时实现闹钟小时减一调整; (5)当第四次按下第一个弹性按键时进入闹钟分钟调整状态,按下第二个按键时实现闹钟分钟加一调整,按下第三个按键时实现闹钟分钟减一调整; (6)当第五次按下第一个弹性按键时返回正常显示时间走时状态; (7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间到蜂鸣器发出滴滴闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。闹铃状态默认为开启。 3.2 软件系统个模块功效简明介绍 本设计软件系统关键采取以下基础模块来实现,主程序、中止服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。 主程序:关键是用于对输入信号处理、输出信号控制和对各个功效程序模块利用及其控制。 中止服务程序:关键是用于电子钟正确运行、数据输入过程中闪烁。 键盘输入程序模块:关键是用于确定按键并得到特定键码值。 数码管及其驱动模块:关键是用于驱动数码管及利用数码管显示时间。 延时模块:程序中有两种延时子程序,一个是短延时用于判键按下等,一个是长延时。 3.3 软件系统程序步骤框图 系统软件采取汇编语言按模块化方法进行设计,然后经过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous 进行仿真,读出显示数据。 3.4 软件系统程序清单 本电子钟实现二十四小时制,8位数码管显示时分秒,显示式:12-59-00。 经过4只按键来调整时间: KEY1(P1.0):调整选择键,选中位闪烁; KEY2(P1.1):增加键,按一次使选中位加1; KEY3(P1.2):降低键,按一次使选中位减1; Bear(P3.1):到了整点和闹钟就会响; Led (P1.2):闪烁; P0口输出数码管段选信号,P2口输出数码管位选信号; 晶振12MHz。 图3-1主程序步骤框图 图3-2显示时钟数组子程序 图3-3中止服务程序程序 四、设计课题设计结论、仿真结果、误差分析 4.1 设计结论及使用说明 本设计为基于单片机电子钟设计。刚开始,我们很多地方理不清头绪,无从下手,但经过认真研究设计课题,找书上网查资料,确定基础设计方案,对所用芯片功效进行查找、调试,然后画电路图等,积累了很多宝贵经验。 本设计用2个四位一体共阳数码管做为显示器,它显示时间值;设计中有三个按键,其中KEY1为开启键,KEY2为加控制键 KEY3为减控制键 。 图4—1 结果图 4.2 仿真结果 在Proteus ISISDebug菜单中选择Execute,运行程序,系统仿真结果图所表示。 实现功效: 可调整运行电子钟含有三种工作状态:“d.1004-22”状态、运行状态、调整状态。 图4-2“d.1004-22”上电初始化运行状态仿真结果 图4-3时钟正常运行状态仿真结果 图4-4闹钟定时调整状态仿真结果 图4-5小时调整状态仿真结果 图4-6分钟调整状态仿真结果 结 束 语 单片机课程设计是一门很实用,很复杂设计。这个设计用到了单片机,电路等方面知识,经过这次课程设计,使我对单片机及其隶属电路有了一定了解,对书本上知识有了近一步掌握,也深刻明白了自己不足。   完成此次课程设计过程,是一个从无到有过程,经历了兴奋、所悟、完成多个过程。刚做做课程设计时,仔细阅读设计题目和要求,认为没什么困难,所用知识书上全部有。可是当我动手开始做时候,才发觉其中算法,设计是那么繁琐。经过一天努力,再到图书馆和网上查找资料,在经过借鉴很多类似资料,文件后,总算是有点眉目了。埋头苦干过程是痛苦,在思索算法和程序框架时,迷茫,烦躁,也参考她人思绪,不停循环中,最终最终完善了程序。其中煎熬是很痛苦,深刻明白攻克自己“未知领域”困难。但当课程设计完成时,那感觉是甜蜜,没有耕耘,哪来得收获喜悦,就在这么痛和愉快交换中,我学到了知识。   经过这短短一周实践,我感觉到自己从书本上学到理论知识和实践仍有很大差距。知道了很多元器件有什么功效,在仿真仪器中是什么代码。有知识,自己感觉已经掌握得差不多了,不过实际操作起来就有问题出现了。我碰到了不少问题,花费了很多时间。这让我重新反思我们学习,深刻领悟到我们这个专业动手,实践关键性。理论不经过实践考验,是没法实施,就像我们编程序,很多方面考虑全部不够,几乎没有包含到实际应用时防范方法方法。这次课程设计,让我学到了很多书本上学不到东西,学到了实际应用时。最大收获是:对键盘,显示器,C51语言应用有了深刻了解。 参考文件 [1] baidu文库,基于C51单片机程序设计. [2] baidu百科,AT89C52介绍 附录 附录A 程序清单 #include <reg51.h> #include <absacc.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit KEY1=P1^1; //切换键 sbit KEY2=P1^2; //minute ,hour调整加1定义 sbit KEY3=P1^7; //minute ,hour调整减1定义 sbit bear=P3^1; //闹铃 sbit led=P1^2; //闹钟,整时灯闪烁 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,0x7f}; uchar ms[8]={2,2,10,4,0,0,1,14}; uchar StrTab[8]; 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(); //闹钟子程序 /********************** 延时子程序*****************************/ void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<110;y++); } /**********************显示时钟子函数***************************/ void dispaly(uchar w[8]) { unsigned int i,j,aa; aa=0xfe; //位选初值1111 1110 for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示 { P2=aa; //位选 j=w[i]; //取出要显示数码 P0=tab[j]; //取出段选编码 aa=_crol_(aa,1); //位选信号循环右移 delay(1); //显示延时 P0=0xff; //消影 } } /***********************显示时钟数组子程序***********************/ void xianshishuzu() { StrTab[1]=second/10; //秒个位 StrTab[0]=second%10; //秒十位 StrTab[2]=10; //间隔符 - StrTab[4]=minute/10; //分个位 StrTab[3]=minute%10; //分十位 StrTab[5]=10; //间隔符 - StrTab[7]=hour/10; //时个位 StrTab[6]=hour%10; //时十位 } /**********************键盘扫描子程序*************************/ void keycan() { if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整, { delay(10); //按键1去抖和动作 if(KEY1==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(KEY2==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)hour1=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) { minute1--; 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)&(minute==0)) //整点报时 { for(i=0;i<10;i++) { TR0=1; beng();dispaly(ms); } } } /********************************定时闹钟*******************************/ void alarm() { uint i; if((hour==hour1&&second1==minute1&&(second>=second1&&second<second1+5))||(minute==0&&second<1)) for(i=0;i<3;i++) { beng();} StrTab[1]=second1/10; //闹钟秒个位 StrTab[0]=second1%10; //秒十位 StrTab[2]=10; //间隔符 - StrTab[4]=minute1/10; //分个位 StrTab[3]=minute1%10; //分十位 StrTab[5]=10; //间隔符 - StrTab[7]=hour1/10; //时个位 StrTab[6]=hour1%10; //时十位 TR0=0; dispaly(StrTab); xianshishuzu(); } /**************************中止子程序*********************************/ void time_() interrupt 1 //中止程序 { count++; TH0=(65536-50000)/256; //0.5ms重新送初值 TL0=(65536-50000)%256; if(count==20) //定时器计数,定时50ms,count满20,秒加1 { second++; count=0; if(second==60) //秒值等于60,秒清零,分加1 { second=0;minute++; if(minute==60) //分值等于60,分清零,时加1 { minute=0; hour++; if(hour==24) //时值等于24,时清零,返回,全部归零 { hour=0; } } } } xianshishuzu(); } /***********************数字电子钟主函数***************************/ void main() { P1=0XFF; TMOD = 0x11; //time0为定时器,方法1 TH0=(65536-50000)/256; //预置计数初值,50ms TL0=(65536-50000)%256; EA=1; //总中止开 ET0=1; //许可定时器0中止 TR0=1; //开启定时器0 while(1) //主循环 { if(flag==0) { TR0=0; dispaly(ms); //上电初始化就显示bad.1004-22 } if(P1!=0XFF) { keycan(); //按键提前扫描 } if(flag>0) { 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 } } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服