单片机课程实验报告-0-单片机课程设计报告实用型秒表设计学院:电气与信息工程学院专业:电气工程及其自动化班级:电自0808班指导老师:肖昌炎王亚单片机课程实验报告-1-1.绪论1.1、课程设计任务设计一实用型秒表,除秒表和倒计时的基本功能(启动、暂停、继续、复位和设定)之外,还要求能显示北京时间。1.2、课程设计要求1)采用LED,显示北京时间(可不通过DS1307芯片获取数据)。时间初始值由程序在编写时写入。2)秒表具有完整功能,包括启动、暂停、继续、复位等。3)倒计时具有完整功能,包括启动、暂停、继续、复位、设定等。4)可以实现模式之间的任意切换,各功能之间的运行相互不受影响。1.3、课程设计思路数据显示考虑使用动态显示,通过设定模式切换实现按键功能的复合化。考虑到1.4、课程设计目的a.掌握实用型数字式秒表控制的基本原理,并能够熟练使用51系列C语言对基于51系列内核的单片机编写程序,进一步对所学的单片机知识进行掌握与实际应用。b.熟悉KeilμVision4软件的基本操作和运行环境,学会在该软件环境下对编写的文件进行Proteus仿真与下板。c.锻炼自己获取信息、分析实际问题的能力和能够独立自主地思考和解决问题的能力。2.系统分析与整体设计方案2.1系统分析通过分析可知,所要设计的实用型秒表需要具备的功能有:能显示时钟;具有实用秒表的开始、暂停、继续及复位;和倒计时的开始、暂停、继续及复位。单片机课程实验报告-2-同时,考虑到倒计时的时长需要人工设置,所以倒计时还兼具有初始化功能。因此,我们在最开始做模块规划的时候,决定将整个程序划分成如下几个模块:2.1.1、动态显示模块:板上的数码管采用P0口做数码显示输出,P2和P3的各四根口线控制八个数码管的位选信号,因此,根据数码管的连接方式分析,用动态显示的方法来实现数码管相关信息的显示是比较可行的。并且,通过设置相应的模式切换变量可以实现对数码管显示数据的切换。2.2.2、时钟模块由于在功能中提到能显示时钟,故而时钟模块是不能缺少的。所设计的时钟初值将直接从程序中读入,意即时钟初值将被事先写入程序中。另外,时钟模块与动态显示模块一样,都是属于不能停止运行的模块。故而在编程时,若遇到版内资源不足的情况,可以考虑将时钟模块和动态显示模块的时钟源合二为一,以实现更多的功能。2.2.3、秒表模块既然设计的课题是秒表,那么这一模块一定是不能少的。秒表的核心程序段与时钟的大致相同,但不同之处在于,时钟的显示是自动的,但是秒表的运行、暂停和复位等功能是需要被按键控制的,并且要做到在显示其他模式下秒表仍能正常运行。故而,秒表模块的实现除了其本身的数据处理及显示之外,还需要有按键模块的配合。2.2.4、倒计时模块倒计时相当于秒表的逆序计数,当设定的时间间隔到点时,倒计时将停止运行。因此,倒计时模块的编写可以适当仿照秒表模块的编写形式。值得注意的是,倒计时模块与秒表模块的特点相同,其运行、暂停、继续、复位和初始设定等功能均需要被按键控制。故而,倒计时模块的实现除了其本身的数据处理及显示之外,还需要有按键模块的配合。单片机课程实验报告-3-2.2.5、按键模块除开时钟功能的实现不需要借助按键之外,其他三种模式的实现(秒表、倒计时、倒计时初始设定)都需要借助按键来实现;另外实现四种不同模式的切换也需要借助按键来切换。但一个最棘手的问题在于,4X4矩阵式按键的列扫描信号需要占用P2口,而数码管中有三位数码管的位选码与键盘的列扫描端口冲突。这也就决定了按键的功能在设定时只能重叠。具体说来,就是除开模式选择的按键之外,每个功能最多只能实用3个按键来实现相应功能。2.2.6、蜂鸣报时模块电子表的时钟都具有整点报时功能,有些老旧一点的机械式钟表还兼具半点报时功能。该秒表的时钟部分同样也具有整点及半点报时功能。具体可以通过向蜂鸣器对应端口送一定频率的高电平来实现蜂鸣器的发声。2.2.7、倒计时设定模块倒计时所运行的时长需要根据使用者的需求确定,因此在这个实用型秒表中加入了倒计时设定模块。其主要功能是对倒计时的初始值进行设定及修改。这一模块其实是嵌入在按键模块之中的,毕竟,除了数据存储,其余的动作均要依赖于按键。2.2整体设计方案根据设计要求和系统所具有功能,经方案设计画出如下所示的设计总体方案,框图如下图所示:单片机课程实验报告-4-图1实用型秒表的模块划分数据数据数据数据发送控制命令发送控制命令发送控制命令启动动态显示模块判断sel变量的值蜂鸣检测时钟模块秒表模块倒计时模块计时设定模块按键扫描单片机课程实验报告-5-3.硬件电路设计3.1主电路图图3.1最小系统图图3.2电源模块示意图单片机课程实验报告-6-图3.3数码管驱动示意图图3.4LED驱动示意图单片机课程实验报告-7-图3.5蜂鸣器驱动示意图图3.6按键示意图单片机课程实验报告-8-图3.7复位按键示意图3.2动态显示模块及其功能程序位置:定时中断T0内执行条件:每5ms执行一次功能:根据模式标志位sel将显示对应数组中的非压缩型BCD码输入至dpram,并动态显示到1个数码管入口参数:dpram[6](非压缩型BCD码)出口参数:无备注:每次仅显示一个数码管3.3时钟模块及其功能程序位置:定时中断T0内执行条件:每1s执行一次功能:对1s计数,并累计修改sec_t/minu_t/hour_t等单元;并调用译码模块,输出到dpram_time数组中入口参数:sec_t/minu_t/hour_t出口参数:dpram_time[8]3.4、秒表模块及其功能程序位置:定时中断T1内单片机课程实验报告-9-执行条件:在模式标志位选通状态下,每10ms执行一次功能:在模式标志位选通状态下,通过按键实现对秒表的启动、暂停、继续和复位等控制,在定时器运行时对10ms计数,并累计修改dsec_w/sec_w/minu_w/hour_w等单元,并调用译码模块,输出到dpram_watch数组中入口参数:模式位选sel;按键扫描信号P1;dsec_w/sec_w/minu_w/hour_w(非压缩型BCD码)出口参数:dpram_watch[8]3.5、倒计时模块及其功能程序位置:定时中断T2内执行条件:在模式标志位选通状态下,每10ms执行一次功能:在模式标志位选通状态下,通过按键实现对倒计时的启动、暂停、继续和复位等控制,在定时器运行时对10ms计数,并累计修改dsec_d/sec_d/minu_d/hour_d等单元,并调用译码模块,输出到dpram_djs数组中入口参数:模式位选sel;按键扫描信号P1;dsec_d/sec_d/minu_d/hour_d(非压缩型BCD码)出口参数:dpram_djs[8]3.6、蜂鸣报时模块及其功能程序位置:主程序执行条件:时间整点及其前4秒、半点整功能:根据不同的情况设置不同的声响次数和时长,并打开报时使能运行相应程序,使蜂鸣器按规定的次数和时长发声入口参数:sec/min出口参数:spk3.7、倒计时设定模块及其功能程序位置:主程序单片机课程实验报告-10-执行条件:模式标志位选通功能:在模式标志位选通状态下,通过按键对对应位计数,并累计计数,满足计数条件时对需要更改的位进行移动,并对选定位进行更改入口参数:模式位选sel状态判定;按键扫描信号P1出口参数:dsec_d_s/sec_d_s/minu_d_s/hour_d_s(非压缩型BCD码)4.实验程序设计/*------------------------------------------设计一个具有如下功能的多功能秒表:-使用动态显示及显示时间(使用定时器0)-具有秒表的启动、暂停及复位功能(使用定时器1)-具有倒计时功能,包括启动、暂停、复位及设置(使用定时器2)-时钟整点及半点整的蜂鸣报时------------------------------------------*/#includeADUC848.h#includeintrins.hunsignedchartemp;//定义按键缓存单元tempunsignedcharj=0;//定义设定模式位选变量junsignedcharsel=0;//定义模式选择变量selunsignedchardpsel[8]={0x08,0x04,0x02,0x10,0x80,0x40,0x20,0x08};//定义数码管位选码unsignedcharcodedptable[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd};//定义数码管字型码(0~9和‘-’,共11个)/*----------------数据动态显示缓存单元定义部分-------------------*/unsignedchardpram[8]={0};//定义动态显示缓存单元dpramunsignedchardpram_djs[8]={0};//定义倒计时数据缓存单元dpram_djsunsignedchardpram_time[8]={0};//定义时间数据缓存单元dpram_timeunsignedchardpram_watch[8]={0};//定义秒表数据缓存单元dpram_watchunsignedchari=1;//定义动态显示位选变量i/*-----------数据运算单元定义部分(时钟,标志位sel=0)-----------*/unsignedcharsec_t=54;//定义秒针,初值50unsignedcharminu_t=59;//定义分针,初值59unsignedcharhour_t=23;//定义小时,初值23unsignedintcount=350;//定义时钟秒中断计时变量count(还兼做蜂鸣器的时长控制)unsignedintn;//定义频率变量nsbitspk=P2^6;//定义蜂鸣器,变量名spk/*-----------数据运算单元定义部分(秒表,标志位sel=1)-----------*/单片机课程实验报告-11-unsignedchardsec_w=21;//定义十分秒,初始值21unsignedcharsec_w=43;//定义秒,初始值43unsignedcharminu_w=65;//定义分,初始值65unsignedcharhour_w=87;//定义小时,初始值87unsignedcharcountdown=5;//定义秒表秒中断计时变量countdown/*---数据运算单元定义部分(倒计时及设定,标志位sel=2/3)--*/unsignedchardsec_d=0;//定义十分秒,初始值0unsignedcharsec_d=10;//定义秒,初始值0unsignedcharminu_d=0;//定义分,初始值0unsignedcharhour_d=0;//定义小时,初始值0/*数据修改单元:倒计时初值修改之后存储在这里,以备倒计时复位时使用*/unsignedchardsec_d_s;//定义十分秒存储单元unsignedcharsec_d_s;//定义秒存储单元unsignedcharminu_d_s;//定义分存储单元unsignedcharhour_d_s;//定义小时存储单元voiddelay10ms(){unsignedchari,j;for(i=500;i0;i--)for(j=248;j0;j--);//10ms延时子程序,用于按键延时}voidst0()interrupt1using1//定时器0(动态显示中断、时钟中断){unsignedcharcir;//定义局部变量cir,用以批量将对应数据送入动显缓存单元TH0=(65536-5000)/256;TL0=(65536-5000)%256;P0=dptable[dpram[i]];//dpram[i]中对应数字在dptable中查表,送对应字型码至P0if(i=3){P3=0x00;P2=dpsel[