1、西安科技大学微机原理与接口技术课程设计题 目: 闹钟设计 学 院: 计算机科学与技术学院 专业班级: 计科 1004班 组 员: 郭雅心 1008030421 韦清松 1008030422 2013 年 7 月 8 日目 录1 闹钟设计要求与设计方案 11.1. 设计目的 11.2. 设计要求 11.3. 设计思路 12 闹钟设计的硬件设计 22.1 硬连线图: 22.2 四大模块: 22.2.1 8253 定时、计数器模块 22.2.2 8255 并行接口模块 32.2.3 8259 中断控制模块 32.2.4 显示模块 33 闹钟设计的软件设计 43.1. 主程序设计 43.2. 按键处理
2、程序设计 53.3. IRQ7中断设计 .63.4. 七段数码管显示设计 .74 闹钟设计的运行与调试 85 设计体会与小结 86 程序清单 97 参考文献 .1711 闹钟设计要求与设计方案1.1. 设计目的学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。1.2. 设计要求 设计一个钟表。在数码管上显示时间。 定时时间到,屏幕显示“get up!”字符串。 显示同
3、时,流水灯闪烁,蜂鸣器响 1秒钟。1.3. 设计思路本设计以唐都仪实验箱为载体,结合中断控制器 8259A、并行接口 8255、中断定时器 8253、七段数码显示管 LED及八个发光二极管的功能,用汇编语言编程实现了闹钟设计的实验。闹钟的总体设计原理是:首先利用定时芯片 8253的定时作用定时计数,每10ms开一次中断即 8253计数 18432次调用时间显示程序,数码管加 1,毫秒部分加到 99后清 0向前进 1 秒部分到显示 59S过后变为 0,执行此程序后 8255就会工作,把时间在四个数码管上显示时间。当数码管显示时间与拨动 KK1开关设置的定时时间相同时。在程序里面设置了一个蜂鸣器标
4、志变量和流水灯标志变量,当变量为 0的时候,表明蜂鸣器没有响,当变量为 1的时候,表明蜂鸣器正在发声。每次秒钟加一之前,检测蜂鸣器标志变量,当蜂鸣器变量为 1时,就关闭蜂鸣器,并置蜂鸣器标志变量为 0。当秒钟加一之后,若当前设定时间与实时时间相同,就开启蜂鸣器,并置蜂鸣器标志变量为 1。流水灯相似,只是多了几个判断,分别显示四个流水灯亮。在第一个流水灯亮时,屏幕显示“get up!” ,流水灯闪烁,蜂鸣器响。 闹钟具体做法:时间显示程序要配合延时程序进行,为了得到良好的显示效果,延时程序要尽量接近 1秒,精确的时间延迟程序,第一二块数码管显示分位,第三四块显示秒位。数码管显示一段时间 60s后
5、再跳回到初始位置00s,再显示,由此循环下去。设置一个闹钟开关标志变量,用来调节闹钟有效性,当开关为 1时,定时设置有效,为 0则无效,定时时间为有效时的时间设置。22 闹钟设计的硬件设计2.1 硬连线图:GATE28253 CLK2OUT2IRQ78259 PB0PB78255 PA0PA1PA2PA3PA4PA7PC4PC0PC1PC2 +5VX4X1X2X33个 LED灯 D0D2系统总线1.8432MHZ嗡鸣器 SPK2*4键盘KK2图 2-1硬线连接图2.2 四大模块:2.2.1 8253 定时、计数器模块8253A 芯片在本实验中用了计数器 2,工作在方式 0 下, 8253 计数
6、次数为 10ms*1.1.8432MHz,中断每 10ms 有一次,这样就可以通过控制发中断的次数来得到想要的时间。8253 的 CLK0 接系统时钟 1.8432MHZ,门控信号 GATE2 接+5V。采用内部 7 号中断。32.2.2 8255 并行接口模块8255的 PA0PA3负责 4位 7段数码管的位选,以及 2x4键盘扫描的列信号。PA4PA7负责 4位流水灯的闪烁。PB0PB7 负责 4位 7段数码管的段选。PC0PC1负责 2x4键盘扫描的行信号。PC2 负责接收开关信号。PC4 负责蜂鸣器的发声。2.2.3 8259 中断控制模块本次设计使用了 8259中断控制器的 IRQ7
7、,通过 IRQ7中断服务子程序设置DI来计数。每加到 100即达到 1秒,令秒加 1,计数器清 0以便重新计数。秒加到 60,进位让分加 1.选中数码管最右管让其显示分的个位,然后进位判断,数码管选择依次左移,显示整个时间时和分。定时模块该模块实现的功能是通过键盘设定一个定时时间,并将当前定时时间显示在计算机终端上。当实时时钟每走一分的时候,就与设定的定时时间比较,当定时时间与实时时间相同时,则触发相应的闹钟程序:显示“Get Up!”字符串,流水灯闪烁,蜂鸣器响一分钟。因为,键盘既可以修改实时时间,也可以修改定时时间,所以,为了区分,我们使用了一个开关 KK2,通过与 C口一个引脚相连来选择
8、修改模式。当开关断开的时候,键盘修改的是定时时间,当开关闭合的时候,键盘修改的是实时时间。2.2.4 显示模块该显示模块包括三个部分:实时时间显示、定时时间显示以及流水灯闪烁。实时时间是在主程序里面,通过数码管显示的。而定时时间是在每次修改的时候,显示在计算机终端上。流水灯是通过定时模块触发显示的,当定时时间与实时时间相同时,置流水灯标志变量为 1。在主程序里面循环检测标志变量,当变量为 0的时候,流水灯不闪烁,当变量为 1时,流水灯闪烁,闪烁完毕之后,置标志变量为 0。43 闹钟设计的软件设计3.1. 主程序设计开始I R Q 7 中断初始化 , 8 2 5 9初始化8 2 5 3 初始化初
9、值1 8 4 3 2 , 8 2 5 5 初始化流水灯标志位L E D F L A G = 1 ?数码管显示时间是否流水灯闪烁判断流水灯是否显示完 ?流水灯灭 ,L E D F L A G 置 0数码管显示时间是否判断是否有按键 P C 0 、 P C 1否是调用键盘处理程序结束图 3-1主程序流程图53.2. 按键处理程序设计开始判断是修改时钟还是闹钟 , P C 2 = 0 ?修改定时时间是是否是加按键是判断加的位数并对应加 1是否达到最大值否当前值加 1调用显示终端程序是结束否判断减的位数并对应减 1是否达到最小值 0 ?是当前值减 1否图 3-2按键处理程序流程图63.3.IRQ7中断
10、设计开始中断计数器加 1D I 1 0 0 ?计数器清 0 :D I = 0 ; 定义秒变量加 1否嗡鸣器变量S P E A K E R = 1 ?关闭嗡鸣器判断 M I A O 6 0是时钟变量加 1否比较时钟时间与设置时间是否相等响嗡鸣 , 流水灯亮 , 标志位重置调用 G E T U P是定时器重置 , 中断复位否是否结束图 3-3 IRQ7中断流程图73.4.七段数码管显示设计图 3-3七段数码管显示开始保护寄存器数值选中第一位数码管 , 最右边数码管最左边边数码管亮 ?位码送 A 口显示改变位码要显示的字符段码表指针送 B X段码输出至 B 口调用延时指针指向下一数码管否是结束84
11、闹钟设计的运行与调试本电子时钟可以 24小时循环计时,数码管显示时和分,能够校时,可以设定闹钟。操作方法如下:开机运行后,装入程序并运行,数码管显示 00:00并开始走时。按动 2*4小键盘可以设定闹钟时间,设定好的闹钟时间显示在电脑终端。按下开关 KK2并同时按动小键盘则是对时钟进行调时,8 个小键盘分别对应时、分的十位以及个位的加和减。内存会将设定的时间存储并与时钟时间比较,当相等时,嗡鸣器响,流水灯亮、显示 GET UP字符串。5 设计体会与小结为期两周的微机原理课设结束了,在这两周中,我通过查阅大量资料,亲自动手实验,对微机原理理论课有了实践的经验,巩固了微机原理的课程知识。并且锻炼了
12、自己的动手能力。在这两周的课程设计时间里,课程设计的基本目的达到了。我们的课程设计题目是电子闹钟,用 IRQ7子程序中给出计数次数 100D。每达到 100就实现秒的加 1,秒加到 60则让分加 1,依次进位并判断自加范围并且选中数码管显示。8255B 负责将内存里的时位和分位值输出到数码管显示。KK2 与 8255C口PC2引脚相接,通过对定时标志位的置 0置 1来控制是修改实时时间还是设定闹钟时间。小键盘负责对时间加 1和减 1的操作。通过设定标志位变量来设定闹钟的响铃、流水灯的亮否。通过这次的课设,让我学会了很多。一次次的调试,一次次的修改让我变得更加坚强的同时,也使得我对微机接口以及汇
13、编的很多知识得到了很好的掌握,同时软硬件的结合使用动手能力也有很大的提高。期间遇到很多问题,如数码管显示乱码,时钟只是显示却不走时,流水灯不亮等问题。经过老师的指导和同学的帮助让我客服了一个又一个问题。通过交流,我的思维得到了很大的发散。很多问题是在交流后突然思考出来的。两周的实习虽然很累,但是收获也是非常明显。总之,这次课设让我受益匪浅。96 程序清单STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管可显示 0到 9CLCTIME D
14、B 4 DUP(?)ALARMTIME DB 4 DUP(?)MODE DB 00HMIAO DB 00HSPEAKER DB 01HMESSAGE DB Get Up!,0AH,0DH,00H;定义 MESSAGE变量LEDFLAG DB 00HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXMOV ES, AX;IRQ7PUSH DSMOV AX,0000HMOV DS,AXLEA AX, IRQ7;取偏移地址ADD AX,2000HMOV SI,003CH MOV SI,AX;偏移量放入中断向
15、量表低位MOV AX,0000H;段地址MOV SI,003EH MOV SI,AX;段地址写入中断向量表高位IN AL,21H;读中断屏蔽寄存器AND AL,7FH;开 7号中断OUT 21H,AL;写 OCW1POP DSSTI;开中断10MOV AL,0B0H ;计数器 2,方式 0,二进制OUT 43H,AL;8253控制字送寄存器MOV AX,18432D;设置初始值OUT 42H,AL;低位写入 2号计数器MOV AL,AHOUT 42H,AL;高位写入MOV DI,00HLEA SI,CLCTIME;取 CLCTIME变量的偏移地址MOV AX,00HMOV SI,AXMOV S
16、I+1,AXMOV SI+2,AXMOV SI+3,AXLEA SI,ALARMTIME;取 ALARMTIME变量的偏移地址MOV SI, AXMOV SI+1,AXMOV SI+2, AXMOV SI+3, AXMOV AL, 81H ;A O M0,B O M0,C0-C3 IOUT 63H, AL;8255控制字MOV AL,00HOUT 61H,AL;B口对应数码管全灭OUT 62H,AL;C口输出 0MOV AL,0F0H OUT 60H,AL;A口对应流水灯状态全灭MAIN: STI;开中断TEST LEDFLAG,01H;判断流水灯标志位状态JZ PRO0;LEDFLAG为 0
17、跳到 PRO0MOV AH,0EFH;不为 0时 AH置 11101111BSELECT0:IN AL,60H;A口地址给 ALOR AL,0F0H;AL高 4位置 1AND AL,AH OUT 60H,AL;选中 PA4对应的流水灯MOV CX,00A0HSELECT1: CALL DISPLAY;调用显示11CALL CLEAR;调用清屏LOOP SELECT1ROL AH,1;AH循环左移选中下一个流水灯TEST AH,01H;判断流水灯是否循环一遍JNZ SELECT0;未循环完跳到 SELECT0MOV AL,0FFH;循环完则将 AL置 1OUT 60H,ALMOV LEDFLAG
18、,00H;流水灯标志变量置 0PRO0: CALL DISPLAY;调用显示程序CALL CLEAR;调用清屏CALL SZCJNZ PRO1;AL第 1、2 位都不为 0JMP MAINPRO1: CALL DISPLAY ;调用显示程序CALL DALLY;调用延时CALL CLEAR;清屏CALL SZCJNZ PRO2JMP MAINPRO2: MOV CH,0FEHMOV CL,00HJUDGE0: MOV AL,CH;AL置 0FEHOUT 60H,AL;A口输出选中 PA0端口对应的 1号按钮IN AL,62H;C口地址给 ALTEST AL,01H;判断 C口地址 PC0是否为
19、 0JNZ JUDGE1;不为 0转至 JUDGE1MOV AL,00HJMP KPROJUDGE1: TEST AL,02H;判断 C口地址 PC1是否为 0JNZ NEXTMOV AL,04HKPRO: ADD AL,CLCALL PUTBTN;调用键盘处理程序PUSH AXKDS:CALL DISPLAY;调用显示12CALL CLEARCALL SZCJNZ KDSPOP AXNEXT: INC CLMOV AL,CH;AL置 0FEHTEST AL,08HJZ MAINROL AL,1MOV CH,ALJMP JUDGE0;键值处理程序PUTBTN:PUSH AXPUSH BXPUS
20、H CX PUSH AXIN AL,62H;C口地址给 ALTEST AL,04H ;判断是修改定时时间还是实时时间,PC2JNZ REBAC;PC2不为 0MOV MODE,01H ;置修改模式标志变量为 1LEA BX, ALARMTIME;为 0则修改定时时间JMP BTNREBAC:MOV MODE,00HLEA BX, CLCTIMEBTN:POP AXTEST AL,04H ;判断键值是加一还是减一,0-3 为加 1,4-7 为减 1JNZ SUB0;PC2不为 0转至减MOV AH,00HMOV SI,AXMOV CL,BX+SITEST AL,01H;PA0JNZ EDGE0;
21、PA0不为 0转至 EDGE0CMP CL,2 ;判断是否到最大值13JZ GOBACKINC CLMOV BX+SI,CL;分的十位加 1CALL DISSETTIME ;调用显示设定时间程序JMP GOBACKEDGE0:CMP CL,09H ;判断是否到最大值JZ GOBACKINC CLMOV BX+SI,CL;分个位加 1CALL DISSETTIMEJMP GOBACKSUB0:SUB AL,04HMOV AH,00HMOV SI,AXMOV CL,BX+SICMP CL,00H;判断是否为 0JZ GOBACKDEC CLMOV BX+SI,CL;减 1CALL DISSETTI
22、MEGOBACK: POP CX;返回POP BXPOP AXRETDISSETTIME: ;定时时间显示在电脑上PUSH AXMOV AL,MODE;判断修改模式CMP AL,01HJNZ DISBACKMOV AH,01HLEA SI, ALARMTIME;取定时时间变量偏移地址MOV AL,SIADD AL,30HINT 10H;显示在终端MOV AL,SI+114ADD AL,30HINT 10HMOV AL,:INT 10HMOV AL,SI+2ADD AL,30HINT 10HMOV AL,SI+3ADD AL,30HINT 10HMOV AL,0AHINT 10HMOV AL,0
23、DHINT 10HDISBACK:POP AXRETSZC:MOV AL,0F0H;AL高位置 1OUT 60H,ALIN AL,62HNOT AL;AL按位取反AND AL,03H;C口第 1、2 位对应调时RETCLEAR: MOV AL,00HOUT 61H,ALRET;实时时钟IRQ7:PUSH AXPUSH BXPUSH CXINC DICMP DI,6000 ;判断是否产生 6000次中断JNZ RETURNMOV DI,00H;计数器清零CMP SPEAKER,01H ;判断蜂鸣器是否正在发声15JNZ INTR0MOV AL,08H;若正在发声,则关闭蜂鸣器OUT 63H,AL
24、;INC MIAO;CMP MIAO,60;JNZ RETURN;MOV MIAO,0HINTR0: LEA BX,CLCTIME ;取时钟变量偏移地址MOV SI,0003H ;分钟的个位为数组最后一位,十位为倒数第二位 INTR1: MOV AL,BX+SIINC AL ;AL加一TEST SI,0001H ;判断是否应该进位JNZ INTR2CMP AL,02H;时最高位不超过 2JNZ INTR3MOV AL,00HMOV BX+SI,ALDEC SICMP SI,0FFFFHJNZ INTR1JMP INTR4INTR2: CMP AL,0AHJNZ INTR3MOV AL,00HM
25、OV BX+SI,ALDEC SICMP SI,0FFFFHJNZ INTR1JMP INTR4INTR3: MOV BX+SI,ALINTR4: LEA BX, CLCTIME ;比较实时时间与设定时间LEA BP, ALARMTIMEMOV SI,0000HINTR5: MOV AL,SI+BXMOV CL,DS:SI+BPCMP AL,CLJNZ RETURNINC SI16CMP SI,0004HJNZ INTR5MOV AL,09H;若相同,则开启蜂鸣器OUT 63H,ALMOV SPEAKER,01HMOV LEDFLAG,01H ;置流水灯标志变量为 1MOV BX,OFFSET
26、 MESSAGE ;输出 get up字符串MOV AH,06HINT 10HRETURN:MOV AX,18432D ;定时器重新计数OUT 42H,ALMOV AL,AHOUT 42H,ALMOV AL,20H;中断复位OUT 20H,ALPOP CXPOP BXPOP AXIRETDISPLAY: PUSH AX;数码管显示时间PUSH DXPUSH BXLEA SI,CLCTIME;取时钟实时时间偏移地址MOV DL,0FEH ;11111110,选中数码管MOV AL,DLDISAGAIN:IN AL,60HOR AL,0FH;AL低 4位置 1AND AL,DL;选中 PA0 OU
27、T 60H,AL;BIT SELECTMOV AL,SI ;DISPLAY SILEA BX,TABLEAND AX,00FFH;AH高位清 0ADD BX,AXMOV AL,BX;查表转换17OUT 61H,AL;B口输出秒显示CALL DALLYINC SIMOV AL,DLTEST AL,08H ;判断 AL第 3位是否是 0JZ OUT1;为 0转到 OUT1,说明数码管最后一个已亮ROL AL,1;否则左移 1位MOV DL,ALJMP DISAGAINOUT1: POP BXPOP DXPOP AXRETDALLY: ;延时程序PUSH CXPUSH AXMOV CX,0010HT1: MOV AX,0010HT2: DEC AXJNZ T2LOOP T1POP AXPOP CXRETCODE ENDSEND START7 参考文献 龚尚福、朱宇. 微机原理与接口技术.西安电子科技大学出版社.2008 龚尚福、朱宇. 微机原理与接口技术实验指导书.西安电子科技大学出版社.2008