已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机硬件技术基础课程设计 计程车计价器设计 用计算机系统的输入输出设备完成 姓 名 刘亚刘亚 学 号 2008534520085345 姓 名 周桂锋周桂锋 学 号 2008534620085346 姓 名 袁云军袁云军 学 号 2008534720085347 姓 名 郭洋成郭洋成 学 号 2008534920085349 重庆大学自动化学院 二 O 一一年九月 目录目录 引言引言 1 1 1 设计的重要内容和方案设计的重要内容和方案 1 1 11 1 设计的主要内容设计的主要内容 1 1 21 2 设计方案设计方案 1 2 2 任务分工任务分工 1 3 3 实验中运用的一些实验原理实验中运用的一些实验原理 2 2 12 1 键盘按键中断键盘按键中断 2 2 22 2 取系统时间取系统时间 2 2 32 3 扬声器驱动系统原理扬声器驱动系统原理 2 3 3 操作说明操作说明 2 4 4 主程序及子模块流程图主程序及子模块流程图 3 5 5 每个人的心得体会每个人的心得体会 11 6 6 参考文献参考文献 15 7 7 附录附录 16 1 引言引言 现今 不管是在那些大城市 还是小县城 出租车早已经成为了一种重要的交通工具 不但解决了公交车较慢的烦恼 也解决了自己开车没停车位的弊端 总之 出租车早已融 入了这个城市的生活 既然如此 我们不得不考虑下出租车收费的问题 拥有良好性能的计价器无论是对广 大出租车司机朋友还是乘客来说都是很必要的 所以我们下面就用汇编语言来设计出租车 计价系统 1 1 设计的重要内容和方案设计的重要内容和方案 1 11 1 设计的主要内容设计的主要内容 设计一个计程车计价器 能用计算机系统的输入输出设备完成计程车计价器的基本功 能 并在此基础上自行完善和优化系统功能 基本功能具体要求如下 1 以计算机系统的输入输出设备为基础 一键盘作为输入设备 显示器作为输出 设备 完成设计 允许使用 PC 机的扬声器作为发生设备 2 按键启动计程车和停车 可以在行进过程中按键调整车速 3 按键开始计价和停止计价 开始计价后 3 公里内几家结果为起步价 3 公里后 根据车速和行进时间计算所行距离 所行距离每达到 1 公里时 计价结果增加 1 次单价 要求精确到角 若在计价过程中停车 则每隔一段时间 具体时间 间隔自行设置 计价结果增加 1 次单价 晚上 10 点到次日早上 7 点 按晚间 起步价和晚间每公里单价计算 4 屏幕上要求显示当前车速 当前计价结果 本次计价时间 停止计价后 本次 计价结果保持一段时间后清为 0 5 显示当前燃料量 车辆行进过程中反映燃料的消耗 当燃料量低于警戒值时报 警 1 21 2 设计方案设计方案 我们经过组内激烈的讨论 将基本功能分为了几个小模块 如下 1 速度 时间差 油量模块 计算里程计价模块 2 等待计价模块 总油量 每公里耗油模块 3 显示车速 计价结果 时间模块 4 设置起步价 单价 并判断是否白天晚上 并将输入的元 转化为角模块 我们小组四人分别将这四个子模块分别编辑 然后共同构想了主程序模块 以上各个 模块的思路请看流程图 2 2 任务分工任务分工 袁云军 设置起步价 单价 并判断是否白天晚上模块 输入的起步价和单价的单位 元 化为角模块 并共同完成论文 周桂锋 编写取第一次系统时间程序 取系统时间通用程序 计算相邻时间差子程序 计算总里程及总价格子程序 共同完成论文 刘 亚 编写子程序每次计程车运行的总时间的提取 换算称实际的时分秒格式并显 2 示 每次运行的总价格的计算 及显示 声音模块的写入及调用 及有关论文的撰写 3 3 实验中运用的一些实验原理实验中运用的一些实验原理 2 12 1 键盘按键中断键盘按键中断 程序中用到的中断 引发 9 号中断 键盘的输入到达 60h 端口时 相关的芯片就会向 CPU 发出中断类型码为 9 的可屏蔽终端信息 CPU 检测到该中断信息后 如果 IF 1 则响 应中断 引发中断过程 转去执行 int 9 中断例程 编写 int 9 中断例程 键盘产生扫描码 扫描码送入 60h 端口 引发 9 号中断 CPU 执行 int 9 中断例程处理键盘输入 2 22 2 取系统时间取系统时间 取当前系统时间采用 int 21h 中断的 2ch 号功能 分别将当前时刻的时 分 秒和百 分之一秒存入对应的寄存器 ch cl dh dl 2 32 3 扬声器驱动系统原理扬声器驱动系统原理 在 PC 中 8254 的通道 2 与计算机的扬声器相连 由通道 2 工作于方式 3 产生一定频 率的方波信号去驱动扬声器按一定频率发声 其原理如图 1 所示 从图中可见 系统使用 并行 I O 接口 8255A 中 PB 端口的最低两位来控制该发声驱动系统 PB0 作为 8254 通道 2 的门控信号 GATE2 控制通道 2 定时计数启停 PB1 与通道 2 的 OUT2 信号相与后去控制扬 声 器的接通和断开 PC 中 8255A 的端口地址为 60H 63H 8254 的端口地址为 40H 43H 可见 要使扬声器发声 PB0 置 1 通道 2 才能工作 PB1 置 1 OUT2 上产生的一定 频率的方波信号才能通过与门送到驱动器 从而使扬声器发声 图 1 扬声器驱动电路原理图 3 3 操作说明操作说明 在程序开始运行后 系统的初始状态是出租车停止 具体操作方式如下 1 按任意 s 键启动系统 2 设置白天的起步价和单价 3 设置晚上的起步价和单价 3 4 按键选择白天或晚上 5 按加速键 调速启动出租车 即速度由 0 变为正 计价器开始里程计价 6 在计价过程中通过 键实现车速的调节 7 按减速键 使车速重新回到 0 进入等待计价 8 等待计价时 如果按加速键 使速度变为正 则重新进入里程计价 9 等待计价时 按 q 键 出租车停车 停止计价 4 4 主程序及子模块流程图主程序及子模块流程图 主程序流程图主程序流程图 4 开始 显示启动车提示语 是否有启动 键 s 按下 显示设置提示语分别设置 白天 晚上的起步价和单价 装入自编键盘中断程序的 中断矢量 打开键盘中断 1 记录光标的初始位置 2 显示初始化 检测速度是否为0 车启动 取开始时间 主程序中qushi标志行 1 置显示光标位置 清 楚停车提示语 返回光 标到初始位置 2 取当前时刻系统时间 延时 取当前时刻系统时间 计算相邻两次取时的时间差 调用折算车速jichesu 调用计算里程计价price 调用计算当前油量youhao 调用显示子程序show zcx 实时显示各项数据 速度是否为0 延时 主程序中tuichu标行 显示本次计价结果 显示一段时 清零 即显示初始化 返回 等待计价时当车 速由0变为正时 调用等待计价 子程序ddjj 等待计价时按 q 键 当前油量等于0 时 跳转到主程序 tuichu标志行 N Y Y N Y N 5 按键中断服务程序按键中断服务程序 09号键盘中断入口 读取按键扫描码 是否按下 键 是否按下 键 速度是否 大于240km h 速度增加6km h 速度是否 小于等于0 发中断结束命令 返回 速度减少6km h N Y Y N N Y N Y 计算当前油量子模块计算当前油量子模块 开始 取总油量 每公里耗油量 和总里程公里数 计算当前油量 即 总油量减耗油量 当前油量 是否大于0 当前油量是否 小于等于油量警戒值 是否是第一次小于 等于油量警戒值 播放报警声音返回 跳转到主程序tuichu 标志位 强制停车 N Y N Y N Y 6 等待计价子模块等待计价子模块 开始 1 置光标 2 显示停车停止计价提示语 3 置光标回初始位置 是否有 q 键按下 Y 跳到主程序中的 tuichi标志行 退出 前显示命令 车速是否为0 跳到主程序中qushi标志 行 取当前系统时间 进入里程计价计算 适当延时 取第一次系 统时间 取第二次系 统时间 计算两次取时的时间 差 并记录等待总时间 等待总时间是够变化了 规定的时间间隔 1 总价跳价一次 2 调用显示子程 序更新显示内容 N Y N Y N 7 输入白天和晚上的起步价和单价模块输入白天和晚上的起步价和单价模块 开始 提示输入白天起步价 输入白天起步价 调用 erjzzh 模块 将转化的值存入内存 pricing1 提示输入白天单价 输入白天单价 调用 erjzzh 模块 将转化的值存入 ppm1 提示输入晚上的起步价 输入晚上的起步价 调用 erjzzh 模块 将转化的值存入 pricing2 提示输入晚上单价 调用 erjzzh 模块 将转化的值存入 ppm2 判断是有键按 下 判断按下的 键是否是 d 判断按下的 键是否是 n 将 pricing1 和 ppm1 的值分别存 入 pricing 和 ppm 将 pricing2 和 ppm2 的值分别存 入 pricing 和 ppm 结束 N N Y N N Y 8 元转化成角模块元转化成角模块 N Y Y 开始 送输入字符串的第一 位给 al 转换成十进制数 再乘 以 10 送给寄存器 bl 再送字符串的第二位给寄 存器 al 判断是否的 小数点 再送字符串的第三位给寄存器 al 转换成十进制数 再乘以 10 与 寄存器 bl 相加 最终结果存于 bl 结束 9 计算时间差子程序流程图计算时间差子程序流程图 Y N Y N Y N 开始 是否与系统初 始时间比较 算法赋值 2 算法赋值 1 计算小时数之差 差值是否相等 小时差化为分 加上最近一次时间的分钟数 分钟之差化为秒 存入内存 计算百分之一秒之差 是否借位 借位更新 秒数 计算百分之一秒之差 然后计算 秒数之差 化为 1 100s 单位 10 里程计价子程序流程图里程计价子程序流程图 N Y Y N N Y 将求得的时间之差存入表 示 1 100s 的内存空间 即 为时间差 结束 开始 取当前车速和时间差 计算总里程累加入内存 是否需要设起 步价 设 起 步 价 里程是否大于标志 位 miletest1 内存 gongli 加一 标志位 miletest1 加 1000 里程是否大于 miletest 总价累加每公里单价 miletest 加 1000 结束 11 5 5 每个人的心得体会每个人的心得体会 小组成员 刘亚小组成员 刘亚 1 课程设计的目的 本次设计的题目分为两大类 5 个题目 只是一种是涉及硬件的题目 一种是纯软件 写出的题目 我们小组有 4 个同学 分别是郭洋成 袁云军 周桂峰 我一起商量以后选 择了 计程车计价器设计 用计算机系统的输入输出设备完成 这个题目 选取这个题目大家有这样几点考虑 第一 怎样设计总体方案 思路清晰 第二 分成几个子模块且每个模块怎么融合 连接简单 第三 总程序的调试及功能的实现 显示清晰 2 课程设计的任务 拿到题目后 4 个同学集思广益 都纷纷开动脑筋 思想的火花一下子全都迸发出来 了 最后经过综合后 留下了大家觉得比较合适的 好的 容易实现的思想后 完成了总 体方案的设计和定稿 我们的任务是实现计价器的一些基本功能 设置不同时段 白天 黑夜 的起步价 单价 用按键的方式实现计程车的起动和停止以及行进过程中调整车速 用按键实现起动 车时计价 停车时结束计价 3 公里内记为起步价 超过 3 公里距离每超过 1 公里计价一 次 要求精确到角 若在计价过程中有停车等待 超过某一个时间设定值单价增加 1 次 整个过程分时段计价 晚上 10 点到次日早上 7 点 设计的显示效果分为两部分 一是实时的车速 计价结果 油量 油量低于某个设定 值报警提示 二是本次总里程 计价总时间 总价格 且在停止计价后一段时间所有计数 清零 3 课程设计的内容 在明确设计任务后 大家按照设计要求明确地分了工 我的部分是显示计价总时间 总价格 并在其他同学需要的时候做一些辅助工作 我的设计程序段比较简单 因此比较容易实现 基本思想是 取出起动计程车时的时 间后停止计程车时的时间 然后按照时间显示的格式 时 分 秒 分段计算时差 加到 后一时间的分作差 计算出分差 再加到秒上作差 最后计算出总秒数 再分别按时 分 秒 除以 3600 60 得出时分秒的具体值 注意的是时分秒的数学格式为 0 00 00 而 汇编语言是基础语言 只能是一位一位的显示 并且只有 1 9 才有 ASC 码 所以在计算 分和秒的时候有可能除出来的数是大于 9 的数 这时需要将分数在除以 10 并将商数加上 30h 输出 ASC 码放到第一个分位 余数加上 30h 输出 ASC 码放到第二位 类似秒位也如 此 具体的程序段 见程序附录 4 课程设计的总结 这次设计基本上实现了任务书上的要求 可以设置不同时段的起步价 单价 按键可 以起停车并变速 满足在相应的公里数下计价加价 如是停车等待也可以按设定值来加价 可以在行进途中实现实时显示价钱 油量 车速 本次设计总共历时 9 天 含中秋放假 我的程序差不多总时间累计起来有 3 天左右 总结起来 自己的汇编语言基本上没怎么学懂 同学们在讨论的一些东西基本上算不知道 叹息自己的学习能力了 很多东西没学过干 对自己说声 仍需努力 加油吧 不过值 得高兴的是 和同学们相处的这一周多时间里面还是了解了很多东西 像我的程序段的显 12 示 原来我是每个字位用一个 mov ah 09h int 21h 而郭洋成同学的指导仅用了一个 定义数据段中的格式 0 00 00 然后地址每加 1 位 很简洁的就解决了 详 细的程序见程序附录 并且也体会到了团队工作的相互配合 相互协作重要性 明确自己 什么时候去配合他人 也要知道什么时候让他人帮助自己 有时候单靠自己是费力不讨好 的事 凝聚产生力量 所以集体的力量是无穷的的 期待 下一次的团队合作 非常感谢有这样一个机会让我获益匪浅 小组成员 周桂锋小组成员 周桂锋 子程序功能描述 我需要编写的子程序有里程计价子程序 取系统时间子程序 取系统第一次时间子程 序 计算时间差子程序 其中取系统第一次时间子程序和取系统时间子程序有较多的相同之处 之所以不合并在一 起 一方面是主程序框架的需要 另一方面也是为了子程序更见简洁 不容易出向错误 里程计价子程序和计算时间差子程序较前面的程序要复杂一些 程序引入了其需要的算法 这就要求程序调用其它子程序中的变量帮助计算 在这种情况下 几个组员之间的协调工 作就显得尤为重要 编写程序之前各种变量和主程序思想的统一能够为后面的程序调试工 作带来极大的方便 使得各个子程序的兼容性满足要求 子程序功能的编程思想和实现 前两个关于系统时间的的程序需要调用 dos 的 2c 号功能 这里需要及时的将存有系统 时间数据的寄存器中的数据转存至内存变量中一遍调用 在存储过程中时分和秒 百分之 一秒的位置不要搞混 否则时间差子程序将无法调用到正确的系统时间 总之 这两个程 序只需要明确内存空间所存时间的具体意义即可 编写计算时间差子程序需要用到前面的取值结果 所以在保证前面程序调试正确后我 才开始编写此程序 以保证思路清晰 此段程序需要计算两次系统时间的差值 为后面计 算里程和计价提供参数 主要思想其实很直接 就是一次比较时 分 秒和百分之一秒的 大小 求得差值 值得注意的是 时间相减过程中设计借位问题 需要做相应调整 里程计价子程序涉及两个量的计算 即里程和总价 这两个量都是要直接显示在最终 的用户界面上的 所以要为后面的屏幕显示程序提供供调用的内存空间 同样要注意数据 兼容性的问题 程序编写中遇到的困难以及解决方法 程序编写中问题大大小小的不少 但是我遇到的最大问题是在时间差程序中遇到的 由于开始没有意识到单步调试的重要性 程序的问题很难找出来 程序中内存 second 中的 值在每一次计算中开始都应该赋值给零 但是由于程序编写原因 开始编写的程序中 second 一直是做的累加计算 再加上一个逻辑跳转的错误 使得程序异常混乱 在使用单 步调试之前 我浏览量程序很多遍 由于程序是按照自己思路编写的 即使是错误的逻辑 在自己看来都是正确的 所以一直无法找到错误 后来才想到应该使用单步调试 虽然其 他组员也在使用单步调试 但是我自己却没有这个意识 这也算是一个教训吧 在使用单 步调试后 错误则变得一目了然 因为内存量的变化在 TD 界面下是很容易查询到的 这 个问题找到后 主程序的调试也就稍显轻松一点了 毕竟各个子程序能保证不出错 只需 理清楚主程序逻辑就可以了 13 程序编写感想 以前上实验课编写的程序都较小 子程序的调用也相对单一 而这次则不同 此次课 程设计相当于一个简单软件系统的开发 我们需要根据客户的需求 即课程设计要求 完 成相应功能 并交付使用 通过这次事件 整个软件的设计和编写流程是有据可寻的 在 设计软件之前我们先了解了其要实现的所有功能 然后我们搭建实现功能的主程序框架 分出程序模块 并明确其功能 紧接着我们为每个组员分配模块编写任务 落实下来就是 编写子程序 并且在此之前我们为系统的变量兼容性做了充足的准备 避免了不必要的麻 烦 每个组员保证自己的子程序编写正确 调试通过 最后我们将子程序嵌入主程序框架 主程序搭建完毕后进行联调 排除错误 最终完成软件编写 整个编写过程中 团队合作 精神尽显无余 只有各组员通力合作 软件的编写过程才能如此高效和顺利 小组成员 袁云军小组成员 袁云军 因为老师要求我们在这次课程设计中要分工合作 所以我们小组经过讨论后将这个问 题分为了以下四个模块 1 速度 时间差 油量模块 计算里程计价模块 2 等待计价模块 总油量 每公里耗油模块 3 显示车速 计价结果 时间模块 4 设置起步价 单价 并判断是否白天晚上 并将输入的元 转化为角模块 大概有自知自明吧 我选择了最简单的第四个模块 下面说说我在编辑的过程中遇到 的问题吧 最开始拿到任务时 真的是无从下手 毕竟硬件语言都学过一年了 之后也没 怎么去复习它 所以遇到的问题如下 1 怎么输入提示语和换行问题 也就是在 dos 里该怎么显示出来输入的白天夜晚的起 步价和单价 2 也就是怎样将输入单位为元的价格转化为角存入自己定义的内存 以上两个问题里遇到的小问题将在下面的解决方案中提到 首先看了硬件书 知道第一个问题还是很简单的 因为在做硬件实验时 我们要经常 用到 不过开始的时候我还是没有考虑全题目给我的要求 在输入白天和晚上起步价和单 价的时候 只在判断后输入白天或者晚上的起步价和单价 但是题目要求我们要把白天和 晚上的起步价和单价都显示在 dos 里 所以经过小小的变化就在内存空间多定义四个变量 就解决了 第二个问题就需要有自己的逻辑了 开始的时候总是还没习惯用自己的思维去写程序 总想在书上能找到类似的程序段 结果还真找到了 就因为这个程序段 害我编了一天 结果到后面还一句没有用上 我定义了一个数组去先存输入的价格字符串 然后一位一位 的转换 因为我把单价和起步价规定在 0 1 9 9 之间二最开始的时候总是转换的值要比需要 的值大 32 结果经过了仔细推敲 都是这句 and al 0fh 害的 本来我们取的是第一位的 ASCII 码 结果就因为那句与 让我的第一位变小了 后面减去 30 就变成了负值 所以出 了问题 后来 检查自己编的程序只能输入固定模式 0 1 9 9 当遇到输入 1 9 的整数时就 不能转换正确了 然后我再运用了一句判断小数点那位跳转 结果顺利的实现了整数的转 换 其实后面在大家整合到一个程序里时 还是遇到很多寄存器和定义变量的长度不同 不过经过简单的调试 很快就能调通了 自己的感想 经过这次设计 我学到了很多 理解了团队合作的重要性和依赖性 虽然途 中遇到过很多问题 而且还就几个问题争得面红耳赤 但是解决问题后的的那份开心是没 14 法磨灭的 还有我们的每个子程序都用单独的子程序调通后才整合的 这样仅仅是为了整 个程序调试的方便 总之 我们这次设计的完成得还是比较顺利和开心的 小组成员 郭洋成小组成员 郭洋成 这次计算机硬件课程设计我们组选择了计程车计价器的设计 用计算机系统的输入输 出设备完成 这个题目进行课程设计 我们拿到题目后便开始进行总体思路和设计方案的 讨论 一开始我们只是简单的理了下整个过程的思路以及程序的大致流程 感觉这个题目 还是挺好做的 没有特别困难的地方 大体实施的思路很快就出来 但随着整个工作的深 入 细节问题一个个的突出显出来 比如说整个流程在中间过程的思路和跳转出现了一些 问题 计算里程时的数据处理问题 程序运行过程中按键调速的问题 光标显示位置的控 制 等待计价模块的编写问题等等 但这些问题经过我们组四个人的讨论和查阅相关资料 全部都得以解决 最终我们克服困难 编写好完整的程序 实现了题目要求的各种功能 本次课程设计我负责调节车速子模块 计算当前油量子模块 等待计价子模块等模块 的编写 1 调节车速子模块的设计 由于车速度的调节需要在程序运行过程中的任意时刻通过 加减速键 来调节 所以只能选择按键中断来实现此功能 如果采用按键查 询来实现的话 加减速键会变得不灵敏 PC 键盘按键引发 int 09h 中断 键盘的输入达到 60h 端口时 相关的芯片就会向 CPU 发出中断类型码为 9 的可屏蔽中断信息 CPU 检测到该 中断信息后 如果 IF 1 则响应中断 引发中断过程 转去执行 int 9 中断服务程序 通 过中断向量的设置修改中断服务程序为调速中断服务程序 2 计算当前油量模块的设计 此模块通过我的简化后程序较为简单 我主要简化了计 算油量的相关数据处理 采用计程车每走一公里油量变化一次的思路来编写程序 而没有 采用实时更新油量的计算方法 因此大大简化此模块的长度 当油量第一次小于油量警戒 值时播放报警声音 油量继续减小时不在报警 当油量为 0 时 强制停车 显示本次计价 结果一段时 清零并返回 DOS 3 等待计价模块的设计 当速度为 0 时 程序进入等待计价子模块 进入时去一次系 统时间作为等待计价的开始时间 并显示提示语言 中间通过按键中断可以加速跳出等待 计价模块到计算里程计价模块 或者按停止键 q 停止计价 显示一段时间清零并返回 DOS 速度为 0 期间 不断循环取当前系统时间与开始时间作差 比较并判断是否调价 调 价时间间隔自行设定 所有子模块编写完成后 我们组四个人开始综合子模块到主程序中 并进行调试 调 试过程遇到了多个问题 当速度为 0 时跳入等待计价模块后 如果采用按键查询 q 退出 不起作用 最后改 成按键中断就能很好的跳出来 分析原因可能是加减速键是采用的按键中断 整个过程中 断都处于打开的状态 若采用按键查询的 int 16 功能会被屏蔽 在等待计价期间第一次按加速键 会很不灵敏 有时按多次都没反应 抱着尝试的 心态在取当前时间并计算等待时长后面加一个延时语句 再跳转回去做下一次取时计算等 待时间 最后竟然很好的解决了按键不灵敏的问题 从中可分析出原因是取系统时间的中 断会影响按键中断 还有在开始运行程序的时候计价总价和油量变化相当快 不符合我们的设计要求和理 论结果 最后在计算里程计价模块中发现了一小点逻辑错误 修改后程序正确无误的运行 了起来 本次为期两周的课程设计就像一个小项目一样 小组成员需要分工合作编写各自的子 15 模块 并综合起来调试 很好的体现了我们的团队合作能力 既提高了我与组员之间的协 调沟通能力和团队合作意识 也很好的锻炼了我的编程能力和逻辑思维能力 不管以后是 为继续深造还是工作 都打下了坚实的基础 6 6 参考文献参考文献 1 杨天怡主编 计算机硬件基础 A 重庆大学出版社 2 黄勤主编 计算机硬件技术基础实验教程 重庆大学出版社 3 王爽主编 汇编语言 第二版 清华大学出版社 4 汇编语言指令大全 详解版 16 7 7 附录附录 486 data segment disp start db please press the s key to start the taxi 0ah 0dh 开 停车提示语 xwtz0 db 0ah 0dh xwtz db pleas press on the key q to stop the car 0ah 0dh pricing db 定义两个内存空间 存入需要用的起步价和单价 ppm db pricing1 db 定义两个内存空间 临时存入白天的起步价和单价 ppm1 db pricing2 db 定义两个内存空间 临时存入晚上的起步价和单价 ppm2 db keybuf db 10 定义一个存字符串的数组 count db keynum db 10 dup mess0 db please set the prices 0 0 9 9 yuan 0ah 0dh mes1 db the start price of day mes2 db 0ah 0dh the pice per kilometer of day mes3 db 0ah 0dh the the start price of night mes4 db 0ah 0dh he pice per kilometer of night mes5 db 0ah 0dh press d or n to judge the day or night 0ah 0dh tt db totaltime 0ah 0dh 实时显示字符串缓冲区 tt1 db wait time 0ah 0dh tp db totalprice 0ah 0dh ttd db 0 00 00 0ah 0dh ttd1 db 0 00 00 0ah 0dh tpd db 000 0 yuan 0ah 0dh disp1 db speed 000 km h 0dh 0ah disp2 db current oil 000 L 0ah 0dh disp3 db total distance 000 km 0ah 0dh ttd0 db 0 00 00 0ah 0dh 初始化显示字符串 清零 ttd10 db 0 00 00 0ah 0dh tpd0 db 000 0 yuan 0ah 0dh disp10 db speed 000 km h 0dh 0ah disp20 db current oil 000 L 0ah 0dh disp30 db total distance 000 km 0ah 0dh 17 minite db second db msecond dw daytime db mile dd 0 p dw 0 计价的总价格 miletest dd 3000 miletest1 dd 1000 priceflag db 0 timea dw 开始计价时刻的时和分 timeb dw 停止计价时刻的秒 timec dw 停止计价时刻的时和分 timed db 停止计价时刻的秒 time1 dw time2 dw time3 dw time4 dw t1 dw t2 dw t3 dw t4 dw flagtime db 0 为 0 表示与初始时间做时间差 chesu db time lag dw 10 设置等待计价的时间间隔 totallag dw 10 定义总时间间隔标志位 等待计价 time5 1 dw 时 time5 2 dw 分 time6 1 dw 时 time6 2 dw 分 time flag db 0 time wait dw 0 msecond1 dw 0 msecond0 dw 0 wait1 dw 100 freq dw 261 设置警报声的频率和时间长度 slong dw 01ffh speed db 00h 出租车车速 0 255km chesu db 00h 折算速度 一小时按以分钟计算 模拟运行 18 keep es dw keep bx dw disp dw oil total dw 100 设置本次运行的总油量 oil current dw 当前油量 oil pm db 1 每公里耗油量 oil warn dw 20 设置油量警戒值 oil flag db 0 油量报警标志位 gongli db 0 总里程整数公里数 hang db 光标显示初始行位置 lie db 光标显示初始列位置 data ends code segment main proc far assume cs code ds data start mov ax data mov ds ax lea dx disp start 启动车提示语 mov ah 09h int 21h jxx1 mov ah 01h 继续等待时间 检测按键和车速 int 16h jz jxx1 无键按下 跳转 jxx1 继续等待按键 mov ah 0 int 16h cmp al s 有开始键按下 跳转 jz kaishi jmp jxx1 无开始键按下 跳转 继续等待 kaishi lea dx mess0 设置起步价 单价提示语 mov ah 09h int 21h call srdq 设置白天 晚上的起步价和单价子程序 设置按键中断 并开中断 cli 清中断标志位 mov ah 35h 读取原中断向量 mov al 09h int 21h mov keep es es 19 mov keep bx bx push ds mov dx offset jsd 装入自编键盘中断程序的中断矢量 mov ax seg jsd mov ds ax mov ah 25h mov al 09h int 21h pop ds in al 21h 允许键盘中断 and al 0fdh out 21h al sti 开中断 mov bh 00h 记录须显示的初始光标的位置 mov ah 03h int 10h mov hang dh mov lie dl call xscsh 显示初始化 again cmp speed 0 检测速度是否为零 jz again call getsystime1 调用取开始时间子程序 jmp lllp1 qushi mov dh hang 等待计时结束后 即速度重新由零变为正 跳转到的 位置 mov dl lie add dh 9 mov bh 00h mov ah 02h int 10h 置光标位置 lea dx xwtz0 mov ah 09h int 21h 清楚屏幕停车提示语 mov dh hang 置光标回到初始位置 mov dl lie mov bh 00h mov ah 02h int 10h call systime 调用取当前时刻时间子程序 20 lllp1 mov ecx 00ffffffh 延时 可调时长 xh0 loopd xh0 lllp0 call systime 再次调用取当前时刻时间子程序 call duration 计算相邻两次调用时间的时间差 mov cl speed cmp cl 240 jbe lllp mov speed 240 lllp call jichesu 折算车速 call price 计算总里程和总价格 call youhao 计算当前油量 call show zcx 时间 总价 车速 油量 总里程显示子程序 cmp speed 0 判断速度是否为零 jz jjdd 速度为零跳转到等待计价模块 mov ecx 00ffffffh 延时 可调 xh1 loopd xh1 jmp lllp0 jjdd call ddjj 跳到等待计价子程序模块 tuichu call show zcx 显示子程序 mov ecx 0bfffffffh yanshi10 loopd yanshi10 显示一段时间 清零 call xscsh 显示初始化 清零 mov dh hang mov dl lie add dh 10 光标跳到新的一行显示结束 返回 dos mov bh 00h mov ah 02h int 10h mov ah 4ch 按任意键返回 Dos int 21h main endp 屏幕时间 总价 速度 油量和总里程显示子程序 show zcx proc near pusha call getsystime2 call totaltime call totalprice call ddjs call speed disp 21 call oil disp call distance disp mov dh hang mov dl lie mov bh 00h mov ah 02h int 10h popa ret show zcx endp 设置白天或者晚上起步价和单价子程序 通过键盘输入判断白天黑夜 分别设置不同的起步价和单价 srdq proc near pusha 分别输入白天晚上的起步价和单价 lea dx mes1 mov ah 09h int 21h lea dx keybuf mov ah 0ah int 21h call erjzzh mov pricing1 bl lea dx mes2 mov ah 09h int 21h lea dx keybuf mov ah 0ah int 21h call erjzzh mov ppm1 bl lea dx mes3 mov ah 09h int 21h lea dx keybuf mov ah 0ah int 21h call erjzzh mov pricing2 bl lea dx mes4 mov ah 09h int 21h 22 lea dx keybuf mov ah 0ah int 21h call erjzzh mov ppm2 bl lea dx mes5 mov ah 09h int 21h l mov ah 01h 检测是否有键按下 int 16h jz l mov ah 0 有 就读入这个键 分别和 d 和 n 的 ascii 比较 int 16h 读入是 d 就讲转换的白天值存入内存 反之则存入晚上的 内存 cmp al d jz day cmp al n jz night jmp l day mov dl pricing1 mov pricing dl mov dl ppm1 mov ppm dl jmp l1 night mov dl pricing2 mov pricing dl mov dl ppm2 mov ppm dl l1 popa ret srdq endp 将白天和晚上的单价和起步价分别转换为整数角 输入的单价和起步价在 0 1 9 9 之间 erjzzh proc near push ax push cx push di lp mov bl 0 mov di 0 mov al keynum di sub al 30h 转换输入的第一位 mov cl 10 23 mul cl mov bl al inc di mov al keynum di cmp al 2eh 判断是整数还是小数 是整数就直接跳出 是小数就继续运 算十分位 jnz llp0 inc di 跳过小数点 mov al keynum di sub al 30h add bl al 将得到的结果存入寄存器 bl llp0 pop di pop cx pop ax ret erjzzh endp 等待计价子程序 ddjj proc neat pusha mov dh hang 置光标位置 mov dl lie add dh 9 mov bh 00h mov ah 02h int 10h lea dx xwtz mov ah 09h int 21h 显示提示语 是否按键停止计价停车 q 键 mov dh hang 置光标初始位置 mov dl lie mov bh 00h mov ah 02h int 10h jxdd mov ah 2ch dos 2c 号功能调用 获取系统时间 ch cl dh 分别存放小时 分钟 秒 int 21h mov time5 1 cx 24 mov time5 2 dx in al 60h 开按键中断 int 21h 的 09h 号功能 读键的扫描码 push ax 不能使用 int 16h 的 01h 和 00h 号功能 in al 61h or al 80h out 61h al and al 7eh out 61h al pop ax cmp al 10h 10h 为 q 键的扫描码 jz tuichu 按下 q 键跳到退出程序段 jxx cmp speed 0 jnz qushi 车速不为 0 跳出 并开始计时 到计算里程计价 mov ecx 00ffffffh 延时 可调 xh111 loopd xh111 mov ah 2ch dos 2c 号功能调用 获取系统时间 ch cl dh 分别存放小时 分钟 秒 int 21h mov time6 1 cx mov time6 2 dx mov second 0 mov ax time5 1 mov t1 ax mov ax time5 2 mov t2 ax mov ax time6 1 mov t3 ax mov ax time6 2 mov t4 ax mov ax t3 mov bx t1 mov cl al sub ah bh 差 ah 中存小时之差 jz next10 若小时数相等 则无需处理 mov al ah al 存小时之差 mov ah 0 mov bh 60 mul bh 将小时之差化为分钟 add al cl mov minite al 小时化为分钟数加上最近一次的分钟数存于 minite 中 jmp then10 25 next10 mov ax t3 mov bx t1 sub al bl jmp then20 then10 mov bx t1 mov al minite sub al bl 差 al 中存分钟之差 then20 jz next20 mov dl 60 mov ah 0 mul dl mov second al 分钟之差化为秒 存于 second next20 mov ax t4 mov bx t2 ax 为最近一次秒和 1 秒 cmp al bl jb next30 若最近一次的 1 秒数小于上一次 不够减 sub al bl 1 秒数差存于 al 中 and cx 0 mov cl al mov msecond1 cx 够减情况下 1 秒之差存于 msecond jmp next40 next30 dec ah 借位 add al 100 sub al bl 1 秒数之差存于 al and cx 0 mov cl al mov msecond1 cx 不够减情况下 1 秒存于 msecond next40 mov dh second add ah dh sub ah bh 秒数之差 mov al ah 秒数差存于 al mov ah 0 mov bl 100 mul bl 此时由秒数求得的 1 秒存于 ax 中 add msecond1 ax 此时 msecond1 中存总的间隔时间 mov ax msecond1 add msecond0 ax mov ax wait1 26 cmp msecond0 ax jb jxdd add wait1 100 inc time wait mov cx totallag cmp time wait cx 比较间隔时间 每比较一次间隔时间变化一次 time lag jae tjyc 跳转到调价一次 tjyc call show zcx mov ecx 00ffffffh 延时 可调 xh11 loopd xh11 取系统时间 int 21h 中断要影响按键中断 jmp jxdd 所以这里加一个延时可以让键盘中断加减速键灵敏 尤 其是当速度为零是按加速键 tjyc mov ax time lag add totallag ax mov bl ppm mov bh 0 add p bx call show zcx jmp jxdd popa ret ddjj endp 调节车速中断服务程序 jsd proc near pusha in al 60h 读取按键的扫描码 push ax in al 61h or al 80h out 61h al and al 7eh out 61h al pop ax mov bl speed cmp al 0dh je jia 键按下 跳到加速度段 cmp al 0ch je jian 键按下 跳到减速度段 jmp exit 其它按键直接跳出 jia cmp bl 240 27 jae exit 大于等于 240 转移 add bl 06h 车速每加一次 6 公里 jmp exit jian cmp bl 00h jbe exit sub bl 06h 车速每次减 6 公里 jmp exit exit mov speed bl mov al 20h 发中断结束命令 out 20h al popa iret jsd endp 速度显示子程序 speed disp proc near pusha lea di disp1 add di 6 mov al speed mov ah 00h mov cl 100 div cl add al 30h inc di mov di al mov al ah mov ah 00h mov cl 10 div cl add al 30h inc di mov di al mov al ah add al 30h inc di mov di al lea dx disp1 mov ah 09h int 21h popa ret speed disp endp 28 总里程显示子程序 distance disp proc near pusha lea di disp3 add di 15 mov al gongli mov ah 00h mov cl 100 div cl add al 30h inc di mov di al mov al ah mov ah 00h mov cl 10 div cl add al 30h inc di mov di al mov al ah add al 30h inc di mov di al lea dx disp3 mov ah 09h int 21h popa ret distance disp endp 车速折算子程序 由于模拟运行 时间尺度按 1h 1min 折算 相当于模拟时间加快 模拟时间一分钟相当于 实际一小时 车速 chesu speed 1000 60 100 m 1 100 s 那么 chesu2 chesu3 6 jichesu proc near pusha mov al speed mov ah 0 mov cl 6 div cl mov chesu al 变量 chesu 为折算后的车速 29 popa ret jichesu endp 计算当前油量子程序 youhao proc near 简化计算 出租车每走一公里 减一次油量 p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西玉林市陆川中学2025-2026学年化学高一第一学期期中联考模拟试题含解析
- 科学实验活动对幼儿探究兴趣的影响
- 云计算技术在企业服务行业的应用探讨
- 防水涂料耐碱性试验记录
- 答辩评审表评语参考
- 博士论文评语大全(标准版)
- 2026届内蒙古自治区呼和浩特市土默特左旗部分校高三上学期11月阶段检测(期中)历史试题(含答案)
- 中石化胜利油田专业技术职务任职资格评审问题解答
- 学论文范文-浅析Buy amp;sell模式下品牌公司的供应链管理论文
- 我国火力发电企业成本管理模式论文
- 2025年安全员B证考试试题(必刷)附答案详解
- 转让煤气铺合同协议书
- 2025及未来5年宠物泪痕清洁剂项目投资价值分析报告
- 广东省广州市广雅中学2025-2026学年高一上学期期中考试化学试卷(无答案)
- 2026中国金融电子化集团有限公司下属子公司招聘考试笔试参考题库附答案解析
- 2024-2025学年湖南省A佳教育高二上学期11月期中地理试题(解析版)
- 2025年全国专利代理人考试《专利法》试题及答案
- 四季里的汗水与智慧课件
- 2025年青少年航天知识竞赛真题卷及答案
- 2025年大学《传播学-传播研究方法》考试备考题库及答案解析
- 人教版(2024新版)七年级上册数学第三次月考模拟试卷(含答案)
评论
0/150
提交评论