附件3课程设计(综合实验)报告( 2011 -- 2012 年度第 1 学期)名称:硬件课程与实践题目:8086数字电子钟的设计院系:班级:学号:学生姓名:指导教师:设计周数:2周成绩:日期:2011年09月01日一、课程设计的目的与要求1. 综合运用学过的相关软、硬件知识,利用伟福LAB6000实验设备,设计具有实用功能的电子钟,实现电子时钟的准确运行、校时等功能。
2.熟悉伟福LAB6000的功能,掌握数码管设计和键盘设计的要领及相关技术,能够利用实验设备实现电子钟系统的设计。
3.提高自己的硬件设计分析能力,同时培养软硬结合的系统设计思维,从而提高设计系统的可行性和准确性。
二、课程设计正文A.设计题目:8086数字电子钟的设计:1.设计并完成LED七段数码管数字钟电路。
2.数字钟显示格式为:HH:MM:SS。
3.具有通过键盘能够调整时、分、秒及设置闹铃的功能。
4.具有暂停时间及复位功能。
B.设计方案本设计采用LAB6000伟福仿真实验箱,利用4MHz脉冲信号源和多级分频电路产生脉冲信号,4MHz脉冲信号经过F/64分频后得到62.5KHz脉冲信号,将脉冲信号传递给8253定时器,定时器每0.000016秒中断一次,在中断服务程序中对中断次数进行计数,0.000016秒计数62500次就是1秒,然后在中断服务程序中对秒计数得到分和小时值并判断闹铃是否到时。
编写键盘扫描和LED显示程序完成设置时间、定闹铃及数码管显示功能。
C.硬件原理1.七段数码管显示和键盘扫描显示图1.1七段数码管图1.2伟福实验台六位LED的电路图及寻址空间实验箱提供了6位八段数码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。
将KEY/LED CS接到CS0上,则实验箱中八位段码输出地址为08004H,位码输出地址为08002H。
实验箱提供了一个6×4的小键盘,将KEY/LED CS信号接到CS0上,则列扫描地址为08002H,行码地址为08001H。
向列扫描码地址逐列输入低电平,然后从行码地址读回。
如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。
这样就可以通过输出的列码和读取的行码来判断按下的是什么键。
在判断有键按下后,要有一定的时延,防止键盘抖动。
2.硬件连接图2.1伟福实验台内部总线连接8253用定时器/计数器1,8253片选接CS1,地址为09000H,8253时钟源CLK1接分频电路的F/64输出,频器的Fin接4MHz时钟,8253的GATE1接VCC;8259中断INT0接8253的OUT1,片选接CS2,地址为0A000H。
显示电路的KEY/LED CS 接CS0,地址为08000H。
如下图:D.运行界面三、课程设计总结或结论四、参考文献[1] 王保义, 张少敏.接口与通信. 北京-中国电力出版社, 2008[2] 沈美明, 温冬婵. IBM-PC汇编语言程序设计. 清华大学出版社,第二版. 2002[3] 陆红伟.微机原理实验与课程设计指导书. 中国电力出版社, 2006.8附录(设计流程图、程序等)CONTROL EQU 09003HCOUNT1 EQU 09001HIN_KEY EQU 08001H ; 键盘读入口OUTBIT EQU 08002H ; 位控制口OUTSEG EQU 08004H ; 段控制口ICW1 EQU 00010011B ; 单片8259, 上升沿中断, 要写ICW4ICW2 EQU 00100000B ; 中断号为20HICW4 EQU 00000001B ; 工作在8086/88 方式OCW1 EQU 11111110B ; 只响应INT0 中断CS8259A EQU 0A000H ; 8259地址CS8259B EQU 0A001HDATA SEGMENTCNT DB 0;闹铃显示RHOUR DB 1RMINUTE DB 0HOUR DB 0MINUTE DB 0SECOND DB 0NUM DB 0;判断闹铃LEDBUF DB 6 DUP(?) ; 显示缓冲RINGBUF DB 6 DUP(?)SETBUF DB 6 DUP(?)LEDMAP: ; 八段管显示码DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07HDB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71HKEYTABLE: ; 键码定义DB 16H, 15H, 14H, 0FFHDB 13H, 12H, 11H, 10HDB 0DH, 0CH, 0BH, 0AHDB 0EH, 03H, 06H, 09HDB 0FH, 02H, 05H, 08HDB 00H, 01H, 04H, 07HSET: DB 6DH, 79H, 07H, 01H, 00H, 00H;字符显示SETBELL: DB 7FH, 79H, 38H, 38H, 00H, 00H;字符显示BELLDATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DA TADELAY PROC NEARPUSH AX ; 延时子程序PUSH CXMOV AL, 0MOV CX,AXLOOP $POP CXPOP AXRETDELAY ENDPDISPLAYLED PROC NEARMOV CL, 6 ; 共6个八段管MOV AH, 00100000B ; 从左边开始显示DLOOP:MOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管MOV AL, [BX]MOV DX, OUTSEGOUT DX,ALMOV DX, OUTBITMOV AL, AHOUT DX, AL ; 显示一位八段管PUSH AXMOV AH, 01HCALL DELAYPOP AXSHR AH, 1INC BXDEC CLJNZ DLOOPMOV DX, OUTBITMOV AL, 0OUT DX,AL ; 关所有八段管RETDISPLAYLED ENDPTESTKEY PROC NEARMOV DX, OUTBITMOV AL, 0OUT DX, AL ; 输出线置为0MOV DX, IN_KEYIN AL, DX ; 读入键状态NOT ALAND AL, 0FH ; 高四位不用RETTESTKEY ENDPGETKEY PROC NEARMOV CH, 00100000BMOV CL, 6KLOOP:MOV DX, OUTBITMOV AL, CH ; 找出键所在列NOT ALOUT DX, ALSHR CH, 1MOV DX, IN_KEYIN AL, DXNOT ALAND AL, 0FHJNE GOON_ ; 该列有键入DEC CLJNZ KLOOPMOV CL, 0FFH ; 没有键按下, 返回0FFHJMP EXIT1GOON_:DEC CLSHL CL, 2 ; 键值= 列* 4 +行MOV CH, 4LOOPC:TEST AL, 1JNZ EXIT1SHR AL, 1INC CLDEC CHJNZ LOOPCEXIT1:MOV DX, OUTBITMOV AL, 0OUT DX, ALMOV CH, 0MOV BX, OFFSET KEYTABLEADD BX, CXMOV AL, [BX] ; 取出键码MOV BL, ALWAITRELEASE:MOV DX, OUTBITMOV AL, 0OUT DX, AL ; 等键释放MOV AH, 10CALL DELAYCALL TESTKEYJNE WAITRELEASEMOV AL, BLRETGETKEY ENDPIENTER PROC NEARPUSH AXPUSH DXMOV NUM,0INC SECONDMOV AL, SECONDCMP AL, 60JNE J0MOV SECOND, 0INC MINUTEMOV AL, MINUTECMP AL, 60JNE J0MOV MINUTE, 0INC HOURMOV AL, HOURCMP AL, 24JNE J0MOV HOUR, 0J0: ;判断闹铃MOV AL,HOURCMP AL, RHOURJNE J1INC NUMJ1:MOV AL,MINUTECMP AL, RMINUTEJNE J2INC NUMJ2:CMP NUM, 2JNE EXITMOV CNT, 0EHL33:;MOV DX,0D000H;OUT DX,ALMOV BX, OFFSET BELLCALL DISPLAYLEDDEC CNTJNE L33EXIT:MOV DX, CS8259AMOV AL, 20H ; 中断服务程序结束指令OUT DX, ALPOP DXPOP AXIRETIENTER ENDPIINIT PROCMOV DX, CS8259AMOV AL, ICW1OUT DX, ALMOV DX, CS8259BMOV AL, ICW2OUT DX, ALMOV AL, ICW4OUT DX, ALMOV AL, OCW1OUT DX, ALRETIINIT ENDPSTART PROC NEARMOV AX, DA TAMOV DS, AXMOV NUM, 0MOV LEDBUF, 03FH ; 显示00.00.00MOV LEDBUF+1, 03FHMOV LEDBUF+2, 03FHMOV LEDBUF+3, 03FHMOV LEDBUF+4, 03FHMOV LEDBUF+5, 03FHMOV HOUR, 0MOV MINUTE, 0MOV SECOND, 0CLI ;关中断MOV AX, 0MOV DS, AXMOV AL, 76H; 01110110B ; 计数器1,16位,方式3,二进制MOV DX, CONTROLOUT DX, ALMOV AX, 65500MOV DX, COUNT1OUT DX, AL ; 计数器低字节MOV AL, AHOUT DX, AL ; 计数器高字节MOV BX, 4*ICW2 ; 中断号MOV AX, CODESHL AX, 4 ;*16ADD AX, OFFSET IENTER ;中断入口地址(段地址为0)MOV [BX], AXMOV AX, 0INC BXINC BXMOV [BX], AX ; 代码段地址为0CALL IINITMOV AX, DA TAMOV DS, AXSTI ;开中断LOOP2:MOV AL, HOURMOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0 MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+1, ALMOV AL, MINUTE MOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+3, ALJMP L3LOOP1:JMP LOOP2L3:MOV AL, SECOND MOV AH, 0MOV CL, 10DIV CLMOV CH, AHMOV AH, 0MOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+4, ALMOV BX, OFFSET LEDMAP MOV AL, CHMOV AH, 0ADD BX, AXMOV AL, [BX]OR AL, 80HMOV LEDBUF+5, ALMOV BX, OFFSET LEDBUFCALL DISPLAYLEDD0:MOV BX, OFFSET LEDBUFCALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE LOOP1 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH,0CMP AL,0AHJE SET0CMP AL,0BHJE BELL01CMP AL,0CHJE STOP1CMP AL,0DHJE CLEAR1JMP D0STOP1:CLISTOP2:MOV BX, OFFSET LEDBUFCALL DISPLAYLEDCALL TESTKEYJE STOP2CALL GETKEYAND AL, 0FHMOV AH, 0CMP AL, 0CHJNE STOP2STIJMP D0CLEAR1:MOV HOUR,0MOV MINUTE,0MOV SECOND,0 JMP D0SET0:MOV BX, OFFSET SETCALL DISPLAYLEDCALL TESTKEYJE SET0CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[0],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALSET1:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET1CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[1],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+1, ALJMP SET2BELL01:JMP BELL02SET2:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET2CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[2],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALSET3:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET3CALL GETKEYAND AL, 0FHMOV AH, 0MOV SETBUF[3],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+3, ALJMP SET6BELL02:JMP BELL03SET6:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE SET6CALL GETKEYAND AL, 0FHCMP AL,0AHJE TIMESETJMP D0TIMESET:MOV AL , SETBUF[0]MOV CL,10DMUL CLMOV BL,SETBUF[1]ADD AL,BLMOV HOUR,ALCMP HOUR,24JL LP1MOV HOUR ,0LP1:MOV AL ,SETBUF[2]MOV CL,10DMUL CLMOV BL ,SETBUF[3] ADD AL,BLMOV MINUTE ,ALCMP MINUTE ,60JL LP2MOV MINUTE ,0LP2:MOV SECOND, 0JMP D0BELL03:MOV BX, OFFSET BELL CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL03 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[0],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF, ALBELL1:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL1 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[1],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+1, ALBELL2:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL2 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[2],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+2, ALBELL3:MOV BX, OFFSET LEDBUF CALL DISPLAYLED ; 显示CALL TESTKEY ; 有键入?JE BELL3 ; 无键入, 继续显示CALL GETKEY ; 读入键码AND AL, 0FH ; 显示键码MOV AH, 0MOV RINGBUF[3],ALMOV BX, OFFSET LEDMAP ADD BX, AXMOV AL, [BX]MOV LEDBUF+3, ALBELL4:MOV BX, OFFSET LEDBUF CALL DISPLAYLEDCALL TESTKEYJE BELL4CALL GETKEY AND AL, 0FHCMP AL,0BHJE BELLSETJMP D0BELLSET:MOV NUM,0MOV AL , RINGBUF[0] MOV CL,10DMUL CLMOV BL,RINGBUF[1] ADD AL,BLMOV RHOUR,AL CMP RHOUR,24JL LP3MOV RHOUR ,0LP3:MOV AL ,RINGBUF[2] MOV CL,10DMUL CLMOV BL ,RINGBUF[3] ADD AL,BLMOV RMINUTE ,AL CMP RMINUTE ,60JL LP4MOV RMINUTE ,0LP4:JMP D0START ENDPCODE ENDSEND START。