资源描述
单片机课程设计报告题目:电子日历和电子表2003级自动化一班指导老师: 完成日期:2006年6月15日一设计题目:电子日历和电子表二设计要求:1利用8031作为主控器组成一个电子日历和电子表;2上电或RESET后能自动显示当前时间(时:分),首次上电复位显示为0时0分;以后各次均显示正确的当前时间;3 利用4个LED显示管分时显示当前时间和日历;4 利用尽可能少的小键盘(开关)实现1)校正日历和时间,即当前的日历和时间输入计算机2)显示选择:时分显示/日历显示/报警显示3)报警时间的设置5 利用发光二极管作为报警指示,当报警时间到,二极管发光。三系统设计方案(简略):在本次课程设计中经过我们的认真研究我们决定采用8031内部的定时/计数器T0作为时间基准,工作在定时状态时每隔100MS产生一次中断,每10次中断秒计数器加1。由于本实验的CPU晶振频率是6MHZ,所以定时器T0的时间常数是3CB0H,即TH0=3CH,TL0=BOH。以此作为电子日历和电子表的基本计时器。时间常数=65536-6000000*0.1*(1/12)=15536=3CB0H对于共阴极LED显示利用8155的动态扫描显示,8031的P0口的输出显示送到8155的地址AD口。8155的PA,PB口输出。PB口为显示管段输出口,通过驱动芯片7407接LED的ad.p位。输出相应的段码,PA口为显示管位输出口,它的PA0到PA3通过驱动芯片7406作为相应的位码输出。利用两个开关L分别接8031的P1.0,P1.1对电子钟和电子日历的显示状态进行控制,并且完成相应的调时以及报警定时工作。利用发光二极管接到8031的P3.0口,当报警时间到将P3.0置1完成报警显示四元件清单:8155 一片7407 两片7406 一片 开关 两个 LED共阴极数码管 四个 发光二极管 一个 面包板 一个 万用表 一个 仿真头 一个 拔线钳 一把镊子 一把 细导线若干剪刀 一把 五设计原理图:2764803181554位LED显示管小键盘5V 六电气结构图:P1.0P1.1P0.0P0.7ALEWRRDRSTPB0AD0.PB7ADALEWRRDPA0RSTPA1PA2PA374072片74065V8个100欧电阻4个LED显示管七使用说明书:按键0的功能:1、实现显示模式的转换:不按时是显示时、分(时间)。按下第一次是显示日、月(日历)。按下第二次是显示报警时、分(报警)。按下第三次是显示秒、十分之一秒。按下第四次显示时、分。如此进行按键循环2、在按键1(调整鍵)动作后实现对日历,时间,报警时间的调整。具体操作为当1键显示要调整的位时,0键实现对这一位的累加,即按下一次示数加一。按键1的功能:实现对显示时间(时间、日历、报警时间)要调整的位转换:1、 当前显示时、分时,按键1按下第一次调分位,按下第二次调时位,按下第三次循环到当前显示状态,不能调整。2、 当前显示日、月时,按键1按下第一次调日位,按下第二次调月位,按下第三次循环到当前显示状态,不能调整。3、 当前显示报警时、分时,按键1按下第一次调分位,按下第二次调时位,按下第三次循环到当前显示状态,不能调整。在按键1的基础上通过按键0来实现调整。八软件设计:主程序流程图:开始置8155控制字显示单元置初值、T0初始化时间计数器清零、T0开中断取时、分、日、月、报警时间等变换后送相应的显示单元调用显示子程序调用按键0判断子程序按下?调用15次显示子程序消抖按下?调用按键0处理子程序调用15次显示子程序消抖调用按键1判断子程序按下?按下?是是是否否否否调用按键1处理子程序时间中断子程序流程图:中断入口置T0时间常数,1/10秒计数器加一1/10秒计数器10?1/10秒计数器清零秒计数器加一,十进制调整秒计数器60?秒计数器清零分数器加一,十进制调整分计数器60?分计数器清零时数器加一,十进制调整时计数器24?时计数器清零天数器加一,十进制调整二月?29日?1、3、5、7、8、10、12月?31日?否否否否否否否否32日?日计数器清零,月计数器加一,十进制调整13月?月计数器置1返回主程序否否显示子程序流程图:入口显示缓冲区首地址送R0,取待显示数,解压并存缓冲区时十位缓冲单元地址送R0,送相应扫描模式初值到R2,调整状态初值送R1段码表首地址送DPTR,查表取段码,小数点显示模式送R3是小数点显示模式1?是小数点显示模式2?调整状态是1吗?调整状态是3吗?小数点段码(显示小数点)小数点段码否否否否段码送8155B口,位码送8155A口延时修改段码地址位扫描右移,调整状态加1扫描完成?返回主程序否入口P1.0置1,P1.0送C返回主程序1号键判断子程序与0号键子程序雷同,只需将P1.0改成P1.1即可0号键判断子程序:0号键处理子程序流程图:入口键值送A0模式?1模式?2模式?60分?调分模式?日、月显示方式送显示状态缓冲,键值加1报警显示方式送显缓,键值加1小时数加1,十进制调整时、分显示方式送显缓,键值加1缓冲器清零否否否否否调时模式?分加1,十进制调整24小时?时缓冲器清零返回主程序调月模式?调天?调报警时?调报警分?月加1,十进制调整12月?天加1,十进制调整报警时加1,十进制调整报警分加1,十进制调整30号?日缓冲器置1月缓冲器置124小时?报警时清零60分?时?报警分清零返回主程序否否否否否否否否否否1号键处理子程序流程图:入口键值送A时、分显示?调时模式?显日月模式?调分模式?调日模式?调月模式?调时模式送KEYBUF调分模式送KEYBUF置小数点2模式调月模式送KEYBUF置小数点1模式调日模式送KEYBUF置小数点2模式模式0送KEYBUF置小数点0模式调报警时送KEYBUF置小数点显示1KEYBUF置显示模式2,小数点显示0显示方式2报警?调报警时模式?调报警分送KEYBUF置小数点显示2显示报警模式送KEYBUF,置小数点灭,显示模式3调报警分模式?返回主程序否否否否否否否否显示方式3?显示模式送KEYBUF,置小数点灭,显示模式4否程序清单DISBUFEQU30HBUFEQU20HSECBUFEQU21HMINBUFEQU22HHOUBUFEQU23HDAYBUFEQU24HMONBUFEQU25HALARMMINEQU26HALARMHOUEQU27HTEMP_BUF1EQU28HTEMP_BUF2EQU29HDISP_STATUSEQU2AHCHG_BIT EQU2BHALARMINGEQU2CHKEYBUFEQU2DHP_CONEQU7F00HPORT_AEQU7F01HPORT_BEQU7F02HMODE1EQU0MODE2EQU1MODE3EQU2MODE4EQU3HOUCHGEQU4MINCHGEQU5MONCHGEQU6DAYCHGEQU7AHOUCHGEQU8AMINCHGEQU9ORG8000HLJMPSTARTORG8003HLJMPINT_KEY0ORG800BHLJMPCLOCKORG8013HLJMPINT_KEY1ORG8030HSTART:MOVSP,#60HMOVDPTR,#P_CONMOVA,#03H ;8155初始化PA,PB同为输出口 MOVXDPTR,AMOVA,#00HMOVR1,#04HMOVR0,#DISBUFLP1:MOVR0,AINCR0DJNZR1,LP1ANLTMOD,#0F0H ORLTMOD,#01H MOVTL0,#0B0H MOVTH0,#3CH ;定时器0置初值MOVBUF,#00HMOVMINBUF,#00H MOVHOUBUF,#00H ;时间设初值00时00分MOVDAYBUF,#01H MOVMONBUF,#01H ;日历设初值01月01日MOVALARMMIN,#30HMOVALARMHOU,#00H ;报警时间设初值00时30分 MOVKEYBUF,#00HSETBTR0SETBET0 ;开中断0SETBEASETBEX0SETBEX1SETBIT0SETBIT1CLRP3.0MOVDISP_STATUS,#1MOVCHG_BIT,#0DISP1:MOVA,DISP_STATUSCJNEA,#1,DISP2MOVTEMP_BUF1,HOUBUFMOVTEMP_BUF2,MINBUF ;时间放置暂时显示缓冲单元SJMPDISP5DISP2:CJNEA,#2,DISP3MOVTEMP_BUF1,MONBUFMOVTEMP_BUF2,DAYBUF ;日历放置暂时显示缓冲单元SJMPDISP5DISP3:CJNEA,#3,DISP4MOVTEMP_BUF1,ALARMHOUMOVTEMP_BUF2,ALARMMIN ;报警时间放置暂时显示缓冲单元SJMPDISP5DISP4:CJNEA,#4,DISP5MOVTEMP_BUF1,SECBUFMOVTEMP_BUF2,BUF ;秒放置暂时显示缓冲单元DISP5:LCALLDISPLAY ;调用显示子程序ACALLIS_KEY0 ;调用判断按键0子程序JCNEXT_KEY1 ;无按下转按键1的判断 MOVR7,#0FHKEY0:ACALLDISPLAYACALLIS_KEY0 ;调用15次显示子程序对按键进行消抖JCNEXT_KEY1ACALLINT_KEY0 ;按键0按下则执行按键0子程序NEXT_KEY1:ACALLIS_KEY1 ;调用判断按键1子程序JCDISP1MOVR7,#0FHKEY1:ACALLDISPLAYACALLIS_KEY1JCNEXT_KEY1ACALLINT_KEY1 ;按键1按下则执行按键1子程序SJMPDISP1IS_KEY0:MOVP1,#0FFH ;判断按键0子程序MOVC,P1.0RETIS_KEY1:MOVP1,#0FFH ;判断按键1子程序MOVC,P1.1RETDISPLAY:MOVR0,#DISBUF ;显示子程序MOVA,TEMP_BUF1SWAPAANLA,#0FHMOVR0,AINCR0MOVA,TEMP_BUF1ANLA,#0FHMOVR0,AINCR0MOVA,TEMP_BUF2SWAPAANLA,#0FHMOVR0,AINCR0MOVA,TEMP_BUF2ANLA,#0FHMOVR0,AINCR0ORG_DISPLAY:MOV R0,#DISBUF+3MOVR2,#08HMOVR1,#0DIS_LP:MOVDPTR,#SEG_TABMOVA,R0MOVCA,A+DPTRMOVR3,CHG_BITCJNER3,#1,CC1CJNER1,#1,CC1ORLA,#80HCC1:CJNER3,#2,CB1CJNER1,#3,CB1ORLA,#80HCB1:MOVDPTR,#PORT_BMOVXDPTR,AMOVDPTR,#PORT_AMOVA,R2MOVXDPTR,AMOVR3,#00HDJNZR3,$DECR0MOVA,R2RRAMOVR2,AJNBACC.7,DIS_LPRETSEG_TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHCLOCK:MOVTL0,#0B0H ;时间子程序MOVTH0,#3CHPUSHPSWPUSHACCMOVA,ALARMING ;报警时间处理CJNEA,#1,NEXT1NEXT1:JCNEXT2DJNZALARMING,NEXT2 ;报警时间延时CLRP3.0NEXT2:MOVA,BUFADDA,#01HMOVBUF,ACJNEA,#0AH,C_ALARMMOVBUF,#00H MOVA,SECBUF ADDA,#01H ;1/10秒满10次清零,秒加1DAAMOVSECBUF,ACJNEA,#60H,C_ALARMMOVSECBUF,#00HMOVA,MINBUFADDA,#01H ;满60秒,秒清零,分加1DAAMOVMINBUF,ACJNEA,#60H,C_ALARMMOVMINBUF,#00HMOVA,HOUBUFADDA,#01H ;满60分,分清零,时加1DAAMOVHOUBUF,ACJNEA,#24H,C_ALARMMOVHOUBUF,#00HMOVA,DAYBUFADDA,#01H ;满24小时,时清零,天加1 DAAMOVDAYBUF,AMOVA,MONBUFFEB:CJNEA,#02H,NO2 ;判断月份,不是2月转NO2子程序MOVA,DAYBUF CJNEA,#29H,C_ALARM D1:MOVDAYBUF,#00H MOVA,MONBUFADDA,#01H ;是2月满28天,日为1月进1DAAMOVMONBUF,ANO2:CJNEA,#01H,D2 ;不是1月转D2B1:MOVA,DAYBUFCJNEA,#32H,C_ALARMAJMPD1 ;是1月满31天,日为1月进1D2:CJNEA,#03H,D3 ;不是3月转D3AJMPB1 ;是3月满31天,日为1月进1D3:CJNEA,#05H,D4 ;不是5月转D4AJMPB1 ;是5月满31天,日为1月进1D4:CJNEA,#07H,D5 ;不是7月转D5AJMPB1 ;是7月满31天,日为1月进1D5:CJNEA,#08H,D6 ;不是8月转D6AJMPB1 ;是8月满31天,日为1月进1D6:CJNEA,#10H,D7 ;不是10月转D7AJMPB1 ;是10月满31天,日为1月进1D7:CJNEA,#12H,D8 ;不是12月转D8AJMPB1 ;是12月满31天,日为1月进1D8:MOVA,DAYBUFCJNEA,#31H,C_ALARMAJMPD1 ;是4,6,9,11月满30天,日为1月进1D9:CJNEA,#13H,C_ALARM MOVMONBUF,#01H ;满12月,月为1C_ALARM:MOVA,ALARMHOU ;报警时间判断CJNEA,HOUBUF,INT_DONEMOVA,ALARMMINCJNEA,MINBUF,INT_DONESETBP3.0 ;报警时间和当前时间一致就点亮二极管MOVALARMMING,#10 ;二极管点亮一分钟INT_DONE:POPACCPOPPSWRETI ;时间中断处理完毕INT_KEY0:MOVA,KEYBUF ;按键0功能子程序CJNEA,#MODE1,N01 MOVDISP_STATUS,#2 ;按键0按下一次显示日历INCKEYBUFAJMPEXITN01:CJNEA,#MODE2,N02MOVDISP_STATUS,#3 ;按键0再按下一次显示报警时间INCKEYBUFLJMPEXITN02:CJNEA,#MODE3,N03MOVDISP_STATUS,#4 ;按键0再按下一次显示秒钟INCKEYBUFLJMPEXITN03:CJNEA,#MODE4,N04MOVDISP_STATUS,#1 ;按键0按下一次返回显示时间INCKEYBUFLJMPEXIT N04:CJNEA,#HOUCHG,N05 MOVA,HOUBUF ;调时间的小时状态INCA ;按下按键0对小时加1DAAMOVHOUBUF,ACJNEA,#24H,TT1TT1:JCEXITMOVHOUBUF,#0 ;小时满24时清零 SJMPEXITN05:CJNEA,#MINCHG,N06MOVA,MINBUF ;调时间的分钟状态 INCA ;按下按键0对分钟加1DAAMOVMINBUF,ACJNEA,#60H,TT2TT2:JCEXITMOVMINBUF,#0 ;分钟满60分清零SJMPEXITN06:CJNEA,#MONCHG,N07 MOVA,MONBUF ;调日历的月份状态INCA ;按下按键0对月份加1DAAMOVMONBUF,ACJNEA,#13H,TT3TT3:JCEXITMOVMONBUF,#1 ;月份满12月置1SJMPEXITN07:CJNEA,#DAYCHG,N08 MOVA,DAYBUF ;调日历的天状态INCA ;按下按键0对天加1DAAMOVDAYBUF,ACJNEA,#32H,TT4TT4:JCEXITMOVDAYBUF,#1 ;天满31天置1SJMPEXITN08:CJNEA,#AHOUCHG,N09 MOVA,ALARMHOU ;调报警时间的小时状态 INCA ;按下按键0对报警时加1DAAMOVALARMHOU,ACJNEA,#24H,TT5 TT5:JCEXITMOVALARMHOU,#0 ;小时满24时清零 SJMPEXITN09:CJNEA,#AMINCHG,EXITMOVA,ALARMMIN ;调报警时间的分钟状态 INCA ;按下按键0对报警分加1DAAMOVALARMMIN,ACJNEA,#60H,TT6TT6:JCEXITMOVALARMMIN,#0 ;分满60分清零 EXIT:RETINT_KEY1:MOVA,KEYBUF ;按键1功能子程序CJNEA,#MODE1,N11MOVKEYBUF,#MINCHG ;在时间模式时按键1按下一次调分MOVCHG_BIT,#1SJMPEXIT1N11:CJNEA,#MINCHG,N12MOVKEYBUF,#HOUCHG ;按键1再按下一次调时MOVCHG_BIT,#2SJMPEXIT1N12:CJNEA,#HOUCHG,N13MOVKEYBUF,#MODE1MOVDISP_STATUS,#1 ;按键1再按下一次显示时间模式MOVCHG_BIT,#0SJMPEXIT1N13:CJNEA,#MODE2,N14 ;在日历模式时按键1按下一次调日MOVKEYBUF,#DAYCHGMOVCHG_BIT,#1SJMPEXIT1N14:CJNEA,#MINCHG,N15 ;按键1再按下一次调月MOVKEYBUF,#MONCHGMOVCHG_BIT,#2SJMPEXIT1N15:CJNEA,#HOUCHG,N16MOVKEYBUF,#MODE2MOVDISP_STATUS,#2 ;按键1再按下一次显示日历模式MOVCHG_BIT,#0SJMPEXIT1N16:CJNEA,#MODE3,N17 MOVKEYBUF,#AMINCHG ;按键1按下一次调报警分MOVCHG_BIT,#1SJMPEXIT1N17:CJNEA,#AMINCHG,N18MOVKEYBUF,#AHOUCHG ;按键1再按下一次调报警时MOVCHG_BIT,#2SJMPEXIT1N18:CJNEA,#AHOUCHG,EXIT1MOVKEYBUF,#MODE3 MOVDISP_STATUS,#3 ;按键1再按下一次显示报警时间模式MOVCHG_BIT,#0SJMPEXIT1EXIT1:RETEND九设计结果: 经过为期两个星期的单片机课程设计,我们所做的电子日历和电子表最终比较完美的实现了设计要求。LED管显示很明显,亮度非常高,走时很精确,其中时间和日历还有报警时间的设定以及调整都能很好的实现。在设计的过程中,我们还多加了一个显示功能,即秒和1/10秒的显示,使得时间显示得更加完美。报警时间设定为一分钟,也就是说当报警时间和当前时间一致时,发光二极管可以持续点亮一分钟。但在本次的设计中还存在一些不足之处:我们为了程序设计的进度,忽略了闰年的情况,将二月都定为了28天。并且在时间和日历的调整上每月都可以调到31天。除此之外其他方面都很正常。十心得体会:经过一个多星期的努力,我和邓明的课程设计电子日历和电子表,终于获得圆满的结果,看着电子日历和电子时钟正常的跳动,我的心理有着说不出的高兴,任何事情的成功都来的不容易,我们的课程设计的这个小小成功也经过了困难和艰辛的付出。在这次课程设计中我主要负责的是硬件电路的设计,首先是原理图的设计,之前做过单片机实验,所以我们对8155、74LS06、74LS07、LED显示管等并不陌生,认真的研究过本课题的要求后,我们还是有个整体的思路,经过我和同组的邓明的商量后,我们把原理图较快的画了出来,并在老师的检查下拿到了设计所需器材等。接下来就是根据原理图接线了,由于女孩子比较细心,所以我就负责接线,当然同组的同学就负责软件的设计,面包板和以前做数电和模电课程设计不同的是不用焊接,但是这次的面包板是用螺丝固定的,可是有些螺丝掉了,我只好用导线把它们固定起来,这也为后来留下了隐患,设计的原理图和实际的接线是有一定区别的,接线时一定要合理布线,讲求美观,有个全面的考虑,说和写容易,但是当真正动手操作的时候并不是一件简单的事,要把用到的线尽量都用镊子夹成直线,做到地线用黑色,电源线用红色,其他的用黄色,有时候布置一根线都要思考良久,线路接好容易,要在好的基础上整体感觉合理、美观可不容易,但是,我还是尽我最大的努力做到了。下一步的工作是调试,在实验室,我拿着万用表测试一根根的导线以及芯片和数码管,调试过程中发现了两个问题:有个数码管不能正确显示,面包板的一条接触不良,等换了一下数码管和重新接了面包板的一条后,在正确的程序下,我们的结果显示的很好!这次的课程设计使我受益匪浅,不仅对单片机的理论知识有了比较全面的认识,对自己动手能力也有很大的提高,最重要的是,真实接触到自己做出来的电子日历和电子表,使我对自动化专业有了更高的兴趣。郭珍珍通过为期两天的单片机课程设计,我学到了不少课本上学不到的知识与方法,尤其重要的是这次的设计是真正意义上的由我们组独立完成的课程设计,这就在很大程度上提高了我们的实际分析能力、解决问题的能力、组员合作的能力,同时在很大方面也锻炼了我们的动手操作能力。总的来说,收获是不小的,具体如下:1、 使我深刻地理解了理论联系于实际并运用于实际的这一说法。这次的设计题目不是很难,相对来说比较容易上手,但由于要实现的功能较多,因此在具体的设计中就有很多问题摆在了我们的面前。我主要是负责软件设计方面,而正是如此,所要求的理论知识是很多的,并且程序的好坏决定了本次设计的成败,来不得半点马虎。为了更好地实现软件设计,我从图书馆借来了许多与单片机有关的教材和资料,也从网上下载了一些相关信息和资料,充分学习在本次设计中所要用到的理论知识,并结合具体的问题有针对性地解决了各种程序难题。2、 实际分析、解决问题的能力得到了提高。当我们的硬件和软件设计好后,最重要的就是调试了。在调试过程中问题是层出不穷的,这就需要我们耐心、认真地一一较对、分析,找到解决的办法。我记得在第一次调试时,我们的面包板在运行过程中没有丝毫反应,为了检查线路,只好用万用表对每一个芯片的引脚,每一根导线进行测量,并对照接线图仔细检查,有些地方甚至检查了4遍,最后发现原来是仿真头接触不良,导致8031对8155不能进行实时控制。经验的不足可能会导致设计的进程,但只有当我们及时地发现并解决问题时,经验才会丰富,能力才会得到提升。3、 组员之间的团结合作使得设计进展得很顺利。当我和郭珍珍在拿到题目后,两人认真研究了题目,并做出几个合理的方案,从中我们选出最佳方案。方案确定后,我主要负责程序设计方面,而她负责硬件接线,两人各领其职,相互合作,比较顺利地完成了初步任务,在以后的调试过程中,面对各种问题,我们更是一起分析、讨论,排除了各种问题,出色地完成了本次的设计任务。当然,在设计中,还存在着一些不足之处,比如在程序中,日历显示上,我忽略了闰年的情况将2月都定为了28天,并且在日历的天数调整时,我将每月都可以调到31天,没有按具体的月数情况来实现调整。但是除此之外,其它方面都还是比较完美的。这次的课程设计,对于我们自动化来说,并不算太难,但对于我们以后的毕业设计来说,它的意义是重大的,它让我们提前了解了设计的整个过程,为我们以后的毕业设计作了很好的铺垫。这次的经历让我明白了许多道理,我相信以后的道路我会走得更加顺利! 邓明
展开阅读全文