设计要求总体方案硬件设计软件设计系统调试与运行第10章单片机的应用系统设计与开发本章内容SingleChipMicrocomputer一、设计要求设计并制作出具有如下功能的电脑钟:(1)自动计时,由6位LED显示器显示时、分、秒。(2)具备校准功能,可以直接由0~9数字键设置当前时间。(3)具备定时起闹功能。(4)一天时差不超过1秒钟。二、总体方案1.计时方案方案一:采用实时时钟芯片。方案二:软件控制。2.键盘/显示方案方案一:串口扩展,LED静态显示。方案二:8155扩展,LED动态显示。显示方式框图(a)静态显示框图;(b)动态显示框图移位寄存器LED1LED24×4键盘8031串行口P1口……移位寄存器80318155键盘显示接口LED显示4×4键盘(a)(b)三、硬件设计1.电路原理图AD0PA0AD1PA1AD2PA2AD3PA3AD4PA4AD5PA5AD6PA6AD7PA7PB0CEPB1RDPB2WRPB3IO/MPB4ALEPB5PB6PB7TMROUT6PC0PC1TMRIN3PC2PC3PC4RESET4PC58155EA/VP31X119X218RESET9RD17WR16INT012INT113T014T11512345678PSENALE/PTXDRXD89C51dpgfedcbaLED0LED1LED2LED3LED4LED50123456789C/RALMPA0~PA5PC0PC1PC2PB0~PB7+5V+5V蜂鸣器+5V+5V74LS0739383736353433322122232425262728293011101213141516171819891071121222324252627282930313233343536373839125P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.720pF20pF6MHz1k+5.1k×3R200×822F12.系统工作流程本电脑钟具备以下功能:(1)时钟显示:6位LED从左到右依次显示时、分、秒,采用24小时计时。(2)键盘功能:采用4×3键盘,包括:0~9数字键,键号为00H~09HC/R键时间设定/启动计时键,键号为0AHALM键闹钟设置/启闹/停闹键,键号为0BH(1)时间显示:上电后,系统自动进入时钟显示,从00:00:00开始计时,此时可以设定当前时间。(2)时间调整:按下C/R键,系统停止计时,进入时间设定状态,系统保持原有显示,等待键入当前时间。按下0~9数字键可以顺序设置时、分、秒,并在相应LED管上显示设置值,直至6位设置完毕。系统将自动由设定后的时间开始计时显示。(3)闹钟设置/启闹/停闹:按下ALM键,系统继续计时,显示00:00:00,进入闹钟设置状态,等待键入启闹时间。按下0~9数字键可以顺序进行相应的时间设置,并在相应LED管上显示设置值,直至6位设置完毕。这将启动定时启闹功能,并恢复时间显示。定时时间到,蜂鸣器鸣叫,直至重新按下ALM键停闹,并取消闹钟设置。四、软件设计1.系统资源分配地址功能名称初始化值30H~35H显示缓冲区,小时、分、秒(高位在前)DISP0~DISP500H3CH~3FH计时缓冲区,时、分、秒、100msHOUR,MIN,SEC,MSEC00H40H~42H闹钟值寄存区,时、分、秒AHOUR,AMIN,ASECFFH50H~7FH堆栈区PSW.5计时显示允许位(1:禁止,0:允许)F00PSW.1闹钟标志位(1:正在闹响,0:未闹响)F10电子钟控制软件片内RAM及标志位分配表2.软件流程开始定义堆栈区8155、定时器0、数据缓冲区、闹钟标志位初始化调用定时比较程序调用键扫描子程序是C/R键是ALM键闹钟标志位=1停闹清零闹钟标志地址指针指向计时缓冲区调用时间设置/闹钟定时程序地址指针指向闹钟值寄存区YNNYYN图9.3主程序流程图图9.4计时程序流程图保护现场时间校正重装定时器0初值循环次数减1秒单元清零分单元加160分到分单元清零小时单元加124小时到小时单元清零恢复现场返回满10次秒单元加160s到NYYYYNNN图9.5时间设置/闹钟定时流程图保护现场调用键盘设置子程序ACALLKEYIN调用合字程序ACALLCOMB恢复现场返回图9.6键盘设置子程序流程图保护现场显示缓冲区首地址送R0键盘输入次数送R7调用键盘扫描程序ACALLKEYSCAN键号送@R0显示缓冲区地址加1INCR0循环次数减1循环次数到恢复现场返回Yc图9.7键盘扫描流程图(4)键盘扫描程序模块KEYSCAN:流程图如图9.7所示。扫描键盘有键按下调用显示程序有键按下求取键号返回调用显示程序调用定时比较程序调用显示程序调用定时比较程序YNNY图9.8显示流程图保护现场动态扫描显示调用拆字程序返回YN允许显示计时时间图9.9定时比较流程图保护现场闹钟值与计时值秒单元相等启闹闹钟标志置位返回YN闹钟值与计时值分单元相等闹钟值与计时值小时单元相等恢复现场NNYYORG0000HAJMPMAINORG000BHAJMPCLOCKORG0030HPORTEQU8000HPORTAEQU8001HPORTBEQU8002H;*****************主程序MAIN******************PORTCEQU8003HDISP0EQU30HDISP1EQU31HDISP2EQU32HDISP3EQU33HDISP4EQU34HDISP5EQU35HHOUREQU3CHMINEQU3DHSECEQU3EHMSECEQU3FHAHOUREQU40HAMINEQU41HASECEQU42HF1BITPSW.1MAIN:MOVSP,#50H;设置堆栈区MOVXDPTR,#PORTMOVA,#03HMOVX@DPTR,A;8155初始化CLRF1;清零闹钟标志位CLRF0;允许计时显示MOVAHOUR,#0FFHMOVAMIN,#0FFHMOVASEC,#0FFHMOVR7,#10HMOVR0,#DISP0CLRALOOP:MOV@R0,AINCR0DJNZR7,LOOP;设置初值MOVTMOD,#01HMOVTL0,#0B0HMOVTH0,#3CH;定时器0初始化,定时时间100msSETBTR0;启动定时器SETBEASETBET0;开中断BEGIN:ACALLALARM;调用定时比较ACALLKEYSCAN;调用键盘扫描CJNEA,#0AH,NEXT1;是CLR/RST键否?CLRTR0;是则暂时停止计时MOVR1,#HOUR;地址指针指向计时缓冲区首地址AJMPMODNEXT1:CJNEA,#0BH,BEGIN;是ALARM键否?JBF1,NEXT2;闹钟正在闹响否?MOVR1,#AHOUR;地址指针指向闹钟值寄存区首地址MOD:SETBF0;置位时间设置/闹钟定时标志,禁止显示计时时间ACALLMODIFY;调用时间设置/闹钟定时程序SETBTR0;重新开始计时CLRF0;清零时间设置/闹钟定时标志,恢复显示计时时间AJMPBEGINNEXT2:SETBP1.0;闹钟正在闹响,停闹CLRF1;清零闹钟标志AJMPBEGIN;**************时间设置/闹钟定时模块MODIFY************MODIFY:ACALLKEYIN;调用键盘设置子程序ACALLCOMB;调用合字子程序RET键盘设置子程序KEYIN:KEYIN:PUSHPSWPUSHACCSETBRS1;保护现场MOVR0,#DISP0;R0指向显示缓冲区首地址MOVR7,#06H;设置键盘输入次数L1:CLRRS1ACALLKEYSCAN;调用键盘扫描程序取按下键的键号SETBRS1CJNEA,#0AH,L2;键入数合法性检测(是否大于9)L2:JNCL1;大于9,重新键入MOV@R0,A;键号送显示缓冲区INCR0DJNZR7,L1;6位时间输入完否?未完继续,否则返回POPACCPOPPSWCLRRS1;恢复现场RET;**********键盘扫描子程序KEYSCAN***********KEYSCAN:ACALLTEST;调判按键是否按下子程序TESTJNZREMOV;有键按下调消抖延时ACALLDISPLAYACALLALARMAJMPKEYSCAN;无键按下继续判是否按键REMOV:ACALLDISPLAY;调用显示子程序延时消抖ACALLTEST;再判是否有键按下JNZLIST;有键按下转逐列扫描ACALLDISPLAYACALLALARMAJMPKEYSCAN;无键按下继续判是否按键LIST:MOVR2,#0FEH;首列扫描字送R2MOVR3,#00H;首列键号送R3LINE0:MOVDPTR,#PORTA;DPTR指针指向8155的A口MOVA,R2;首列扫描字送R2MOVX@DPTR,A;首列扫描字送8155的A口MOVDPTR,#PORTC;DPTR指针指向8155的C口MOVXA,@DPTR;读入C口的行状态JBACC.0,LINE1;第0行键无键按下转第1行MOVA,#00H;第0行有键按下,行首键号送AAJMPTRYK;求键号NEXT:INCR3;扫描下一列MOVA,R2;列扫描字送AJNBACC.3,EXIT;4列扫描完,重新进行下一轮扫描RLA;4列未扫描完,扫描字左移扫描下一列MOVR2,A;扫描字送AAJMPLINE0;转向扫描下一列EXIT:AJMPKEYSCAN;等待下一次按键TRYK:ADDA,R3;按公式计算键码,求得键号PUSHACC;键号入栈保护LETK:ACALLTEST;等待按键释放JNZLETK;按键未释放,继续等待POPACC;按键释放,键号出栈RET;键盘扫描结束,返回TEST:MOVDPTR,#PORTA;DPTR指针指向8155的A口MOVA,#00HMOVX@DPTR,A;全扫描字00H送8155的A口MOVDPTR,#PORTC;DPTR指针指向8155的C口MOVXA,@DPTR;读入C口行状态CPLA;A取反,以高电平表示有键按下ANLA,#07H;屏蔽高5位RET;**************显示子程序DISPLAY*************DISPLAY:JBF0,DISP;允许时间显示标志F0=1转DISPACALLSEPA;否则调用SEPA刷新显示缓冲区DISP:pushpsw;动态扫描显示子程序Pushaccsetbrs0MOVdptr,#PORTAMOVA,#0FFHMOVX@DPTR,A;关显示movr0,#disp0movr7,#00hmovr6,#06hmovr5,#0fehdis1:movdptr,#tabmova,@r0movca,@a+dptrmovdptr,#portbmovx@dptr,amovdptr,#portamova,r5movx@dptr,ahere:djnzr7,hereincr0mova,r5rlamovr5,adjnzr6,dis1clrrs0popaccpoppswrettab:db3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb7fh,6fh,77h,7ch,39h,5eh,79h,71h;共阴极字型码表;*****************合字子程序COMB******************COMB:MOVR0,#DISP1;R0指向显示缓冲区小时低位ACALLCOMB1;合字CJNEA,#24H,CHK;小时大于24否?CHK:JNCEXIT1;大于24则取消本次设置,退出MOV@R1,A;否则小时送计时缓冲区/闹钟值寄存区小时单元INCR1MOVR0,#DISP3;R0指向显示缓冲区分低位ACALLCOMB1CJNEA,#60H,CHK1CHK1:JNCEXIT1MOV@R1,AINCR1MOVR0,#DISP5;R0指向显