1单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:2目录一课程设计题目--------------------------------3二电路设计---------------------------------------4三程序总体设计思路概述-------------------5四各模块程序设计及流程图----------------6五程序及程序说明见附录-------------------**六课程设计心得及体会----------------------11七参考资料---------------------------------------123一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能----及格(2)完成“校时修改”功能----中等(3)完成“校时修改位闪”----良好(4)完成“定点报警”功能,且使用资源少----优秀4二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3.7口。因为单片机输出高电平时输出的电流不足以驱动蜂鸣器所以蜂鸣器,所以P3.7口与蜂鸣器直接接反相器再接蜂鸣器的一端,蜂鸣器的另一端接5V电源。这样当P3.7口给高电平时蜂鸣器导通名声。否则反之。(6)单片机XTAL1,XTAL2端接外部时钟电路(时钟电路参考课本),RAT端接复位电路(复位电路参考课本)。EA端接5V电源,使得单片机读取片内程序。(7)修改时间控制开关key1接p1.0口,key2至key7用来对时间,日期,闹钟时间的修改,依次于p1.1至p1.6。key2用来显示日期并做修改的开关,接于INT0(p3.2)口。key3用来显示闹钟时间并做预置的开关,接于INT1(p3.3)口。所有按键的另一端接地。三总体设计思路概述5(1),数码管显示使用动态显示,每四毫秒轮流显示一个数码管.一个循环耗时32ms(这样会有微闪烁可设置更快的动态显示)(2),设置四个中断,高底:定时器1溢出中断外部中断0外部中断1定时器1溢出中断.A.首先允许前三个中断,当没有出现T0,T1中断时主程序在判键并且计时器0在计时.每隔4ms定时器0溢出中断,动态轮流显示一个数码管.用LED_LP做标志,计中断次数.每中断250次秒加一,每60秒分加一,时日月年依规律类推(不用判断平润年).B.当出现T0(显示日期并做修改)或T1(显示闹钟定时时间并可修改定时时间)中断时都会自动关闭计时器0,此时软件控制打开计数器1,用它继续计时并且如A中用来动态显示日期或闹钟设置的时间,同时每个中断子程序都是在判键,通过按键修改日期或设置闹钟时间.此时已经是计数器1中断级别最高,同样每4ms动态轮流显示数码管,此时数码管显示的是日期或定时时间.当修改完时间或定时时间,人工弹出按键,中断结束返回主程序,在返回前关闭定时器1.这样,在没有T0,T1中断时计数器0中断级别最高.四各模块程序设计及流程图6(1)主程序判键修改时间及走时:流程图:banYNNYNY开始时间修改控制键是否按下是否有修改键按下处理相应按键对应时间的修改(加1减1)并给出相应的修改闪烁标志(SXX)是否到闹钟预置时间打开蜂鸣器一分钟后再关闭7(2)定时器0每隔4ms溢出中断(优先级别最低)流程图:进入中断压栈计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250led_lp清0判断是否有秒闪和修改闪烁标志N轮流动态显示一位数码管动态4msY轮流动态显示一位数码管4ms,并且秒闪位每隔一秒熄灭一次修改闪烁的两位每隔半秒熄灭一次出栈结束中断8(3)外部中断0(优先级别第二)流程图:NY进入中断压栈是否有修改日期按键处理日期的对应位修改(加1减1)开定时器1并设置其工作在方式1状态关闭定时器1出栈结束中断9(4)外部中断1(优先级别第三)流程图:NY进入中断压栈开定时器1并设置其工作在方式1状态是否有预置闹钟按键处理对闹钟预置位(加1减1)关闭定时器1出栈结束中断10(5)定时器0每隔4ms溢出中断(优先级别最高)流程图:YN进入中断压栈计中断次数(led_lp)并处理时分秒日月年的加1,中断次数记到250led_lp清0是否显示日期轮流动态显示4ms一位日期的缓存轮流动态显示4ms一位闹钟的缓存出栈结束中断11六课程设计心得体会:此次课程设计是大学里来第二次课程设计,于我的感觉是这是一次与实际最贴切的一次课程设计,亦或是说实践。首先我的心得体会有如下几点(1)万事开头难,要做好单片机课程设计必须要有足够的耐心与兴趣。要反复编程调试,检验。而本次软件编程我反复调试了多达几十次。(2)要想全面的做好这次课程设计,必须要全面统筹,细心规划好自己所需使用的单片机内部资源以及硬件资源。并尽量做到少用资源而达到最大实用效果。同时也要单个功能慢慢编程调试,而不要好高骛远,急功心切。(3)第一次设计编写这样较为难而大的课程设计必须要做到对单片机基础硬件与软件的熟练掌握,尤其单片机里汇编语言指令。只有做到融汇贯通方能运筹帷幄。(4)做好课程设计要学会借鉴别人好的思想与技巧,而教材上就有许多很好的例子。同时要将每次单片机实验灵活运用于此次课程设计。12七参考资料:(1)单片机授课教材(2)单片机网络资源八.程序:SHANEQU20H;秒闪烁标志BUFF_KEYEQU21H;键盘键LED1EQU22H;数码管显示缓存LED2EQU23HLED3EQU24HLED4EQU25HLED5EQU26HLED6EQU27HLED_LPEQU28H;计时标志HOREQU30H;小时值缓存MINEQU31H;分钟值缓存13SECEQU32H;秒值缓存NHOREQU33H;闹钟时间缓存NMINEQU34HNSECEQU35HYEREQU36H;年月日缓存MOTEQU37HDATEQU38HSXXEQU39HF_BEEPBIT01HLED_PORTEQUP0DIG_PORTEQUP2SW0BITP3.2SW814BITP1.0SW1BITP1.1SW2BITP1.2SW3BITP1.3SW4BITP1.4SW5BITP1.5SW6BITP1.6SW7BITP3.3;-----------------------------------------------------ORG0000HLJMPMAINORG000BHLJMPT0_INTORG0003HLJMPT_0ORG0013HLJMPT_1ORG001BHLJMPT1_INTORG100HMAIN:MOVSP,#40HMOVPSW,#00H15MOVR0,#7FH;初始化RAM区,CLR_RAM:MOVA,#00HMOV@R0,ADJNZR0,CLR_RAMMOVP1,#0FFHMOVP2,#0FFHMOVP0,#0FFHMOVP3,#0FFHMOVTMOD,#11HMOVTH0,#0F0H;T0=4MSMOVTL0,#060HMOVNHOR,#100MOVYER,#12MOVMOT,#06MOVDAT,#17CLRCMOVP3.7,CSETB16PT1;定时器1中断级别最高CLRPT0;定时器0中断级别最低SETBTR0;开定时器0SETBET0;允许定时器0中断SETBEX0;允许外部中断0SETBEX1;允许外部中断1SETBEA;允许所有中断;---------------------------------------------按键预置时间WAIT_KEY:MOVA,NHORCJNEA,HOR,LNNNMOVA,NMINCJNEA,MIN,LMNNMOV17A,NSECCJNEA,SEC,LNNNSETBCMOVP3.7,CLJMPLNNNLMNN:MOVA,NMINADDA,#01CJNEA,MIN,LNNNMOVA,NSECCJNEA,SEC,LNNNCLRCMOVP3.7,CLNNN:JNBSW8,LSNNMOVSXX,#0LJMPWAIT_KEYLSNN:JNBSW1,SW1_OK18JNBSW2,SW2_OKJNBSW3,SW3_OKJNBSW4,SW4_OKAJNBSW5,SW5_OKAJNBSW6,SW6_OKAJMPWAIT_KEYSW4_OKA:JMPSW4_OKSW5_OKA:JMPSW5_OKSW6_OKA:JMPSW6_OKSW1_OK:MOVSXX,#01MOVA,HORCJNEA,#23,SW1_OVERMOVHOR,#00HSETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW1_OVER:INCHOR;时加1MOVR7,HOR19SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW2_OK:MOVSXX,#01MOVA,HORCJNEA,#00,SW2_OVERMOVHOR,#23SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW2_OVER:DECHOR;时减1SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW3_OK:MOVSXX,#0220MOVA,MINCJNEA,#59,SW3_OVERMOVMIN,#00HSETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW3_OVER:INCMIN;分加1SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW4_OK:MOVSXX,#02MOVA,MINCJNEA,#00,SW4_OVERMOVMIN,#59SETBF_BEEP21LCALLDELCLRF_BEEPJMPWAIT_KEYSW4_OVER:DECMIN;分减1SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW5_OK:MOVSXX,#03MOVA,SECCJNEA,#59,SW5_OVERMOVSEC,#00HSETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW5_OVER:INCSEC;秒加1SETBF_BEEPLCALLDELCLRF_BEEP22JMPWAIT_KEYSW6_OK:MOVSXX,#03MOVA,SECCJNEA,#00,SW6_OVERMOVSEC,#59SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEYSW6_OVER:DECSEC;秒减1SETBF_BEEPLCALLDELCLRF_BEEPJMPWAIT_KEY;--------------------------------------------------------------------DEL:MOVR5,#07;按一次键处理一次DEL01:MOVR6,#200DEL02:MOVR7,#200DJNZR7,$DJNZR6,DEL02DJNZR5,DEL0123RETBIN_BCD:MOVB,#10DIVABRET;--------------------------------------------------------------------T0_INT:PUSHACCPUS