嵌入式实验报告——基于C51的电子时钟开发_第1页
嵌入式实验报告——基于C51的电子时钟开发_第2页
嵌入式实验报告——基于C51的电子时钟开发_第3页
嵌入式实验报告——基于C51的电子时钟开发_第4页
嵌入式实验报告——基于C51的电子时钟开发_第5页
已阅读5页,还剩16页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华中师范大学计算机科学系1嵌入式设计与开发实验报告课题基于51单片机的数字时钟开发起讫日期2012050520120511成员庞轩(2009211000)万奔(2009210000)院系计算机科学系专业计算机科学与技术指导老师刘明教授2012年5月11日实验成绩华中师范大学计算机科学系2一、设计目的设计开发一款电子时钟能够满足以下功能需求(1)设置数字时钟和日期;(2)显示数字时钟(时钟显示格式HHMMSS);(3)显示电子日期(日期显示格式YYMMDD);(4)计算并显示周数与星期(周数与星期显示格式WWWW);(5)数字计时跑表(显示格式MMSSMS)计时基本单位为001S;二、系统概述1设计开发环境(1(硬件设计工具PROTELDXP2004(2(硬件焊接工具电烙铁、万用表、焊锡丝、松香、钳子、镊子等(3(程序开发与调试CEILUVISION2(4(系统软硬件仿真PROTEUS782所需知识点C51单片机基本知识,初等焊接技术,C语言编程技术,开发软件的运用知识等。三、硬件系统设计1硬件电路分析硬件电路主要分为MCU供电电路、振荡时钟电路、数码管显示电路、串口数据通信电路、复位电路、矩阵键盘电路;2主要元器件华中师范大学计算机科学系33电路原理图4仿真电路图华中师范大学计算机科学系4四、软件系统设计1功能状态转换图STATE0STATE10STATE11STATE12STATE13STATE14STATE15BUTTON1BUTTON1BUTTON1BUTTON1BUTTON1STATE20BUTTON1时钟和日期设置模块BUTTON1STATE30STATE40BUTTON2SBUTTON2MBUTTON2DBUTTON2HBUTTON2MBUTTONYBUTTON3SBUTTON3MBUTTON3DBUTTON3HBUTTON3MBUTTON3YBUTTON4BUTTON4BUTTON4BUTTON4BUTTON4BUTTON4BUTTON2BUTTON4BUTTON3BUTTON4BUTTON4BUTTON4BUTTON2STATIC/UPDATEBUTTON3START/PAUSEENDPAUSEBUTTON2数字时钟功能状态转换图说明STATE0更新并显示主时钟STATE1015设置SSMMHHDDMMYY主时钟暂停工作)STATE20查看日期STATE30查看星期STATE40跑表计时器华中师范大学计算机科学系52软件函数设计根据程序代码重用和代码可读性的需要,主要设计以下15个函数AVOIDTIMER0_INTVOIDINTERRUPTTF0_VECTOR定时器T0中断服务程序功能动态刷新数码管显示、更新主时钟和秒表进位标识;BVOIDMAIN主函数功能设置程序寄存器或变量初始值以及进入主循环;CVOIDMAIN_WINDOW主循环函数功能检测键盘、设置功能状态、计算并更新显示缓冲区、后台运行秒表;DUCHARTEST_KEY键盘检测函数功能扫描按键矩阵并返回按键值04;EVOIDDELAYUINTSEC软件延时函数功能延时300MS防止按键抖动;FVOIDTIMERUN主时钟函数功能时钟运行并更新显示缓冲区;GVOIDTIMERUNBACK主时钟后台运行函数功能时钟后台运行;HUINTFMONTHUINTM月份天数获取函数功能根据月份读取年份返回当月天数;IUINTFWMONTHUINTM月份周偏移函数功能根据月份读取年份返回前一月最后一天的周偏移天数,方便计算周数和星期JVOIDSETTIME设置时间和日期函数功能设置格式HHMMSSYYMMDDKVOIDGETDATE读取当前日期函数功能显示格式YYMMDDLVOIDGETWEEK读取当天周数和星期函数功能显示格式WWWDMVOIDTIMER跑表实现函数功能跑表计时、保持、暂停、清空和后台运行;NVOIDUPDATE_BUFFERUINTPOS,UINTVALUE更新显示缓冲区函数;OVOIDTRIGGER_UPDATE读取功能状态触发更新显示缓冲区函数。3代码设计/标题电子时钟目标实现5大主要功能程序描述制作一个电子时钟时钟显示格式为HHMMSS日期显示格式为YYMMDD周数与星期显示格式WWWW并外加制作一个跑表延时时间由定时器0控制/INCLUDE/SPECIALFUNCTIONREGISTERDECLARATIONS/INCLUDEINCLUDE/INCLUDE华中师范大学计算机科学系6DEFINETF0_VECTOR0X01/定时器0的中断向量编号/DEFINEUCHARUNSIGNEDCHARDEFINEUINTUNSIGNEDINTDEFINEVALUE_PLUS10DEFINEVALUE_MINUS20DEFINEPLAY_PAUSE10DEFINESTART_END20CODEUCHARLED_SEG_DATA0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF/0F输出码CODEUCHARPOS_MASK0XFE,0XFD,0XFB,0XF7,0XEF,0XDF/LED1LED6显示掩码CODEUCHARKEY_ENCODE0XEE,0XED,0XEB,0XE7/按键码KEY1KEY4CODEUCHARKEY_SCAN40XFE,0XFD,0XFB,0XF7/按键检测码UCHARDATAMONTH1231,28,31,30,31,30,31,31,30,31,30,31/月份天数31、30、28UCHARDATALED_CONTROL110X0,0X0,0X0,0X0,0X1,0X1,0X0,0X0,0X0,0X0,0X0/显示保存LED_CONTROL02HHMMSSLED_CONTROL35YYMMDDLED_CONTROL68MMSSMSLED_CONTROL910WEEKSWEEKDAYUCHARDATADISP_BUFFER60XC0,0XC0,0XC0,0XC0,0XC0,0XC0/显示缓冲区UINTDATAMSEC/定时MSECMSBITTIME_OUT/定时1秒标志BITDIRTYBITFLAG1,FLAG2UCHARIUCHARSEND_BITUCHARKEY_CODEUCHARDATASTATE0X0UCHARVALUE0X0UCHARDATAKEYUCHARTEMP/函数声明/UINTFMONTHUINTMUINTFWMONTHUINTMVOIDDELAYUINTSECVOIDTIMERUNVOIDTIMERUNBACKUCHARTEST_KEYVOIDSETTIMEVOIDGETWEEKVOIDTIMERVOIDGETDATEVOIDMAIN_WINDOWVOIDUPDATE_BUFFERUINTPOS,UINTVALUEVOIDTRIGGER_UPDATE/程序说明定时器0中断服务程序,中断服务程序应尽量短小华中师范大学计算机科学系7快速返回创建时间修改时间执行时间8US/VOIDTIMER0_INTVOIDINTERRUPTTF0_VECTORTR00ET00/关闭中断和定时器,避免嵌套/P2|POS_MASKSEND_BIT/P2|0X20,0X10,0X08,0X04,0X02,0X01相应位依次不亮P2|045其他位不变IFSEND_BIT5/SEND_BIT0P0DISP_BUFFERSEND_BIT/P0DISP_BUFFER150P2/P2/置位秒进标识MSEC0/重新延时TH0850/256/定时器定时基值X的算法/TL08502561/XT0X10000,故X是T的补码经调试定时855加上关中断花的时间66共为921,恰好为1MS/ET01/此种方法计算基值采用了求补码的方法/TR01IFFLAG2IFMSEC100/秒表开关LED_CONTROL6/0MS进数/程序说明设置时间HHMMSSYYMMDD创建时间201255修改时间201255执行时间25US/VOIDMAINP20XFF/P2置位都不亮P10X0/P1置位一半对一半P00XFF/以0初始化显示端口/TIME_OUT0/1秒延时标志位清零DIRTY1/周数、周日不正确标志位置位STATE0/显示状态默认为数字钟VALUE0FLAG10/清空跑表按键1标识位华中师范大学计算机科学系8FLAG20/清空跑表按键2标识位此时跑表能在后台运KEY4TMOD0X01/定时器0工作在模式1/TH0850/256/定时器定时基值X的算法/TL08502561/XT0X10000,故X是T的补码实现定时1MS/ET01/定时中断打开EA1/中断总开关打开TR01/定时器开始工作MAIN_WINDOW/程序说明程序主界面1。刷新显区;2。读取显区状态;3计算并更新显区;4扫描键盘(更新显区状态)创建时间201255修改时间201259执行时间40US/VOIDMAIN_WINDOWWHILE1SWITCHSTATE/10CASE0/主模式0前台运行时钟IFTIME_OUTTIMERUNTIME_OUT0BREAKCASE1/次模式1设置时间HHMMSS和YYMMDD此时时钟停止工作SETTIMEBREAKCASE2/次模式2显示日期YYMMDDGETDATEBREAKCASE3/次模式3显示周数及星期WKWDGETWEEKBREAKCASE4/次模式4启动秒表模式MMSSMSTIMERBREAKKEYTEST_KEY/检测输入键盘并返回0、1、2、3、4/后台运行跑表计时IFFLAG21LED_CONTROL7华中师范大学计算机科学系9IFLED_CONTROL760LED_CONTROL70LED_CONTROL8IFLED_CONTROL860LED_CONTROL80/开启键盘功能IFKEY4SWITCHKEYCASE0/按键0被按下IFSTATE0/如果之前为主模式0,则进入次模式1。STATE10TRIGGER_UPDATE/触发更新显示区为时钟设置模式HHMMSSELSESTATEIFSTATE16/菜单重新返回主模式0STATE0TRIGGER_UPDATE/触发更新主模式0。BREAKCASE1/按键1被按下IFSTATE0/如果之前为主模式0,则进入次模式2STATE20TRIGGER_UPDATE/触发更新次模式2ELSE/除此之外VALUE值置10VALUEVALUE_PLUSBREAKCASE2/按键2被按下IFSTATE0/如果之前为主模式0,则进入次模式3STATE30TRIGGER_UPDATE/触发更新次模式3ELSE/除此之外VALUE值置20VALUEVALUE_MINUSBREAKCASE3/按键3被按下IFSTATE0/如果之前为主模式0,则进入次模式4。STATE40TRIGGER_UPDATE/触发更新次模式4ELSE/此外此键可在其他任何模式下直接返回主模式0华中师范大学计算机科学系10STATE0TRIGGER_UPDATE/触发更新主模式0BREAKDEFAULTBREAK/程序说明检测按键码创建时间201255修改时间201255执行时间35US300MS/UCHARTEST_KEYKEY_CODE0FORI0I0IFORJ50J0JWHILESEC/程序说明主时钟运转并显示创建时间201255修改时间201255执行时间20US/VOIDTIMERUNLED_CONTROL0IFLED_CONTROL059LED_CONTROL00LED_CONTROL1IFLED_CONTROL159LED_CONTROL10LED_CONTROL2IFLED_CONTROL223LED_CONTROL20LED_CONTROL9IFLED_CONTROL97LED_CONTROL91LED_CONTROL10LED_CONTROL3华中师范大学计算机科学系13IFLED_CONTROL3FMONTHLED_CONTROL4LED_CONTROL31LED_CONTROL4IFLED_CONTROL412LED_CONTROL41LED_CONTROL101LED_CONTROL5IFLED_CONTROL599LED_CONTROL50DISP_BUFFER4LED_SEG_DATALED_CONTROL210DISP_BUFFER5LED_SEG_DATALED_CONTROL2/10DISP_BUFFER2LED_SEG_DATALED_CONTROL110DISP_BUFFER3LED_SEG_DATALED_CONTROL1/10DISP_BUFFER0LED_SEG_DATALED_CONTROL010DISP_BUFFER1LED_SEG_DATALED_CONTROL0/10/程序说明主时钟后台运行创建时间201255修改时间201255执行时间12US/VOIDTIMERUNBACKLED_CONTROL0IFLED_CONTROL059LED_CONTROL00LED_CONTROL1IFLED_CONTROL159LED_CONTROL10LED_CONTROL2IFLED_CONTROL223LED_CONTROL20LED_CONTROL9IFLED_CONTROL97LED_CONTROL91LED_CONTROL10LED_CONTROL3IFLED_CONTROL3FMONTHLED_CONTROL4LED_CONTROL31华中师范大学计算机科学系14LED_CONTROL4IFLED_CONTROL412LED_CONTROL41LED_CONTROL101LED_CONTROL5IFLED_CONTROL599LED_CONTROL50/程序说明返回前月最后一天的周偏移天数创建时间201255修改时间201255执行时间5US/UINTFWMONTHUINTMIFM1RETURN0ELSERETURNFMONTHM17FWMONTHM1/程序说明设置时间HHMMSSYYMMDD创建时间201255修改时间201255执行时间100US/VOIDSETTIMETEMP2STATE103IFMSEC99LED_CONTROL60LED_CONTROL7IFLED_CONTROL760LED_CONTROL70LED_CONTROL8IFLED_CONTROL860LED_CONTROL80IFFLAG1TRIGGER_UPDATEVALUE0/程序说明获取YYMMDD创建时间201257修改时间201257执行时间11US/VOIDGETDATEIFTIME_OUTTIMERUNBACKTIME_OUT0TRIGGER_UPDATEVALUE0华中师范大学计算机科学系18/4程序测试有感民谚说“好事多磨难”。这些天没日没夜的编码与程序调试说句心里感受快乐并痛苦着尤其是遇到一个隐藏的对手你不知道它在哪儿,唯一能感受到它的存在就是你正被打,并还知道很疼。在本次实验中我就遇到了这样变态不人道的敌人。像往常一样,很顺利地编码完成,编译一遍,哈哈无语法错误检查一遍,灰貌似也没逻辑错误以为也能像往常一样幸运,能一次就经受住实践的检验,完成认识的第二次飞跃。怀着忐忑的心情把代码烧入芯片,并给电路板加上电,就像在等待上帝的审判两只眼睛死死地盯着数码显示管。“01、02”渐渐我嘴角隐隐露出一丝笑容轰隆08、08过后数码管就毫无规律地狂闪不停。我勒个神,才8秒,牙齿都还露出来ORZ不过还好,写程序这样的情况时常出现的,通常10分钟内PC又能回到它正确的轨道上来,我这样安慰着自己。一遍、两遍这次情况貌似很特殊,逻辑完整,可程序运行依然错误。又经过一遍检查,我甚至连一个可有可无的花括号都不轻易放过,可PC似乎并不看好我苦心的劳动。拘束惯了的它,像脱缰的野马,突然找回了它和它祖先一代代都向往着的自由主义,狂野地在一片广阔(2KB)的2进制中驰骋。好吧,小小地可怜一下你,让你逍遥几个小时。不知真出于人性的恻隐之心还是眼睛痛苦地不断警告,我竟然放过那个狂放的家伙儿。世事总有那么些决择,道不出明确的理由放过那家伙,发现对自己也是一直解脱,接下来的40分钟美美地睡上一觉。像往常一样8秒钟入睡,值得欣慰这次没抛出异常大概30分钟后被一段急促的电话震动吵醒,电话中奔儿火急火燎地说今下午验收实验询问我当前所处三维坐标。朦朦胧胧地说了几句就草草地挂断了电话,细细一看,5个未接来电,顿时对他的着急表示理解ORZ执着的孩子伤不起20分钟内我们在寝室炮制了一份实验报告,完完整整15页。拿着打印后的实验报告,我初略翻了一下,竟然发现片尾还有一篇800字左右的实验总结。这哥们儿确实也是一神人,第一感觉是我们社会主义(初级阶段)建设正需要这样的人才途中偶然遇到玉树临风的杜宽地途经博雅广场笑着和我打了声招呼后继续风度翩翩地走远记不清那天他为什么会低踏足率的路经过,不过杜氏笑容让我不安的心稍微有底。来到实验室一看,没想到4点后还这么热闹,第一次大家都是伤不起的一群孩子与我们情况不一样,他们的程序大多能跑,只是实验报告没能及时赶出。而回想我们的实验报告能够在极短时间完成大部分要归功于奔儿。回过头来,此时实验辅导老师那绝对堪称一“热点”。说起这位辅导老师,与他有过好几次接触,不光在实验课上,在他们研究生的讨论会上也有过两次碰面。孟大哥,准师兄,人高大魁梧,不光有着北方人的体型,还有着高原孕育出的豪爽性格。等老师那儿降下温来,我立即凑上去表明了来意,他也随即答应把板子借于我,我说周一能还他。记下他的电话后,我轻松地离开了实验室提起师兄,我还得多说几句。第一次认识是他们的研究生谈论会上,虽身处华中师范大学计算机科学系19同一个教室,不过我也没大太多留意他们的讨论,除了当时我还有自己活儿要做外,关键也估计自己也听不明白他们讨论的问题。后来是在课堂上,我们老师无意提及他的研究生团队花了两周时间做成功了一个“IPAD”,里面集成数据通讯模块,能接WIFI“热点”。当时我正对无线电通讯感兴趣,自那时这些师兄师姐在我心中的分量又重了些许。我想孟师兄也属于这一团队重新回到寝室,“悄悄”打开代码研究起来(嘿嘿,也是由于一室友超鄙视我为一数字时钟这般纠结。哎,难啊谁让我们这一专业处于如此尴尬的境地,弄到不知道自己该搞硬件强还是软件强。姑且不论这些,虽然揪心,然而我也习惯陶醉于其中的乐趣)。在给代码下“无语法和逻辑错误”的最后判决书后,虽然大多数错误面前,我宁愿怀疑自己错了,而不愿去考虑机器的不完善。然而,面对如此隐藏的对手,也只能不放过任何找出它的可能性。培根式的还原论不就是鼓励我们在当前整体研究不清楚的时候,就把整体细分成多个部分往底层研究。而C语言的底层是汇编,我勒个神,我想很少有程序员愿意去细看那些伟大而艰涩的字符,当然我也是可怜的PC,初始化后8秒钟就跑丢迷路了,然后再也没有回来就像是丢了自己的孩子,我暗暗决心把它给找回来,不管多少困难。当然这次我知道不是因为我对它有太多感情,而是因为它代表了我这两天的劳动。当然也包含一种好奇心,证明自己经多次检查的逻辑错了或是编译器错了的好奇心。我想不管哪一个错误被发现,其意义都远远超出了程序本身。或许是由于顿悟,我猛然想起每一个优秀的编译器上都附加一个程序调试器。说起调试,虽然这个词用了多少次我自己都数不清,几乎每次一次实验报告都出现它的响亮名字。然而,我却从未真正了解并使用过它(弱弱地BS一下自己)。当然不是看不起它的伟大发明,而主要是因为没多大时候能用上去。对于以往的程序错误,如果是自己的CODE,语法错误概率已经很低了,而逻辑错误通过简单的测试语句10分之内就能迅速找到病源。再则就是人家的代码,胡乱COPY一番,发觉到了自己的机器不兼容问题源源不断。对于这样的情况,查找问题是很难受的,如果20分钟仍没头绪,通常就会果断放弃。(这或许就应了人家的孩子没感觉)这下我像医生一样悉心地观察我的病人表征程序通用寄存器值的变化,通过几次试运行折半查找式的缩小问题范围。终于找到在一次中断程序运行中,通用寄存器被占用,而在中断结束时并未恢复之前被无意修改的值。也是,从来没有老师说过中断会保存除PC和PSW外的通用寄存器值。可是我还没听说过能有什么办法阻止或限制程序使用通用寄存器,就像它们的名字一样,它们是系统的公共资源,就像公园一样,任何想去的人都能使用。难道要我在公园面前树立一张牌子,写着“XXX不许入内”那还是公园吗不过细想,我们也总不能让所有人都有相同权限进出公园吧,比如破坏者、捣蛋者或恐怖分子我们就不能让它们进去,要不它们就会破坏或降低公共资源为公众服务的质量。想到这里,我顿时开朗起来也能理直气壮地去公园门前树立一面牌子,写着“恐怖分子,甭想进入公园”。我想基于设计哲学和系统的完整性,一定有一种方法可以限制这些破坏者随意进入公共资源。当然剩下的事情就交付于GOOGLE或百度,果不其然,很快我就找到了解决问题的办法。问题就出在一句谁都很少留意的代码VOIDTIMER0_INTVOIDINTERRUPTTF0_VECTORUSING0这里明明就标注者“为提高公园娱乐性,允许恶搞者进入公园0区表演”,可惜这位恶作剧者并不像想象中的那么安分,在给观众带来娱乐的同时,还借机跑到公园其他区域坑蒙拐骗、倚强凌弱、欺负弱小,就像我家的PC,就是被它跑到公园7区拐骗走的。对于这样的家伙儿我们怎么办这次我是公园管理员,华中师范大学计算机科学系20嘿嘿,解决办法三个字“请出去”于是改为VOIDTIMER0_INTVOIDINTERRUPTTF0_VECTOR这下我们的公园又恢复了往常的秩序,迷失的PC也终于结束了它吃不饱穿不暖的流浪生活,回到了他的往日正常的生活轨迹上来。最后不得不提及一下,对于恐怖分子我们永远说“NO”,而对于恶搞的娱乐者,适当时候还是可以把它放进来HAPPY一下,这样大家大家的生活就会更美好。小小的实验终于圆满完成,就情不自禁小小地得瑟了一下,接上电源让电子钟在寝室工作了起来。室友对此表示很无语,那家伙像个定时炸弹的定时器一样高调地在寝室读秒,还好是递增不是递减,否则真担心会被肢解。36小时后误差不到1S,我知道根据计算2462400S后将会累积到6S的误差,可我已不想再为此做出任何努力,数字似的精确永远都是一定精度范围内的相对精确,所以完美在数字时代也是一个相对意义的词。在篇尾感谢美国国防部,是他们设计搭建了第一代互联网,极大丰富了大家信息沟通方式;感谢李彦宏,是他既佩奇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论