




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术课程设计报告 题目:闹钟设计 学院:计算机科学与技术学院 组员: 学号: 班级: 学号: 时间:2013年7月7日 目录1 设计题目12 设计任务13 设计方案23.1主要思路23.1.1数码管显示部分23.1.2 流水灯部分33.1.3 蜂鸣部分33.1.4 流水灯部分43.1.2 时间控制部分43.2 详细设计53.2.1 8253A定时的实现53.2.2 8259中断的实现53.2.3 8255A并行接口输入输出的实现64 电路接线图75 程序流程图75.1 主程序流程图75.2 中断6流程图85.3 中断7流程图95.4 闹钟流程图105.5 判断闹钟流程图115.6 进位流程图125.7 流水灯流程图136 源代码137 总结和体会138 附录148.1 附录1148.2 附录2161 设计题目闹钟设计2 设计任务利用唐都实验箱,完成闹钟设计,设计要求: (1)设计一个钟表。在数码管上显示时间。(2)定时时间到,屏幕显示“get up!”字符串。(3)显示同时,流水灯闪烁,蜂鸣器响1秒钟。3 设计方案3.1主要思路在设计过程首先我按照功能将代码分成如下几个部分:(1) 数码管显示部分;(2) 流水灯部分;(3) 蜂鸣部分;(4) 定时部分;(5) 时间控制部分。3.1.1数码管显示部分在设计数码管显示过程中,首先实现数码管的一位显示,在显示过程中实现一位自加程序,并且可以在数码管上把每次自加完的结果显示出来,除此之外,在自加过程中实现循环,即加到9以后可以回归到0继续自加。以上功能实现以后,再依次实现两个,三个到四个数码管的显示,并且都能够完成相应的进位,在设计过程中我用第一个和第二个数码管作为时间的分钟,用数码管的第三个和第四个作为时间的秒,所以在进位过程中,第四个数码管,即秒的低位显示到9的时候要向第三个数码管,即秒的高位进1,第三个数码管显示到6(此处的6实际并不能显示出来)的时候需要向第四个数码管进1,第四个数码管显示到6(此处的6实际并不能显示出来)的时候,要实现所有的数码管可以归零,重新开始。在设计过程中,要实现以上想法,需要了解数码管如何设计,在实现数码管显示的过程中,主要用到分时复用的思想,但是在显示的过程中,要想使上次显示的数据不影响下次要显示的数据必须在显示完当前数字以后要将当前数字刷黑,让整个数码管看起来清晰,并且好像是同时显示分秒一样。3.1.2 流水灯部分在实现流水灯的过程,首先需要了解小灯在高电平还是低电平的情况下亮,其次要明白如果流水灯延迟时间太段,如果流水灯只亮一次,那么可能根本无法看到灯亮过,如果流水灯循环亮的话,可能灯看上去是一直亮的,根本看不出灯是一个亮完紧挨着下一个亮,所以在设计过程中需要耐心调试,这个过程中一大部分原因不是代码逻辑出错,而是延迟设计的不合理。3.1.3 蜂鸣部分蜂鸣器的实现在整个系统中是最简单的,只需要设计一下8255A的控制字,然后在相应的口上输出一个高电平就可以让蜂鸣器鸣叫。例如我设计的过程中控制子设定为C口输出,并且在C口的PC2和PC3输出高电平,这样就可以实现蜂鸣器,但是在蜂鸣器结束响的时候要还原8255A的控制字。3.1.4 流水灯部分定时的实现要靠一个中断来实现,我在设计过程中,定时选择的事中断7,控制时间用的是中断6,因为中断6的优先级比中断7的优先级高,而我们在定时的时候时间必然是走的,所以在定时的时候,要保证控制时间的中断可以打断定时的中断。在这个过程中,一定要注意中断的开与关的问题,因为如果使用不当,很可能高优先级别的中断是无法打断低优先级的中断的,也就是说在实现过程中,如果遇到这样的问题,那么在设定闹钟的过程中是无法实现时间的控制的,也就是说设定闹钟的时候时间是不走的。3.1.2 时间控制部分时间的控制通过中断6和8253的方波发生器来实现,使用中断6因为为了能够实现在定闹钟的过程中也可以实现对时间的控制,采用方波发生器是因为在脉冲最频率最小的一个是OPCLK,这个脉冲为1.193MHZ,这样就是8253最多可以记55ms的时间,而要实现一秒钟让时钟走一次,就必须用到方波发生器和中断。在实现过程中,我让方波发生器每50ms产生一个方波,每产生一个方波就调用一次中断6,中断6每被调用一次就记录一次,中断6每被调用够20次就让时间加1秒,这样就可以时间的准确控制。3.2 详细设计详细设计包括对8253A,8259以及8255A的设计,在整个系统工作过程中,要实现数码管的显示,蜂鸣器以及流水灯都要同过对8255A的控制来实现,要实现时间的精确控制就要用到8253A和8259的配合,要实现闹钟的定时就要用到8259。3.2.1 8253A定时的实现由于唐都实验箱留给使用着的只有计数器2,所以在实验过程中只能用到计数器2,有原因在实现过程中用到方波发生器,所以用到方式3,所以控制字为0B6H,而要实现每50秒产生一个方波,计数值需要设定位0E902H,这样就可以实现每50毫秒通过8253A的out2给中断6一个信号。3.2.2 8259中断的实现该系统的中使用到的中断有两个,中断6和中断7,中断6用来实现时间的控制,中断7用来实现闹钟定时的设置。中断6,在设计过程中主要起到计数作用,即中断6每被调用20次就要实现让时间加1秒,并且还要在此基础上实现检测当前时间是否到达定的闹钟时间。中断7,实现闹钟的定时,在实现过程中主要的功能有,在定时间的时候,可以将所定的时间显示在数码管上,并且在设计过程默认在按动数字小键盘的过程中,按动第5次结束中断7。3.2.3 8255A并行接口输入输出的实现在设计过程中,各口的功能介绍如下:(1)PA0到PA3,实现数码管的片选和确定数字小键盘。在实现数码管的片选的时候,PA0到PA3为输出,在实现确定按动的数字小键盘为几的时候,PA0到PA3为输入。(2)PB0到PB7,实现数码管的显示。PB0到PB7,在时间显示和闹钟定时,都为输出,输出要在某个数码管上显示的内容。(3) PC0到PC1,实现确定数字小键盘。因为数字小键盘一共有8个按键,所以在确定所按动的按钮为哪个的过程中,不仅需要确定按动的是哪一列的,也需要确定按动的是哪一行的,而确定行就是通过PC0和PC1来实现的。(4) PC2到PC3,实现蜂鸣器的控制。在实现蜂鸣器的时候完全可以只用C口的一位就可以,但是为了接线方便,我设计了两个,即在到达定时时间的时候,PC2和PC3输出高电平。(5) PC4到PC7,实现流水灯的显示。在设计程序的时候,我是设计好各个功能的子程序,然后再拼成一个整体,在设计流水灯的时候,我设计的时8个灯,依次亮,所以按照我开始设计的需要8255A8位的输出,但是由于到最后没有了8个口,所以我只能实现4个灯的流水显示。4 电路接线图见附录15 程序流程图5.1 主程序流程图5.2 中断6流程图5.3 中断7流程图5.4 闹钟流程图5.5 判断闹钟流程图5.6 进位流程图5.7 流水灯流程图6 源代码见附录27 总结和体会在整个设计过程中,我是通过由零到整的过程实现的,即首先将该题目的所有功能分成几个小的单个的功能,然后将这些子功能一个一个实现,实现了这些子功能之后,再将这些代码按照要求合并成一个整体,在实现过程中让我印象最深刻的是实现数码管上时间的显示部分,由于之前没有做过,所以在调试的过程中走了很多弯路,而且这块儿,每显示一个数码管,必须立马将其刷黑,不然显示的时候上次的结果会影响这次的显示,而且按道理来说,如果这次要显示的内容和上次显示的内容完全一样的话,就可以不用刷黑也可以很好的显示,但是我尝试了很多次,虽然说道理是这样,但是实现起来总是不能正常显示。在这个过程中我学会了数码管的显示,流水灯的设置,8255A、8253A、8259的使用,加深了对这些芯片的了解和使用,学会了中断的控制调用,计数器的灵活用运,以及8255A的输入输出的控制,但是让我无法解决的是,如果程序中某块儿是不允许中断的,但是恰好使用者按下了触发某个中断的按钮,那么此时这个触发是无效的,对于这个问题,我到最后也没有解决。8 附录8.1 附录1电路图:8.2 附录2源代码:STACK SEGMENT STACK DW 64 DUP(?)STACK ENDSDATA SEGMENTGETUPDB Get Up!,0AH,0DH,00HTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FHTABLE1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHTABLE2DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,00HADDR4DW 0000HADDR3DW 0000HADDR2DW 0000HADDR1DW 0000HCOUNTDB 00HTIMINGDB 8H,8H,8H,8HCOUNT2DB 00HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:PUSH DS;保存数据段MOV AX,0000HMOV DS,AX;数据段清零MOV AX,OFFSET IRQ7;取中断程序入口地址(相对地址)ADD AX,2000H;装载是,IP=2000H(绝对地址)MOV SI,003CH;填8259A中断7的中断矢量MOV SI,AX;填偏移矢量MOV AX,0000H;段地址CS=0000MOV SI,003EHMOV SI,AX;填段地址矢量MOV AX,OFFSET IRQ6;取中断程序入口地址(相对地址)ADD AX,2000H;装载是,IP=2000H(绝对地址)MOV SI,0038H;填8259A中断6的中断矢量MOV SI,AX;填偏移矢量MOV AX,0000H;段地址CS=0000MOV SI,003AHMOV SI,AX;填段地址矢量POP DS;弹栈IN AL,21H;读8259A中断屏蔽字AND AL,3FH;开8259A中断7和中断6OUT 21H,ALMOV AX,DATAMOV DS,AXMOV AX,OFFSET TABLE1MOV SI,AXMOV AX,OFFSETADDR4MOV DI,AXMOV DI,SIMOV AX,OFFSETADDR3MOV DI,AXMOV DI,SIMOV AX,OFFSETADDR1MOV DI,AXMOV DI,SIMOV AX,OFFSET TABLE2MOV SI,AXMOV AX,OFFSETADDR2MOV DI,AXMOV DI,SIMOV AL,10001001B;设置8255A的方式控制字,B口方式0,输出OUT 63H,ALMOV AL,0B6H;计数器2,方式3,每50ms输出一个高电平OUT 43H,ALMOV AL,02H;设定计数值,按动KKL1,每按动第2次之后调用中断6OUT 42H,AL;写低8位MOV AL,0E9HOUT 42H,AL;写高8位DISPLAY:MOV DX,OFFSET ADDR4MOV SI,DXMOV AL,7H;选到第4个LED显示管OUT 60H,AL;选择LED显示管MOV AX,SIMOV SI,AXMOV AL,SIOUT 61H,AL;在第4个LED显示内容MOV AL,7HOUT 60H,ALMOV AL,00HOUT 61H,AL;将第4号LED清黑MOV DX,OFFSET ADDR3MOV SI,DXMOV AL,0BH;选到第3个LED显示管OUT 60H,ALMOV AX,SIMOV SI,AXMOV AL,SIOUT 61H,AL;在第3个LED显示管上显示数据MOV AL,0BH;将第3号LED清黑OUT 60H,ALMOV AL,00HOUT 61H,ALMOV DX,OFFSET ADDR2MOV SI,DXMOV AL,0DH;选到第2个LED显示管OUT 60H,ALMOV AX,SIMOV SI,AXMOV AL,SIOUT 61H,AL;在第3个LED显示管上显示数据MOV AL,0DH;将第2号LED清黑OUT 60H,ALMOV AL,00HOUT 61H,ALMOV DX,OFFSET ADDR1MOV SI,DXMOV AL,0EH;选到第1个LED显示管OUT 60H,ALMOV AX,SIMOV SI,AXMOV AL,SIOUT 61H,AL;在第1个LED显示管上显示数据MOV AL,0EH;将第1号LED清黑OUT 60H,ALMOV AL,00HOUT 61H,ALJMP DISPALYIRQ6:PUSH AXPUSH BXPUSH CXPUSH DXMOV DX,OFFSET COUNT;中断7每次被调用一次就让COUNT里边的值加1MOV SI,DXMOV AL,SIINC ALMOV SI,ALMOV AL,SICMP AL,14HJZCARRYMOV AL,20H OUT 20H,ALSTIPOP DXPOP CXPOP BXPOP AXIRETCARRY: CALL CHECKNUM;检验是否到达定时时间MOV DX,OFFSET COUNTMOV SI,DXMOV AL,00HMOV SI,AL;将上次中断被调用20次的记录清零MOV DX,OFFSET ADDR4;每隔一秒变化一次时钟要显示的值MOV SI,DXMOV AX,SIMOV SI,AXMOV AL,SICMP AL,6FH;比较秒的最后一位是否到到9,如果到了则调用check1JZ CHECK1CHECK2:MOV DX,OFFSET ADDR3MOV SI,DXMOV AX,SIMOV SI,AXMOV AH,00HMOV AL,SICMP AL,7DH;检查秒的高位是否到6JZ CHECK3;如果是调用check3JMP ADD9;如果不是跳转到ADD9CHECK4:MOV DX,OFFSET ADDR2MOV SI,DXMOV AX,SIMOV SI,AXMOV AL,SICMP AL,00H;检查分钟的低位是否到9JZ CHECK5JMP ADD9CHECK6:MOV DX,OFFSET ADDR1MOV SI,DXMOV AX,SIMOV SI,AXMOV AH,00HMOV AL,SICMP AL,7DH;检查分钟的高位是否到6JZ CHECK7JMP ADD9CHECK1:MOV DX,OFFSET ADDR3MOV SI,DXMOV AX,SIINC AXMOV SI,AX;将秒的高位加1MOV DX,OFFSET ADDR4MOV SI,DXMOV DX,OFFSET TABLE1DEC DXMOV SI,DX;将秒的低位清零JMP CHECK2;检查秒的高位是否到6CHECK3:MOV DX,OFFSET ADDR2MOV SI,DXMOV AX,SIINC AXMOV SI,AX;分钟的低位加1MOV DX,OFFSET ADDR3MOV SI,DXMOV DX,OFFSET TABLE1MOV SI,DX;秒的高位归零JMP CHECK4CHECK5:MOV DX,OFFSET ADDR1MOV SI,DXMOV AX,SIINC AXMOV SI,AX;分钟的高位加1MOV DX,OFFSET ADDR2MOV SI,DXMOV DX,OFFSET TABLE2MOV SI,DX;分钟的低位归零JMP CHECK6CHECK7:MOV DX,OFFSET ADDR1MOV SI,DXMOV DX,OFFSET TABLE1MOV SI,DX;将分钟的高位归零ADD9:MOV DX,OFFSET ADDR4MOV SI,DXMOV AX,SIINC AXMOV SI,AXMOV AL,0FHOUT 60H,ALMOV AL,00HOUT 61H,AL;将第1到4号LED清黑POP DXPOP CXPOP BXPOP AXMOV AL,20H OUT 20H,ALSTIIRETENDI:MOV AL,10001001B;跳出中断时恢复8255A的控制字OUT 63H,ALMOV AL,20H OUT 20H,ALMOV BX,OFFSET COUNT2MOV SI,BXMOV AL,00HMOV SI,AL;跳出时将COUNT2中的值改为0,以便下次设置时钟时使用STI;开中断POP DXPOP CXPOP BXPOP AXIRETIRQ7:PUSH AXPUSH BXPUSH CXPUSH DXSTIMOV AX,DATAMOV DS,AXMOV DX,OFFSET TIMING;将定时数据放在TIMING中 MOV SI,DXADD DX,3MOV DI,DXMOV AL,81HOUT 63H,ALBEGIN: CALL DISCALL CLEARCALL CCSCANJNZ INK1JMP BEGININK1: CALL DISCALL DALLY1CALL DALLY1CALL CLEARCALL CCSCANMOV BX,OFFSET COUNT2;每按动一个数字键,COUNT2加1MOV SI,BXMOV AL,SIINC ALMOV SI,ALCMP AL,05H;按动的前四次会将数据记录在TIMING中,按动第5次后跳出中断JZ ENDIJNZ INK2JMP BEGININK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CHOUT 60H,ALIN AL,62HTEST AL,01HJNZ LONEMOV AL,00HJMP KCODELONE: TEST AL,02HJNZ NEXTMOV AL,04HKCODE: ADD AL,CLCALL PUTBUFPUSH AXKON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AXNEXT: INC CLMOV AL,CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUMKERR: JMP BEGINCCSCAN: MOV AL,00HOUT 60H,ALIN AL,62HNOT ALAND AL,03HRETCLEAR: MOV AL,00HOUT 61H,ALRETDIS: PUSH AXMOV DX,OFFSET TIMINGMOV SI,DXMOV DL,0F7HMOV AL,DLAGAIN: OUT 60H,AL MOV AL,SIMOV BX,OFFSET TABLEAND AX,00FFHADD BX,AXMOV AL,BXOUT 61H,ALCALL DALLY1INC SIMOV AL,DLTEST AL,01HJZ OUT1ROR AL,1MOV DL,ALJMP AGAINOUT1: POP AXRETDALLY1: PUSH CXMOV CX,0010HT1: MOV AX,0010HT2: DEC AXJNZ T2LOOP T1POP CXRETPUTBUF: MOV SI,DIMOV SI,ALDEC DICMP DI,2FFFHJNZ GOBACKMOV DI,3003HGOBACK: RETMOV AL,20H OUT 20H,ALSTI;开中断IRETDALLY:PUSH AX;延时显示灯亮MOV CX,003FHA4:MOV AX,0260HA5:DEC AXJNZ A5LOOP A4POP AXRETLAMP:MOV BX,OFFSET GETUP;屏幕输出Get Up!MOV AH,06HINT 10HMOV AL,10010010B;给8255A写入控制字,C口输出OUT 63H,ALMOV AL,01111111B;C口要输出的值,流水等第一个亮A2:OUT 62H,ALCALL DALLY;延迟CMP AL,0EFH;比较现在是否亮到第4个,如果是跳转JZ A3ROR AL,1;如果没有到达第4为,右循环一位JMP A2;跳转到A2显示移位后的样子A3:MOV AL,0FFH;让8个灯都灭掉OUT 62
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年中级软考过关检测试卷及答案详解(真题汇编)
- 2024-2025学年火电电力职业鉴定综合提升测试卷及完整答案详解(历年真题)
- 湖南长沙市望城区引进本科师范专业毕业的2025届教育-教育学硕士研究生笔试备考题库附答案详解
- 2024安全监察人员题库试题附答案详解【培优B卷】
- 2024-2025学年度广播电视编辑记者考前冲刺练习及参考答案详解【培优B卷】
- 2024法院司法辅助人员练习题及完整答案详解【名师系列】
- 2025年自考专业(计算机信息管理)考前冲刺练习试题含答案详解【夺分金卷】
- 2025年自考专业(人力资源管理)考试彩蛋押题含答案详解【突破训练】
- 语文学科基地创建材料
- 建筑工程实习报告范例
- GB 23466-2025听力防护装备的选择、使用和维护
- 人教PEP版(2024)四年级上册英语-Unit 3 Places we live in 单元整体教学设计(共6课时)
- 华为信息安全管理培训课件
- 贵阳市殡仪服务中心招聘考试真题2024
- 重庆市危险化学品企业变更管理实施指南(试行)解读2025.7.25
- 煤改电工程施工质量监控方案和措施
- 布病的护理教学课件
- (2025年标准)预售小麦协议书
- 2025年院感测试题及答案
- 公司培训防诈骗知识宣传课件
- 2025年全国《质量知识竞赛》题库及答案
评论
0/150
提交评论