1目录1.系统总体方案选择与说明………………………2.系统结构框图与工作原理………………………3.各单元硬件设计说明及计算方法………………………4.软件设计与说明(包括流程图)………………………5.调试结果与必要的调试说明………………………6.使用说明………………………………………………7.课程设计总结与体会………………………8.参考文献………………………………………………9附录:A:系统原理图………………………………………………B:程序清单………………………………………………2一.前言1.设计要求:要求以MCS-51系列单片机为核心设计一个多功电子表,具有电时钟和跑表功能。做时钟时在4位LED显示器上显示分、秒,做跑表时显示范围000.0秒~999.9秒并具有跑表启动和跑表复位功能键。电子时钟的计时范围00分00秒59分-59秒,并在4位LED显示器上显示;做跑表时显示范围000.0秒-999.9秒,当按下启动按钮跑表开始计时,按下停止按停止计时,当按下复位按钮跑表回零。2.设计思路1)计时单元由单片机内部的定时器/记数器来实现。2)时间显示功能通过LED数码管动态扫描来实现。利用专用键盘/显示器接口芯片8279可实现对键盘/显示器的动态扫描,由于数码管要显示时钟,还要显示跑表,因此,我分别用31H、32H计时钟,用R5、R6计跑表,当要显示哪一个的时候,就把哪一个地址送到显示地址35H、36H中,达到跑表显示与时钟显示互不影响。3)表的启动/复位/清零功能由软件来实现。P1.0接启动键,P1.1接停止键,P1.2接清零键。4)由于跑表和时钟的中断服务程序有冲突,我们就把跑表的中断服务程序写成另外的子程序了,这样就必须要引入标志位了,我们在此用42H标志位,用标志位来给跑表计数。二.系统组成与工作原理1.硬件电路的设计方案根据设计要求和设计思路,硬件电路有两部分组成,即单片机按键电路,LED显示器电路。图1为硬件电路设计框图。3图1硬件电路设计框图2.软件设计方案根据设计要求和设计思路,进行模块设计。8279的初始化程序模块,时钟记时程序模块,数制转换模块,显示模块,跑表工作模块。图2为软件设计框图。图2电子跑表软件设计的模块3.工作原理说明利用T0定时器定时100ms,即0.1s,用R5R6作为跑表的计算MC518279LED显示电路按键电路主程序模块8279初始化模块时钟记时模块数制转换模块显示模块跑表工作模块4器,用R7作为时钟计数器。判断SRART键是否按下,若按下,则建立标志F0=1,同时将R5R6单元清零;否则F0=0。在T0中断服务中,判断F0,若F0=0,则用软件计数器R7计数;若F0=1,则在R7计数同时,还要用软件R5R6计数。中断返回后,判断F0,若F0=0,即作为时钟使用时,则R7=10为一秒,60秒则清零。若F0=1,即作为跑表使用时,将R5R6的值进行十进制调整,即为跑表显示值,到9999则R5R6清零,重新开始计数。若STOP键按下,则R5R6停止计数。在跑表停止状态下,则返回显示当前时间。三.各单元硬件设计说明及计算方法1.在单片机中,定时功能既可以由硬件(定时/记数器)实现,也可通过软件定时实现。硬件定时是利用单片机内定时器定时,启动以后定时器可与CPU并行工作,不占用CPU时间,CPU有较高的工作效率。采用硬件定时和软件定时并用的方式,即用T0出中断功能实现50ms定时,通过软件延时程序实现1s定时。.定时器的有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。TMOD用于设置定时器/计数器的工作方式0~3,并确定用于定时还是用于计数。TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。2.8279是通用的可编程键盘/显示器接口芯片,可实现对键盘/显示器的自动扫描,不仅可以大大节省CPU对键盘/显示器的操作时间,从而减轻CPU的负担,而且显示稳定,程序简单,不会出现误动作。8279具有8个先进先出的的键输入缓冲RAM单元,并提供16字节的缓冲RAM。8279将段码写入显示缓冲RAM,8279自动对显示器扫描,将其内部显示缓冲RAM中的数据在显示上显示出来。CUP通过对8279编程(将命令字写入8279)来选择其工作方式,简5述如下:1)键盘/显示器方式设置命令字D7D6D5D4D3D2D1D0000DDKKK高三位D7D6D5位为特征位000,D4D3两位用来设定显示方式,其定义如下:D4D3显示器方式008个字符显示—左边输入0116个字符显示—左边输入108个字符显示—右边输入1116个字符显示—右边输入8279最多可用来控制16位LED显示器,当显示位数超过8位时,均需设定为16为字符显示。显示器的每一位对应一个8位的显示缓冲RAM单元CPU将显示数据写入缓冲器时有左边输入和右边输入。左边输入是较简单的方式,地址为1-15的显示缓冲RAM单元分别对应显示器的1(左)位-15(右)位。CPU依次从0地址或某一个地址开始将段数据写入显示缓冲RAM。D2D1D0为键盘工作方式选择位,如下表:D2D1D0键盘工作方式000编码扫描键盘,双键锁定001译码扫描键盘,双键锁定010编码扫描键盘,N键依次读出011译码扫描键盘,N键依次读出100编码扫描传感器矩阵101译码扫描传感器矩阵6110选通输入,编码扫描显示器方式111选通输入,译码扫描显示器方式当设定为编码工作方式时,内部计数器作二进制记数,四位二进制计数器的状态扫描线SL0-SL3输出,最多可为键盘/显示器提供16根扫描线(16选1)。双键锁定,就是当键盘中同时有两个以上的键被按下时,任何一个键的编码信息君不能进入FIFORAM中,直至仅剩下一键保持闭合时,该键的编码信息方能进入FIFO。2)写显示缓冲RAM命令字D7D6D5D4D3D2D1D0100AIAAAA高三位100为该命令字的特征位,该命令给出了显示缓冲RAM的地址信息,当CPU执行写显示缓冲RAM时,首先用该命令字给出要写入显示缓冲RAM地址,四位二进制代码。AAAA可用来寻址显示缓冲RAM的16个存储单元。若AI=1,则CPU在第一次写入时须给出地址外,以后每次写入,地址自动加1,直至所有显示缓冲RAM全部写毕。3)读显示缓冲RAM命令字D7D6D5D4D3D2D1D0011AIAAAA在CPU读显示数据之前先输出读缓冲RAM的命令。D7D6D5=011该命令字的特征位。22二进制代码AAAA用寻址显示缓冲RAM的一个缓冲单元。AI为自动增量标志,若AI=1则CPU每次读出后,地址自动加1。4)清除命令字D7D6D5D4D3D2D1D0110CDCDCDCFCA7该命令字用来清除FIFORAM和显示缓冲RAM。其中D4D3D2(CD)三位用来设定清除显示缓冲RAM的方式,其定义下:D4D3D2清除显示RAM的方式10X将显示RAM全部清0110将显示RAM清成20H111将显示RAM全部置10XX不清除(CA=0);则D3D2有效5)状态字8279的状态字节用于键输入和选通输入方式中,指出FIFORAM中的字符的个数是否出错,状态字的格式如下:D7D6D5D4D3D2D1D0DUS/EOUFNNND2-D0表示FIFORAM中数据的个数D3在F=1时,表示FIFORAM已满(存有8个键入数据)D4在FIFORAM中没有输入字符时,CPU对FIFORAM读置“1UD5当FIFO已满,又输入一个字符时发生溢出置“1”OD6的S/E用于传感矩阵输入方式,几个传感器同时闭合时置“1”D7在清除命令执行期间该位为“1”,D7为1时对显示RAM写操作无效6)出入数据格式在键扫描方式中,键输入数据格式如下:D7D6D5D4D3D2D1D0CNHLSHIFTSCANSCANSCANRETURNRETURNRETURND2-D0指出输入键所在的列号(RL0-7Z状态确定)D5-D3指出输入键所在的行号(扫描记数植)D6控制SHIFT的状态8D7控制CNTL的状态在传感器扫描方式或选通输入方式中,输入数据即为RL0-RL7输入状态D7D6D5D4D3D2D1D0RL7RL6RL5RL4RL3RL2RL1RL0由以上可确定8279状态口地址为0FF82H,数据口地址为0FF80H。四.软件设计与说明(包括流程图)(1)主程序的设计设置各中断服务程序的入口地址相关寄存器清零主程序910图3主程序设计框图1)程序的起始地址:MCS-51单片机复位后,(PC)=0000H,而0003H-002BH分别是各中断源的入口地址。所以,编程时应在0000H设置定时器初值8279初始化存储单元赋初值P1.0开关P1.2开关P1.1开关跑表显示单元清0调跑表显示跑表显示单元调时钟显示时钟单元清0清011处写一条跳转指令。当CPU接收到中断请求信号并予以响应后,CPU把当前的PC内容压入栈中进行保护,然后转入响应的中断服务程序入口处执行。2)主程序的初始化:将要用到的MCS-51系列单片机内部部件或扩展芯片进行初始工作设定。Z8279EQU0FF82H;8279状态/命令入口地址D8279EQU0FF80H;8279数据口地址LEDMODEQU00H;左边输入八位字符显示LEDFEQEQU2FH;扫描速度LEDCLSEQU0C1H;清除显示RAMLEDWR0EQU80H;设定的将要写入的显示RAM地址ORG0000HLJMPMAINORG000BH;T0中断入口地址LJMPINTT0ORG0030HMAIN:LCALLINIT8279;初始化8279MOVTMOD,#01H;T0工作方式MOVTH0,#3CH;T0初值MOVTL0,#0B0HMOVIE,#82H;开中断MOVR7,#2;中断两次MOV31H,#0;放后两位数字MOV32H,#0;放前两位数字12MOV41H,#0;用在定时器计中断个数MOVP1,#0FFH;开放P1口SETBTR0;启动定时器LOOP:JNBP1.0,ZHONG;判开关P1.0信号,时钟与跑表切换。MOVR5,#0;跑表清0MOVR6,#0TING:LCALLPAO;调跑表子程序JNBP1.1,TING;判P1.1信号,暂停跑表JNBP1.2,$;判P1.2信号,转时钟MOVR5,#0;跑表清0MOVR6,#0ZHONG:MOV35H,31H;用于时钟记数的31H,32H送入显示地址MOV36H,32HLCALLDIVID;时钟显示MOVA,52H;加小数点(分和秒之间)ADDA,#10MOV52H,ALCALLDZSPLAYLJMPLOOP;循环执行主程序RET13(2)8279初始化子程序图48279初始化框图INT8279:PUSHDPH;8279初始化子程序PUSHDPLPUSHACCMOVDPTR,#Z8279MOVA,#LEDMOD;置8279工作方式入口置8279工作方式置键盘扫描速率清LCD显示恢复现场返回14MOVX@DPTR,AMOVA,#LEDFEQ;置键盘扫描速率MOVX@DPTR,AMOVA,#LEDCLS;清除LED显示MOVX@DPTR,APOPACCPOPDPLPOPDPHRET(3)时钟、跑表计时程序模块的设计1)60分钟与1000秒时间的产生。选择定时器T0,用工作方式1,定时50ms,R7先置2,T0定时50ms中断一次,利用R7寄存器减1,当R7寄存器的值=0时,时间正好是0.1s,再利用R0寄存器计数,当R0=10时,时间刚好是1s,再利用R1寄存器计数60s,依次类推,累计60分钟的是时间值,需要用到以下几个寄存器:R7:累计0.1s时间寄存器。T0每中断一次R7=R7-1,计数10次向30H进位,并将R7置2。30H:累计1s时间寄存器。当R0=60s时,向31H进位,然后将30H清零。31H:累计60s时间寄存器。当31H=60s时,当31H=60时,将30H、31H清零。30H、31H用于时钟计时,以下R6、R5用于跑表计时。R5:累计10S时间寄存器。当R5=100时,向R6进位,