电子闹钟《微机接口与汇编语言》课程设计报告.doc_第1页
电子闹钟《微机接口与汇编语言》课程设计报告.doc_第2页
电子闹钟《微机接口与汇编语言》课程设计报告.doc_第3页
电子闹钟《微机接口与汇编语言》课程设计报告.doc_第4页
电子闹钟《微机接口与汇编语言》课程设计报告.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子闹钟 电子闹钟 微机接口与汇编语言微机接口与汇编语言 一 一 课题内容和要求课题内容和要求 题目描述 利用汇编语言实现一个可以在显示器上显示时 分 秒的电子 时钟 并能提供整点报时功能 基本要求 1 设计一个基本的具有显示时 分 秒的电子时钟 2 到整点或预定的报警时间 能够以不同的音乐进行报时 可以 自行设置闹钟报警时间 3 实物演示时要求讲出程序原理和设计思想 4 程序运行良好 界面清晰 提高要求 设计一个具有钟面 分针 秒针的指针式钟表 在圆盘上有均匀分 布的 60 根刻度 对应小时的刻度用不同颜色的长刻度区别 并且将 12 3 6 9 对应的拉丁文绘制于表盘外 设计提示 1 指针式钟表的绘制 将屏幕设置成图形显示方式 通过画点 画线 画圆等基本程序完成钟表的绘制 表盘圆周上刻度线段两端点坐标计算 是钟表绘制的核心部分 2 秒针 分针 时针的转动 是经过一定的延时时间 通过在下 一位置重新画一个 在原来的位置用背景色覆盖的方法实现 3 音乐的演奏 利用 CPU 支持的外围电路 8254 与 8255 通过汇 编程序改变 8255 的 PB0 PB1 口 接通扬声器 使得计算机能够发出一定频率 的声音 同时通过 8254 的与 8255 连接的 2 号计数器控制指定频率 从而达到 控制扬声器的音乐的效果 通过建立适当的延时程序达到一定时间后则改变 2 号计数器产生的方波的频率 实现音乐程序的演奏 二 需求和思路分析二 需求和思路分析 经分析本次程序设计的主要内容主要分为如下的几个模块 当前时间的获取并显示 码制转换 设定闹钟报鸣的时间 不同频率的 闹铃声 钟表的绘制和并实现动态等模块 其中钟表的绘制和动态走动部分比 较难是本次课程设计的提高部分 且改模块可单独形成一个模块 所以放到最 后进行考虑 1 时间的获取可以用 INT 21H 的 2CH 功能 该功能调用 DOS 时间调用功 能 功能号 2CH 小时 分钟 秒数分别保存在 保存的形式是以二进制的形式 故显示时要 2 码制转化利用 ASCII 码与二进制码的关系 ASCII 二进制 30H 3 闹钟鸣叫主要利用 8254 的二号计数器和 8255 的 PB0 和 PB1 来设定 4 闹钟的表盘 指针的绘制 并实现时针 分针 秒针的走动 主要通 过过图形的画点进行操作 并通过在固定的区域内不断的刷屏来实现 三 概要设计三 概要设计 一 算法设计及重要程序流程图 1 程序整体流程 check displa y int 21h 2ch call bctd ASCII clear or ESC call editmusic call edittime 2 edittime子程序流程图 CALL EDITTIME INT 21H 9 int 21h 0ah h h mm ss t buffer ascii 30H dh add dh 10 30H dl add dl 10 inc bx mov al dh add al dl mov temphor al 2 editmusic子程序 CALL EDITMUSIC INT 21H 9 int 21h 0ah t buffer music 1 2 3 mov music 800 mov music 3200 mov music 1600 3 打开和关闭扬声器 此处重要用到了8254和8255的相关知识 书中P238有相关代码 首先 应该读出8255的PB端口当前的状态 将PB0和PB1分别置1 以读修改 写的方式修改PB0和PB1接通扬声器 其次 利用8254的2号计数器产生XXX Hz 的方波 此处计数初值利用公式 N fclk1 fout2 对8254先写低8位 再写高8位 out2输出方波 最后 将8255的PB0和PB1回复位00 用AND AL 11111100B来修改 CALL OPENCALL CLOSE8254 4 BCTD子程序的流程图 该子程序程序功能主要是实现二进制转化成相应BCD码 AX输入参数 AX输出参数 存放调整过的BCD码 MOV DX AX MOV AX 0 MOV CX 16 XCHG AL AH ADC AL AL DAA XCHG AL AH clc C rcl dx 1 adc al al daa CALL BCTD LOOP BCTD1 二 变量名声明 DATA SEGMENT MESS1 DB ASM ASSIGNMENT 0AH 0DH DB 0AH 0DH DB ELECTRONIC CLOCK 0AH 0DH DB 0AH 0DH DB 0AH 0DH DB PRESS C OR C TO EDIT THE ALARM TIME PRESS M OR M TO CHANGE SOUND 0AH 0DH DB 0AH 0DH DB PRESS ESC BUTTON TO EXIT 0AH 0DH TN DB PLEASE INPUT THE NEW TIME HH MM SS 0DH 0AH MUSICMESS DB PLEASE CHOOSE THE TYPE OF MUSIC 1 FAST 2 MIDDLE 3 SLOW 0DH 0AH MESS2 DB TIME IS 0AH 0DH T BUFF DB 40 在数据段开一段时间显示缓冲区 DB DB 40 DUP TEMPHOR DB 存放键入的定时时间的小时 TEMPMIN DB 存放键入的定时时间的分钟 TEMPSEC DB 存放键入的定时时间的秒数 MUSIC DW 800 存放默认音乐的频率数 DATA ENDS STACK SEGMENT DB 100 DUP STACK ENDS 四 详细设计四 详细设计 课题任务实现的源程序 可以是一组源程序 每个功能模块采用不同的函 数实现 源程序要按照写程序的规则来编写 要结构清晰 重点函数的重点变 量 重点功能部分要加上清晰的程序注释 一 1 主函数代码 CODE SEGMENT ASSUME CS CODE SS STACK DS DATA 确定各个逻辑段的类型 START MOV AX DATA MOV DS AX CALL CLEAR 调用清屏子程序 DISPLAY 时间显示部分 MOV AX DATA MOV DS AX MOV BX OFFSET T BUFF 送T BUFF的偏移地址到BX MOV AH 2CH 调用DOS时间调用功能 功能号 2CH 小时 分钟 秒数分别保存在CH CL DH中 INT 21H 判断时间是否相等 SUB DH 1 秒钟 1修正 CALL CHECK MOV AL CH 小时数设定 MOV AH 0 CALL BCTD 调用进制转换子程序 二进制转BCD码子程序 PUSH AX AND AL 0F0H 选取AL高四位 MOV CL 4 设置右循环的次数 ROL AL CL 右循环 OR AL 30H 加30H得到ACSII码 MOV BX AL 将得到的结果送到T BUFF缓冲区 INC BX BX自加1 指针指向下一个缓冲区的下一个地址 POP AX AND AL 0FH 选取低四位 OR AL 30H MOV BX AL 将转换后的低四位值送入缓冲区的第二个地址 INC BX MOV AL 显示分隔符号 MOV BX AL INC BX MOV AH 2CH INT 21H MOV AL CL 分钟数设定 MOV AH 0 CALL BCTD PUSH AX AND AL 0F0H MOV CL 4 ROL AL CL OR AL 30H MOV BX AL INC BX POP AX AND AL 0FH OR AL 30H MOV BX AL INC BX MOV AL 显示分隔符号 MOV BX AL INC BX MOV AH 2CH 秒设定 INT 21H MOV AL DH MOV AH 0 CALL BCTD PUSH AX AND AL 0F0H MOV CL 4 ROL AL CL OR AL 30H MOV BX AL INC BX POP AX AND AL 0FH OR AL 30H MOV BX AL INC BX MOV AL 将字符串的结束位送至显示缓冲区的最后一位 MOV BX AL PUSH BX 置光标位置 AH 2 BH 0 DH跟DL分别为行号与列号 并入栈保护BX MOV AH 2 0 1用于此程序快下边的 在下面的两个置光标位置 MOV BH 0 MOV DH 17 MOV DL 41 INT 10H POP BX LEA DX T BUFF 送T BUFF偏移地址到DX 并调用DOS显示功能 功能号为9 MOV AH 9 INT 21H 至此当前事前时间的显示功能结束 PUSH BX 置光标位置 MOV AH 2 MOV BH 0 MOV DH 0 MOV DL 0 INT 10H POP BX LEA DX MESS1 MOV AH 9 INT 21H 显示MESS1 PUSH BX 置光标位置 MOV AH 2 MOV BH 0 MOV DH 17 MOV DL 21 INT 10H POP BX LEA DX MESS2 MOV AH 9 INT 21H 显示MESS2 CALL DELAY1 MOV AH 1 调用键盘I O中断功能号1 获取键值到AL INT 16H CMP AL C 是C键 转到时间修改程序 JE EDITTIME CMP AL C 是C键 转到时间修改程序 JE EDITTIME CMP AL M 是M键 转到闹铃种类设定程序 JE EDITMUSIC CMP AL M 是M键 转到闹铃种类设定程序 JE EDITMUSIC CMP AL 1BH JZ QUIT 是ESC键 退出程序 JMP DISPLAY QUIT MOV AH 4CH 程序终止功能号 INT 21H RET 2 功能函数代码 1 二进制转 BCD 码子程序 BCTD PROC NEAR 二进制转BCD码子程序 AX输入参数 AX输出参数 存放调整过的BCD码 MOV DX AX MOV AX 0 MOV CX 16 设循环次数 BCTD1 CLC 清进位标志C RCL DX 1 通过进位的循环右移 ADC AL AL 带进位加法 DAA 加法的十进制调整 XCHG AL AH 交换高 低八位 ADC AL AL DAA XCHG AL AH LOOP BCTD1 循环次数保存在CX里 RET BCTD ENDP 2 清屏CLEAR子程序 CLEAR PROC NEAR PUSH AX 入栈保护现场 PUSH BX PUSH CX PUSH DX MOV AX 0600H AH 06 滚动 AL 00 全屏空白 MOV BH 3EH 设置背景颜色 2 和前景颜色 E SUB CX CX MOV DX 5F5FH INT 10H POP DX 出栈恢复现场 POP CX POP BX POP AX RET CLEAR ENDP 3 精确延迟时间子程序 delay1 DELAY1 PROC 精确延迟时间子程序 MOV DX 04FFH 循环次数 UP XOR CX CX A NOP LOOP A DEC DX JNZ UP RET DELAY1 ENDP 4 设定定时时钟 EDITTIME 子程序 EDITTIME PROC 时间修改子程序 PUSH AX 入栈保护数据 PUSH BX PUSH CX PUSH DX PUSHF MOV DX OFFSET TN 显示修改时间的格式提示 MOV AH 09H INT 21H MOV DX OFFSET T BUFF 数据缓冲区的数据输入 MOV AH 0AH INT 21H AND DX 0H LEA BX T BUFF INC BX INC BX INC BX MOV DH BX SUB DH 30H INC BX MOV DL BX SUB DL 30H MOV CL 10 MOV AL DH MUL CL ADD AL DL MOV CH AL MOV TEMPHOR AL INC BX INC BX MOV DH BX SUB DH 30H INC BX MOV DL BX SUB DL 30H MOV CL 10 MOV AL DH MUL CL ADD AL DL MOV CL AL MOV TEMPMIN AL INC BX INC BX MOV DH BX SUB DH 30H INC BX MOV DL BX SUB DL 30H MOV CL 10 MOV AL DH MUL CL ADD AL DL MOV DH AL MOV TEMPSEC AL POPF 出栈恢复数据 POP DX POP CX POP BX POP AX JMP START RET EDITTIME ENDP 5 检验定时时间是否到CHECK子程序 CHECK PROC PUSH AX PUSH BX CMP CH TEMPHOR 设置定点报时 JNE CF CMP CL TEMPMIN JNE CF CMP DH TEMPSEC JNE XIANG CF1 CMP CL 0 设置整点报时 JNE CF CMP DH 0 JNE CF XIANG CALL OPEN 打开扬声器 PUSH DX PUSH CX MOV DX 12H MOV AX 34DEH MOV CX MUSIC DIV CX OUT 42H AL MOV AL AH OUT 42H AL MOV AH 1 INT 21H POP CX POP DX CALL CLOSE 关闭扬声器 CF POP BX POP AX RET CHECK ENDP 6 开启和关闭扬声器子程序open和close OPEN PROC PUSH AX IN AL 61H OR AL 03H OUT 61H AL POP AX RET OPEN ENDP CLOSE PROC PUSH AX IN AL 61H AND AL 0FCH OUT 61H AL POP AX RET CLOSE ENDP 6 设置闹钟音乐种类子程序editmusic EDITMUSIC PROC PUSH AX 入栈保护数据 PUSH BX PUSH CX PUSH DX PUSHF MOV DX OFFSET MUSICMESS 显示修改音乐的种类提示 MOV AH 09H INT 21H MOV DX OFFSET T BUFF 数据缓冲区的数据输入 MOV AH 0AH INT 21H AND DX 0H LEA BX T BUFF INC BX INC BX INC BX MOV AL BX CMP AL 1 JE M800TO CMP AL 2 JE M1600TO CMP AL 3 JE M3200TO M800TO MOV MUSIC 800 JMP T M1600TO MOV MUSIC 1600 JMP T M3200TO MOV MUSIC 3200 T POPF 出栈恢复数据 POP DX POP CX POP BX POP AX JMP START RET EDITMUSIC ENDP 五 测试数据及其结果分析五 测试数据及其结果分析 1 运行画面 2 测试结果 A 键入 c 或 C 会出现提示 PLEASE INPUT THE NEW TIME HH MM SS 再输入 19 08 40 回车结束后 在 19 08 40 时 闹钟会鸣叫 B 键入 m 或 M 会出现提示 PLEASE CHOOSE THE TYPE OF MUSIC 1 FAST 2 MIDDLE 3 SLOW 回车后会设定此时的闹铃鸣叫的频率 六 调试过程中的问题六 调试过程中的问题 本次程序设计中遇到了很多的问题 在设计每一个模块都有遇到了一定的 难度 首先关于 如何获得系统当前的时间 查阅了 INT 21H 21H 的 2CH 可 以返回的的 CH CL DH 中分别为时 分 秒但是都是二进制的 故需要的 进行二进制的码制 写代码时发现通过寄存器移位的可以十分的节省寄存 器的使用数目 其次在写 EDITTIME 的子程序是发生了一个错误 很久才改正 我在使 用 21H 的 0AH 向 T BUFFER 内存空间输入字符串是 第一个位置是初始化时 设定的 T BUFFER 的最大长度 第二个位置是实际输入的长度 我于是 INC BX 两次 BX 发的 T BUFFER 的地址 以为能够得到我的输入的第一个字符 但是结果是错误的 查了了很久才发现 其实我在调用该子程序前的一个 控制已经输入了一个字符 该字符已经存入了 T BUFFER 故此处应该在 INC BX 在 EDITMUSIC 的子程序中同样会遇到类似问题 在编写程序中由于经常的要使用寄存器 有时没有将其压

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论