微机原理实验参考程序
- 格式:doc
- 大小:263.00 KB
- 文档页数:38
1.课程设计任务书设计内容:设计当把物品放入加热器中,首先要启动加热器和电机工作,设定加热时间为3(5)分钟,为使物品均匀加热,每隔20(30)秒电机要反转一次,(正转→反转、反转→正转),加热时间到后,停止加热器和电机工作,并发声,告知加热结束。
设计目标:在规定的时间内设计出符合要求的汇编语言程序,并提交一份符合本科生毕业设计论文规范的报告。
进度安排:8月13日-8月16日-----------------------确定设计内容并完成硬件部分8月17日-8月21日------------------------------------完成程序清单8月22日-8月23日------------------------------完成课程设计说明书2. 总体设计思路2.1、分析设计所用到的芯片的原理及使用方法:⑴8259A的使用方法:8259A有四个初始化命令字ICW及3个操作操作命令字OCW。
8259A的编程就是根据应用需要将初始化命令字ICW1-ICW4和操作命令字OCW1- OCW3分别写入初始化命令寄存器组和操作命令寄存器组。
ICW1-ICW4各命令字格式如图2-1所示,OCW1-OCW3各命令字格式如图2-2所示,其中OCW1用于设置中断屏蔽操作字,OCW2用于设置优先级循环方式和中断结束方式的8操作命令字,OCW3用于设置和撤销特殊屏蔽方式、设置中断查询方式以及设置对8259内部寄存器的读出命令。
图2-1ICW1-ICW4各命令字格式如图2-2OCW1-OCW3各命令字格式如图⑵8255的使用方法:方式0 —基本输入/出方式;方式1 —选通输入/出方式;方式2 —双向选通工作方式。
图2-3 8255命令字格式图⑶8253的使用方法:(1) 方式0:计数到0结束输出正跃变信号方式。
(2) 方式1:硬件可重触发单稳方式。
(3) 方式2:频率发生器方式。
(4) 方式3:方波发生器。
(5) 方式4:软件触发选通方式。
微机原理实验报告班 级:2012级电子科学与技术卓工班级电子科学与技术卓工班姓 名: 黄中一黄中一 学 号: 201236460273序 号:评阅分数:评阅分数:实验一一、实验目的1、学会如何建立汇编源文件ASM2、学会调用MASM 宏汇编程序对源文件进行汇编,获得目标程序宏汇编程序对源文件进行汇编,获得目标程序 OBJ 及LST 列表文件列表文件3、学会调用LINK 连接程序汇编后的目标文件OBJ 连接成可执行的文件连接成可执行的文件EXE 4、学会使用DEBUG 调试程序把可执行文件装入内存并调试运行,用D 命令显示目标程序,用U 命令对可执行文件反汇编,用G 命令运行调试。
命令运行调试。
二、实验设备装有MASM 软件的IBM PC 机三、实验内容1、汇编程序对源程序进行编译,生成扩展名为OBJ 的目标文件;连接程序是将目标程序和库文件进行连接、定位,生成扩展名为EXE 的可执行文件;调试程序是对目标文件进行调试,验证它的正确性。
是对目标文件进行调试,验证它的正确性。
2、DEBUG 程序各种命令的使用方法程序各种命令的使用方法功能功能命令格式命令格式 使用说明使用说明显示内存单元内容显示内存单元内容D 地址地址从指定地址开始显示40H 个字节或80H 个字节个字节 修改内存单元内容修改内存单元内容 E 地址地址先显示地址和单元内容等待输入修改的内容输入修改的内容检查和修改寄检查和修改寄存器的内容存器的内容R 显示全部寄存器和标志位及下条指令单元十六进制数码和反汇编格式和反汇编格式反汇编反汇编U 地址地址从指定地址开始反汇编16个或32个字节个字节 汇编汇编 A 地址地址从指定地址直接输入语句并从指定指定汇编装入内存从指定指定汇编装入内存跟踪跟踪 T =地址=地址 从指定地址开始逐条跟踪指令运行运行 G =地址=地址无断点,执行正在调试的指令执行正在调试的指令 退出退出Q退出DEBUG 返回DOS3、实验过程①、在edit 环境,写字板,记事本等中输入源程序。
微机原理及应用实验实验一开发环境的使用一、实验目的掌握伟福开发环境的使用方法,包括源程序的输入、汇编、修改;工作寄存器内容的查看、修改;内部、外部RAM内容的查看、修改;PSW中个状态位的查看;机器码的查看;程序的各种运行方式,如单步执行、连续执行,断点的设置。
二、实验内容在伟福开发环境中编辑、汇编、执行一段汇编语言程序,把单片机片内的30H~7FH 单元清零。
三、实验设备PC机一台。
四、实验步骤用连续或者单步的方式运行程序,检查30H-7FH 执行前后的内容变化。
五、实验思考1.如果需把30H-7FH 的内容改为55H,如何修改程序?2.如何把128B的用户RAM全部清零?六、程序清单文件名称:CLEAR.ASMORG 0000HCLEAR: MOV R0,#30H ;30H 送R0寄存器MOV R6,#50H ;50H 送R6寄存器(用作计数器)CLR1: MOV A,#00H ;00 送累加器AMOV @R0,A ;00 送到30H-7FH 单元INC R0 ;R0 加1DJNZ R6,CLR1 ;不到50H个字节,继续WAIT: LJMP WAITEND实验二数据传送一、实验目的掌握MCS-51指令系统中的数据传送类指令的应用,通过实验,切实掌握数据传送类指令的各种不同的寻址方式的应用。
二、实验内容1.编制一段程序,要求程序中包含7中不同寻址方式。
2.编制一段程序,将片内RAM30H~32H中的数据传送到片内RAM38H~3AH中。
3.编制一段程序,将片内RAM30H~32H中的数据传送到片外RAM1000H~1002H 中。
4.编制一段程序,将片内RAM40H~42H中的数据与片外RAM2000H~2002H中的数据互换。
三、实验设备PC机一台。
四、实验步骤逐段编制程序,汇编无误后,用连续或者单步的方式运行程序,检查程序的运行结果,看是否达到预期的效果。
五、实验思考1.如何把片外RAM中1000H~100FH单元中的数传送到片外RAM中2000H~200FH单元中?2.如何把ROM中0200H~0207H单元的数传送至片外RAM0000H~0007H单元中?实验三数码转换一、实验目的掌握采用软件方法进行不同形式数据之间的转换,如十进制数与二进制数的转换、十六进制数与BCD码的转换、BCD数与ASCII码之间的转换、非压缩BCD码与压缩BCD码之间的转换。
《微机原理及接口技术B》实验指导书※实验环境实验设备——唐都TD-PITE 80X86 微机原理及接口技术微机实验平台。
每套设备包括实验箱一台、配备安装有Wmd86联机操作软件的PC微机一台、连接线及电源线。
图1 实验平台连接示意图图2 唐都TD-PITE实验箱图3 唐都TD-PITE实验箱布局图操作步骤:1、打开电脑。
2、插好实验平台电源线。
3、通过串口连接线连接实验箱与微机。
4、打开Wmd86联机操作软件。
5、检查端口是否选择好。
6、进行实验接线。
7、录入汇编程序。
8、编译、链接、下载,观察结果。
图4 Wmd86联机操作软件实验一定时器的使用1.实验目的和意义●熟悉接口试验箱的使用环境。
●体会接口电路通过外部总线与处理器连接原理。
●掌握可编程芯片8253的编程方法。
2.实验设备PC 机一台,TD-PITE 实验装置一套。
3.实验内容1、编写程序,将8254 的计数器0 和计数器1 都设为方式3,用信号源1MHz 作为CLK0时钟,OUT0 为波形输出1ms 方波,再通过CLK1 输入,OUT1 输出1s 方波。
2、编写程序,将8254 的计数器0 设为方式3,计数值为十进制数4,用单次脉冲KK1+作为CLK0 时钟,OUT0 连接MIR7,每当KK1+按动 5 次后产生中断请求,在Wmd86程序运行结果栏上显示字符M 。
改变计数值,验证8254 的计数功能。
4.背景知识〔1〕8254的功能➢8253具有三个独立的16位计数器〔0#~2#通道〕;➢每个通道有6种工作方式;➢可以进行二进制或十进制计数,计数方式为减1计数。
〔最高计数频率2.6MHZ〕〔2〕8254 的内部结构和外部引脚图1.1 8254内部结构图1.2 8254外部引脚〔3〕8254 的工作方式●方式0:计数到0 结束输出正跃变信号方式。
●方式1:硬件可重触发单稳方式。
●方式2:频率发生器方式。
●方式3:方波发生器。
●方式4:软件触发选通方式。
实验三 逐次比较式A/D 转换器0809的原理及编程一、实验目的1. 熟悉逐次逼近式A/D 转换器芯片的工作原理。
2. 了解A/D 转换芯片0809的接口设计方法。
3. 掌握A/D 转换器0809简单的应用编程。
二、实验任务1. 分析本实验模板的电路原理,它与EPP 接口数据传送的方法,所使用的端口地址。
2. 编写出逐次逼近式A/D 转换器芯片0809的转换与显示的控制程序。
三、实验原理1.电路组成及转换原理ADC0809是带有8位A/D 转换器、8路多路开关,以及与微型计算机兼容的控制逻辑的CMOS 组件。
8位A/D 转换器的转换方法为逐次逼近法。
在A/D 转换器内部含有一个高阻抗斩波稳定比较器,一个带有模拟开关数组的256电阻分压器,以及一个逐次逼近的寄存器。
8路的模拟开关由地址锁存器和译码器控制,可以在8个通道中任意访问一个单边的模拟信号。
其原理图如图3-1所示。
8通道多路模拟开关5432128272625242322地址锁存器和译码器W 1W 2逐次逼近型寄存器SAR控制逻辑开关树组256R 电阻分压器610V x V c7输出缓冲锁存器三态212019188151417916111312模拟量输入A B CA L E地址选择地址锁存允许V cc G N D V R E F (+)V R E F (-)E N A B L E数字量输出转换结束(中断)E O CS TA R TC L O C KD 7D 6D 5D 4D 3D 2D 1D 0IN 7IN 6IN 5IN 4IN 3IN 2IN 1IN 0图3-1 ADC0809内部原理图从图中可以看出,ADC0809由两部分组成,第一部分为八通道多路模拟开关,控制C 、B 、A 和地址锁存允许端子,可使其中一个通道被选中。
第二部分为一个逐次逼近型A/D 转换器,它由比较器、控制逻辑、输出锁存缓冲器、逐次逼近寄存器以及开关数组和256R 梯型解码网络组成,由后两种电路(开关数组和256R 梯型电阻)组成D/A 转换器。
微机原理与接口技术实验《简单手势无线遥控小车》实验报告通信科学与工程于广溪113007200701.总体概况与说明1.1 选题概况与说明1.2遥控部分概况与说明1.3机动部分概况与说明2.机械部分分析实现3.硬件系统设计实现3.1电源设计实现3.1.1标准电源来源与稳压3.1.1.1电源的电压和电流要求3.1.1.2电源的纹波要求3.1.1.3 防止电源判定空载关机的方法3.1.2电源升压3.1.3电源降压3.2单片机最小系统版设计实现3.3红外光电开关部分设计实现3.4减速直流电机驱动设计实现3.5 STC单片机USB-串口下载调试实现3.6无线模块分析实现3.7系统总电路图4.软件系统设计实现4.1遥控部分软件系统设计实现4.1.1ST188时序检测方法4.1.2 nRF24L01+驱动程序说明4.1.3 遥控部分所有代码文件4.1.3.1 主文件yaokong.c:4.1.3.2 nRF24L01+驱动程序nRF24L01.c4.1.3.3延时文件delay.c4.1.3.4 52单片机寄存器头文件reg52.h4.1.3.5 所有头文件的头文件allhead.h4.1.3.6 变量声明重定义vartypeabbreviation.h4.1.3.7 电机控制命令定义motorcommand.h4.1.3.8 延时头文件delay.h4.1.3.9 nRF24L01+驱动程序头文件nRF24L01.h 4.2机动部分软件系统设计实现4.2.1直流减速电机的驱动方式说明4.2.2机动部分所有代码文件5.总结1.总体概况说明1.1选题概况与说明:本次微机原理与接口技术实验(综合)实验,我选择的题目是一个可以通过手势动作无线控制的小车。
希望实现的是在遥控端通过产生简单的5种手势动作来控制小车的运动状态和方向。
简单来说就是通过手的向前滑动,向后滑动,向左滑动,向右滑动以及在特定区域滑动实现小车的前后左右以及停止5种动作。
实验一显示程序实验1.emu8086介绍Emu8086-Assembler and Microprocessor Emulator是一个可在Windows 环境下运行的8086CPU汇编仿真软件,Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,它优于一般编译器的地方在于提供了一个虚拟的80x86环境,拥有自己一套独立的“硬件”,可以完成一些纯软件编译器无法完成的功能例如Led显示,交通灯,步进电机等等,而且动态调试(DEBUG)时非常方便一.软件启动启动界面如图1所示,用户可以选择新建文本、程序实例、启动指南、近期文档。
注册的用户名随意,密码112,即可成功。
二.新建文件单击图1中的“New”选项,软件会弹出如图2所示的选择界面。
●COM模板——适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从ORG 0100H开始;●EXE模板——适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。
需要注意的是采用该模板时,用户不可将代码段人为地设置为ORG 0100H,而应由编译器自动完成空间分配;●BIN模板——二进制文件,适用于所有用户定义结构类型;●BOOT模板——适用于在软盘中创建文件。
此外,若用户希望打开一个完全空的文档,则可选择empty workspace的选项。
三.编译和加载程序用户可根据上述选择的模板中编写程序,如图3所示。
该编辑界面集文档编辑、指令编译、程序加载、系统工具、在线帮助为一体,其菜单功能如表1所示。
编写完程序后,用户只需单击工具栏上的“compile”按钮,即可完成程序的编译工作,并弹出如图4所示的编译状态界面。
若有错误则会在窗口中提示,若无错误则还会弹出保存界面,让用户将编译好的文件保存相应的文件夹中。
默认文件夹为…\emu8086\MyBuild\,但您可以通过菜单中assembler/ set output directory对默认文件夹进行修改。
微机原理课程设计题目基于8086的电子称设计指导教师姓名学号王华民************姓名学号赵儒桐************姓名学号孙敬周************专业11级电子信息工程教学单位物理与电子信息学院(盖章)二O一三年六月二十二日目录摘要及关键字 (1)1绪论 (1)2 总体设计及其框图 (1)2.1 电阻应变式传感器 (1)2.2 信号放大模块 (2)2.3重量显示及其控制模块 (2)3 硬件电路设计 (2)3.1数据采集电路 (2)3.2 放大校正电路 (3)3.3 ADC0809与8255的连接 (3)3.4 8086的可编程外设接口电路 (4)3.5 数据显示部分 (5)3.6 系统硬件原理图 (6)4系统软件流程图 (7)5总结 (8)参考文献 (8)基于8086电子称设计摘要本文介绍了一种基于8086微处理器的电子称系统,采用电子称传感器采集数据,用CPU控制重量值稳定在预设重量:当重量高于预设重量值时报警。
系统操作简便、自动化程度高、扩展方便且具有良好的人机交互的能力。
该系统通过实验,取得了较为满意的控制效果,可应用在一些精度要求不太高的系统中。
为了降低整个系统的成本,在满足性能的要求下,选择低成本器件,简化系统设计。
关键词微处理器;电阻应变式传感器;A/D转换器;控制系统一.绪论随着电子技术的发展,特别是大规模集成电路的产生,给人们的生活带来了根本性的变化,如果说微型计算机的出现使现代的科学研究得到了质的飞跃,那么微型计算机控制技术的出现则是给现代工业控制测控领域带来了一次新的革命。
目前,微处理器8086在工业控制系统诸多领域得到了广泛的应用,由于它具有极好的稳定性,更快和更准确的运算精度。
当前,微机测控系统的发展非常迅速,应用也极为广泛,它由于体积小、功能强、性能稳定、价格低廉等优点,使其在工业控制系统诸多领域得到了极为广泛的应用。
在此基础上发展起来的智能仪器无论是在测量的准确度、灵敏度、可靠性、自动化程度、应用功能等方面或在解决测试技术问题的深度及广度方面都有了巨大的发展,以一种崭新的面貌展现在人们的面前。
微机原理课程设计一.设计任务及要求:交通信号灯的控制:1.通过8255A并口来控制LED发光二极管的亮灭。
2.A口控制红灯,B口控制黄灯,C口控制绿灯。
3.输出为0则亮,输出为1则灭。
4.用8253定时来控制变换时间。
要求:设有一个十字路口,1、3为南,北方向,2、4为东西方向,初始态为4个路口的红灯全亮。
之后,1、3路口的绿灯亮,2、4路口的红灯亮,1、3路口方向通车。
延迟30秒后,1、3路口的绿灯熄灭,而1,3路口的黄灯开始闪烁(1HZ)。
闪烁5次后,1、3路口的红灯亮,同时2、4路口的绿灯亮,2、4路口方向开始通车。
延迟30秒时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁。
闪烁5次后,再切换到1、3路口方向。
之后,重复上述过程。
二.方案比较及评估论证:分析题意,红,黄,绿灯可分别接在8255的A口,B口和C口上,灯的亮灭可直接由8086输出0,1控制。
30秒延时及闪烁由8253控制,由闪烁的实现方法可分为两种方案:方案一:设8253各口地址分别为:设8253基地址即通道0地址为04A0H;通道1为04A2H;通道2为04A4H;命令控制口为04A6H。
黄灯闪烁的频率为1HZ,所以想到由8253产生一个1HZ的方波, 8255控制或门打开的时间,在或门打开的时间内,8253将方波信号输入或门使黄灯闪烁。
由于计数值最大为65535,1MHZ/65536的值远大于2HZ,所以采用两个计数器级联的方式,8253通道0的clock0输入由分频器产生的1MHZ时钟脉冲,工作在方式3即方波发生器方式,理论设计输出周期为0.01s的方波。
1MHZ的时钟脉冲其重复周期为T=1/1MHZ=1 s,因此通道0的计数初值为10000=2710H。
由此方波分别作为clock1和clock2的输入时钟脉冲,所以通道1和通道2的输入时钟频率为100HZ,通道1作计数器工作在方式1,计数初值3000=BB8H既30s,计数口,8255将A口数据输入到8086,8086检测到则输出一个高电平到8255的PA7到高电平既完成30s定时。
实验一显示程序实验1.emu8086介绍Emu8086-Assembler and Microprocessor Emulator是一个可在Windows 环境下运行的8086CPU汇编仿真软件,Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,它优于一般编译器的地方在于提供了一个虚拟的80x86环境,拥有自己一套独立的“硬件”,可以完成一些纯软件编译器无法完成的功能例如Led显示,交通灯,步进电机等等,而且动态调试(DEBUG)时非常方便一.软件启动启动界面如图1所示,用户可以选择新建文本、程序实例、启动指南、近期文档。
注册的用户名随意,密码112,即可成功。
二.新建文件单击图1中的“New”选项,软件会弹出如图2所示的选择界面。
●COM模板——适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从ORG 0100H开始;●EXE模板——适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。
需要注意的是采用该模板时,用户不可将代码段人为地设置为ORG 0100H,而应由编译器自动完成空间分配;●BIN模板——二进制文件,适用于所有用户定义结构类型;●BOOT模板——适用于在软盘中创建文件。
此外,若用户希望打开一个完全空的文档,则可选择empty workspace的选项。
三.编译和加载程序用户可根据上述选择的模板中编写程序,如图3所示。
该编辑界面集文档编辑、指令编译、程序加载、系统工具、在线帮助为一体,其菜单功能如表1所示。
编写完程序后,用户只需单击工具栏上的“compile”按钮,即可完成程序的编译工作,并弹出如图4所示的编译状态界面。
若有错误则会在窗口中提示,若无错误则还会弹出保存界面,让用户将编译好的文件保存相应的文件夹中。
默认文件夹为…\emu8086\MyBuild\,但您可以通过菜单中assembler/ set output directory对默认文件夹进行修改。
设计要求:设计要求:(1) 利用8253定时,8259中断及8255输出实现交通灯模拟控制。
(2) 实现能自动控制和手动控制。
实现能自动控制和手动控制。
(3) 实现能随时可以调整自动模式的绿灯和红灯时间和红灯时间1 1 设计目的设计目的电子课程设计是电子技术学习中非常重要的一个环节,是将理论知识和实践能力相统一的一个环节,是真正锻炼学生能力的一个环节。
交通灯能保证行人过马路的安全交通灯能保证行人过马路的安全,,控制交通状况等优点受到人们的欢迎,在很多场合得到了广泛的应用。
多场合得到了广泛的应用。
交通灯是采用计算机通过编写汇编语言程序控制的。
红灯停,绿灯行的交通规则。
广泛用于十字路口广泛用于十字路口,,车站车站, , , 码头等公共场所码头等公共场所码头等公共场所,,成为人们出行生活中不可少的必需品成为人们出行生活中不可少的必需品,,由于计算机技术的成熟与广泛应用计算机技术的成熟与广泛应用,,使得交通灯的功能多样化的功能多样化,,远远超过老式交通灯远远超过老式交通灯, , , 交通交通灯的数字化给人们生产生活带来了极大的方便,而且大大地扩展了交通灯的功能。
诸如闪烁警示、鸣笛警示,时间程序自动控制、倒计时显示,所有这些,都是以计算机为基础的。
还可以根据主、次干道的交通状况的不同任意设置各自的不同的通行时间。
或者给红绿色盲声音警示的人性化设计。
现在的交通灯系统很多都增加了智能控制环节,比如对闯红灯的车辆进行拍照。
当某方向红灯亮时,此时相应的传感器开始工作,当有车辆通过时,照相机就把车辆拍下。
辆通过时,照相机就把车辆拍下。
要将交通灯系统产品化,应该根据客户不同的需求进行不同的设计,应该在程序中增加一些可以人为改变的参数,以便客户根据不同的需要随时调节交通灯。
因此,研究交通灯及扩大其应用,有着非常现实的意义。
义。
2 2 设计内容设计内容交通灯控制系统交通灯控制系统利用8253定时器、8255等接口,设计一电路,模拟十字路口交通灯控制。
参考文献微机原理课设参考文献:微机原理课设1. 引言在现代社会中,计算机技术得到了广泛的应用和发展。
微机原理作为计算机科学与技术的基础课程,对于学生的计算机基础知识的掌握和实践能力的培养起着重要的作用。
本文以微机原理课设为题,旨在介绍微机原理课设的目的、内容和方法。
2. 目的微机原理课设的目的是通过实践操作,帮助学生巩固和深化对微机原理知识的理解,培养学生的实践能力和解决问题的能力。
通过设计和搭建一个简单的计算机系统,学生可以更好地理解计算机的工作原理和组成结构。
3. 内容微机原理课设的内容主要包括计算机硬件的组装和调试,以及简单的软件编程。
学生需要选择合适的硬件设备,并按照指定的步骤进行组装和连接。
在组装完成后,学生需要进行调试和测试,确保计算机硬件的正常运行。
此外,学生还需要学习和掌握一种编程语言,并使用该语言编写一些简单的程序,以测试计算机的功能和性能。
4. 方法微机原理课设的方法主要包括理论学习、实践操作和实验报告。
在课设开始之前,学生需要通过课堂学习和自主学习,掌握计算机硬件和软件的基本知识。
然后,学生需要参加实践操作,按照指导书的要求,进行硬件组装和连接。
在实践操作过程中,学生需要仔细观察和记录,及时解决出现的问题。
最后,学生需要根据实践操作的结果,撰写实验报告,总结和分析实验过程中的经验和教训,以及实验结果的意义和启示。
5. 结论微机原理课设是一门重要的实践课程,对于学生的计算机基础知识的掌握和实践能力的培养有着重要的作用。
通过参与微机原理课设,学生可以更好地理解计算机的工作原理和组成结构,提高解决问题的能力和实践能力。
因此,微机原理课设是学生学习计算机科学与技术的重要途径之一。
以上是关于微机原理课设的参考文献,希望能对读者了解微机原理课设有所帮助。
课程设计任务书学生姓名:易杨专业班级:电信 0802 指导教师:曾刚工作单位:信息工程学院题目:进制转换程序设计初始条件:具备数字电路的理论知识;具备微机原理的理论知识和实践能力;熟悉汇编语言编程技术;熟悉80X86的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、程序实现二进制、十进制、十六进制之间的转换2、在命令提示下输入相应进制数,回车后进行转换3、输入错误时应声响报警并拒绝输入4、程序采用汇编语言在PC机上完成5、完成符合学校要求的设计说明书时间安排:一周,其中2天程序设计,2天程序调试,1天完成课程设计报告书及答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)1原理分析 (1)2程序设计流程 (3)2.1程序流程图 (3)2.2设计思路 (4)3程序设计 (5)3.1堆栈段数据段程序设计 (5)3.2主程序设计 (5)3.3输入二进制程序 (7)3.4输入十进制程序 (8)3.5输入十六进制程序 (8)3.6输出二进制程序 (9)3.7输出十进制程序 (9)3.8输出十六进制程序 (11)3.9回车键确定程序 (11)3.10报警程序 (12)4运行结果 (13)5心得体会 (15)参考文献 (16)摘要日常生活与实际应用中,往往需要计算机处理的信息是多种多样的,如各种进位制的数据,不同语种的文字符号和各种图像信息等。
但在计算机内部采用的是二进制计数制,这种进制表达方法对于人们研究分析是不那么方便的。
本次课程设计将通过所学的微机原理知识理论,用汇编语言编写程序,实现二进制、十进制与十六进制之间的相互转换,并在MF2KP软件上演示。
关键词:汇编程序进制转换MF2KP1 原理分析进位计数制是人们利用符号来计数的方法。
一种进位计数制包含一组数码符号和两个基本因素。
数码是用不同的数字符号来表示一种数制的数值,这些数字符号称为”数码”。
在"开始"找到运行单击在运行中输入CMD输入CD空格\(反斜杠),(进入C盘根目录)输入F:(进入F盘)输入CD空格MASM(进入MASM文件夹)输入MASM空格0817.ASM(检查0817.ASM有无错误并生成.OBJ文件),直到没错输入LINK空格0817.OBJ(进行连接)输入0817.EXE运行汇编语言应用程序的开发一.汇编语言应用程序的开发过程开发一个可独立运行的汇编语言程序,主要包括以下基本步骤:1.用文本编辑软件编辑汇编语言源程序模块(SOURCE MODULES)。
一个完整的汇编语言源程序,可以是单模块结构格式,也可以是多模块结构格式。
无论采用哪一种结构格式,每一个模块都必须是一个可独立汇编的源程序文件(扩展名为.ASM)。
常用的文本编辑软件如EDIT,QEDIT,PE,或由其他高级语言(如TC,VC等)提供的编辑环境,都可以用来编辑汇编语言源程序。
2.调用宏汇编程序MASM对源程序的每一个模块进行汇编(包括对宏的处理),生成目标文件.OBJ。
在汇编过程中,MASM将对源程序模块进行语法检查,若有语法错误,则在汇编结束时,将错误信息显示出来。
这时程序设计者就得返回第二步,再调用编辑程序,并根据提示信息,对有语法错误的语句进行修改,然后再重新进行汇编,直到MASM未发现语法错误为止。
在汇编过程中,出了对每一个源程序模块文件都要生成对应的目标文件.OBJ外,还可以选择生成列表文件.LST和交叉引用文件.CRF,以提供调试时使用。
在汇编时产生的错误,通常称为语法错误。
注意:在汇编过程中不能发现程序的逻辑功能错误。
3.调试连接程序LINK,对一个或多个目标文件.OBJ进行连接,生成一个可执行文件.EXE。
这里所说的目标文件,有的可能是在汇编时产生的,有的可能是由某个库文件.LIB 提供的。
在连接过程中,还可以选择生成内存映像文件.MAP,以供在调试程序时使用。
在连接过程中,如果发现有错误,也会将错误信息显示在屏幕上。
da数模转换实验报告范文篇一:微机原理实验报告--数模转换微机原理实验报告实验题目:数/模转换器DAC0832系部:电子与信息工程系学生姓名:专业班级:学号:指导教师:2022.12.30一.实验目的1.掌握D/A转换原理;2.熟悉D/A芯片接口设计方法;3.掌握DAC0832芯片的使用方法。
二.实验设备1.PC微机一台;2.TD-PIT实验装置一台;3.示波器一台。
三.实验要求用DAC0832设计一个D/A转换接口电路,采用单缓冲工作方式,产生方波、三角波、锯齿波和正弦波。
四.实验原理1.DAC3802的结构及性能(1)输入/输出信号。
D7-D0为8位数据输入线;IOUT1为DAC电流输出1,IOUT2为DAC电流输出2,IOUT1和IOUT2之和为一常量;RFB为反馈信号输入端,反馈电阻在芯片内。
(2)控制信号。
ILE为允许输入锁存信号;WR1和WR2分别为锁存输入数据信号和锁存输入寄存器到DAC寄存器的写信号;某FER为传送控制信号;CS为片选信号。
(3)电源。
VCC为主电源,电压范围为+5V到+15V;VREF为参考输入电压,范围为-10V到+10V。
DAC0832管脚及其内部结构框图2.工作方式外部五个控制信号:ILE,CS,WR1,WR2,某FER连接方式的不同,可工作于多种方式:直通方式,单缓冲方式,双缓冲方式(1)直通方式ILE接高、CS、WR1、WR2、某FER接地,两级寄存器均直通;(2)单缓冲方式两级寄存器一个受控,一个直通;(3)双缓冲方式两级寄存器均受控。
0832为电流输出型D/A,要得模拟电压,必需外加转换电路(运放)。
五.实验内容1.硬件电路图:2.软件程序设计(1)产生方波tackegmenttack'tack'dw32dup()tackendcodeegmentbeginprocfaraume:tack,c:codepuhduba某,a某puha某MOVD某,0D800H;片选信号输入地址MOVAL,0NE某T:OUTD某,ALMOVD 某,0D800HOUTD某,ALLOOP$;延时NOTAL;求反,由高电平转为低电平或有低电平转为高电平PUSHA某;保护数据MOVAH,11INT21HCMPAL,0;有按键退出POPA某JZNE某Tretbeginendpcodeendendbegin(2)产生三角波tackegmenttack'tack'dw32dup()tackenddataegmentdataendcodeegmentbeginprocfaraume:tack,c:code,d:datapuhduba某,a某puha某MOVD某,0D800HMOVAL,0NE某T:OUTD某,ALCALLDELAY;调用延时篇二:数模转换器和模数转换器实验报告实验报告课程名称实验项目数/模转换器和模/数转换器实验实验仪器系别计算机系专业网络工程班级/学号学生姓名_实验日期成绩_______________________指导教师实验五数/模转换器和模/数转换器实验一、实验目的1.了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法。
CHECK MACRO CODE,COMPAREMOV AL,0000&CODE&BMOV DX,PORTOUT DX,ALMOV DX,PORT+1IN AL,DXLEA BX,TAB&COMPARECMP AL,0FHJNE DISPLAYENDMDATA SEGMENTMESSAGE DB 'PLEASE INPUT ANYKEY FROM KEYBOARD, PRESS F FOR END.',0DH,0AH,'$' TAB1 DB 'F', 'E', 'D', 'C'TAB2 DB 'B', 'A', '9', '8'TAB3 DB '7', '6', '5', '4'TAB4 DB '3', '2', '1', '0'KB DB 00EH, 00DH,00BH,007HPORT EQU 280HDATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV DX,PORT+3 ;初始化8255MOV AL,10000010bOUT DX,ALLEA DX,MESSAGEMOV AH,09HINT 21HSEARCH:MOV AL,0 ;若有键按下,按列查找哪个键MOV DX,PORTOUT DX,ALMOV DX,PORT+1IN AL,DXAND AL,0FHCMP AL,0FHJE SEARCHCHECK 1110,1 ;查找按下的键,并显示CHECK 1101,2CHECK 1011,3CHECK 0111,4NOPJMP SEARCHDISPLAY:MOV DI,BX ;存小键盘扫描码LEA SI,KBNEXT:CMP AL,[SI] ;查键盘扫描码表JE SHOW ;找到了,转去显示INC SI ;否则继续INC DIJMP NEXTSHOW: ;显示键入字符MOV AH,02HMOV DL,[DI]INT 21HCMP DL,'F' ;若是'F'则退出JE OVERCALL DELAYJMP SEARCH ;重新开始查询OVER:MOV AH,4CHINT 21HDELAY PROC ;延时循环100*65536次PUSH DIPUSH CXMOV CX,0FHXOR DI,DIAGAIN:NOPDEC DIJNZ AGAINDEC CXJNZ AGAINPOP CXPOP DIRETDELAY ENDPCODE ENDSEND STARTSET8253 MACRO SEGCODE,SEGOFFSETMOV AL,SEGCODE&BMOV DX,P8253+3 ;;工作在模式3OUT DX,ALMOV AX,3E8HMOV DX,P8253+&SEGOFFSETOUT DX,ALMOV AL,AH ;;先赋高八位再赋低八位OUT DX,ALENDMLIGHTUP MACRO DIGIT,SELECTLOCAL DELAYMOV DL,DIGIT ;;选择位MOV DH,0MOV SI,DXMOV AL,[BX][SI]MOV DX,P8255+1 ;;点亮LEDOUT DX,ALMOV AL,0000&SELECT&BMOV DX,P8255+2 ;;PC输出选通信号OUT DX,ALPUSH CXMOV CX,00F00H ;;延时DELAY: LOOP DELAYPOP CXXOR AX,AXMOV DX,P8255+2 ;;PC输出选通信号OUT DX,ALENDMDATA SEGMENTLED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH SEC1 DB 0SEC2 DB 5MIN1 DB 9MIN2 DB 5P8259 EQU 20HP8255 EQU 288HP8253 EQU 280HOLD_0A DW 0,0 ;原中断向量OLD_8259 DB 0DATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP (0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOV AX,DATAMOV DS,AXCLISET8253 00110110,0SET8253 01110110,1PUSH ES ;设置中断向量表PUSH BXMOV AL,0BH ;保护原中断向量,0B中断类型号MOV AH,35HINT 21H ;读中断向量表MOV OLD_0A+2,ES ;ES为段地址,BX为段偏移地址MOV OLD_0A,BXPOP BXPOP ESPUSH DSMOV AL,0BH ;写新中断向量MOV AH,25HMOV DX,SEG INT_0AMOV DS,DXMOV DX,OFFSET INT_0AINT 21HPOP DSMOV AL,10000000B ;对8255进行设置,PB/PC输出MOV DX,P8255+3OUT DX,ALIN AL,P8259+1 ;8259奇地址,中断向量屏蔽MOV OLD_8259,AL ;字设置保护原屏蔽字AND AL,11110111B ;开IRQ3OUT P8259,ALSTI ;开中断PLAY:LEA BX,LED ;LED段码LIGHTUP SEC1,0001LIGHTUP SEC2,0010LIGHTUP MIN1,0100LIGHTUP MIN2,1000JMP PLAYMOV AH,4CHINT 21HINT_0A PROC NEAR ;中断服务子程序CMP SEC1,9JZ INT1INC SEC1JMP EXITINT1:MOV SEC1,0INC SEC2CMP SEC2,6JNZ EXITMOV SEC2,0INC MIN1CMP MIN1,10JNZ EXITMOV MIN1,0INC MIN2CMP MIN2,6JNZ EXITMOV MIN2,0EXIT:MOV AL,20HOUT 20H,ALIRETINT_0A ENDPCODE ENDSEND STARTTRANSSET MACRO ADDRESS,ALNUMMOV DX,ADDRESSMOV AX,ALNUMOUT DX,ALENDMDATA SEGMENTFILE DB 'D:\abc.TXT',0FCODE DW 0BUF DB 2000H DUP(0)DATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS: CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXTRANSSET 3FBH,80H ;传输线路控制寄存器,寻址除数锁存器TRANSSET 3F8H,60H ;DLLTRANSSET 3F9H,0 ;DLHTRANSSET 3FBH,1AH ;传输线路控制寄存器,LCR地址,7位数据,1位停止TRANSSET 3FCH,03H ;MODEM控制寄存器TRANSSET 3F9H,0 ;屏蔽中断MOV AH,3DH ;文件操作LEA DX,FILEMOV AL,2INT 21HMOV FCODE,AXXOR SI,SIRECEIVE:MOV DX,3FDH ;检测接收数据是否准备好IN AL,DXTEST AL,01HJZ RECEIVEMOV DX,3F8HIN AL,DXMOV DL,ALMOV AH,02INT 21HSEND:MOV DX,3FDH ;检测接收数据是否准备好IN AL,DXTEST AL,20HJZ SENDMOV AH,3FH ;从文件中读取发送LEA DX,BUFADD DX,SIMOV BX,FCODEMOV CX,1INT 21HMOV DX,3F8HMOV AL,BUF[SI]OUT DX,ALINC SI;MOV DL,AL;MOV AH,02 ;将字符显示在屏幕上;INT 21HREPT 45NOPENDMJMP RECEIVECODE ENDSEND STARTTRANSSET MACRO ADDRESS,ALNUMMOV DX,ADDRESSMOV AX,ALNUMOUT DX,ALENDMDATA SEGMENTFILE DB 'D:\abc.TXT',0FCODE DW 0BUF DB 2000H DUP(0)IO8254A EQU 280HIO8251A EQU 2B8HIO8251B EQU 2B9HDATA ENDSSTACK SEGMENT PARA STACKDB 256 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXTRANSSET IO8254A+3,00010110B ;设置8254计数器0工作方式,低字节,8位,方式3,二进制TRANSSET IO8254A,52 ;给8254计数器0送初值(波特率1200,因子16,计数初值52)TRANSSET IO8251B,0 ;初始化8251TRANSSET IO8251B,40H ;向8251控制端口送40H,使其复位TRANSSET IO8251B,7EH ;设置为1个停止位,8个数据位,波特率因子为16 TRANSSET IO8251B,27H ;向8251送控制字允许其发送和接收MOV AH,3CH ;文件操作LEA DX,FILEMOV CX,00INT 21HMOV FCODE,AXMOV AH,3DHLEA DX,FILEMOV AL,2INT 21HXOR SI,SISEND:MOV DX,IO8251BIN AL,DXTEST AL,20H ;发送是否准备好JZ SENDMOV DX,IO8251AMOV AL,'F'OUT DX,AL ;发送;MOV DL,AL;MOV AH,02 ;将字符显示在屏幕上;INT 21HREPT 64NOPENDMRECEIVE:MOV DX,IO8251BIN AL,DXTEST AL,01 ;检查接收是否准备好JZ RECEIVE ;没有,等待MOV DX,IO8251AIN AL,DX ;准备好,接收MOV DL,ALMOV AH,02 ;将接收到的字符显示在屏幕上INT 21HMOV BUF[SI],DLMOV AH,40H ;接收到的字符写入文件LEA DX,BUFADD DX,SIMOV BX,FCODEMOV CX,1INT 21HINC SIREPT 45NOPENDMJMP SENDMOV AH,4CHINT 21HCODE ENDS END STARTDATA SEGMENTINT0B DW 2 DUP(?)IMR DB ?P_AD DW 298HTAB DB '0123456789ABCDEF'DATA ENDSS SEGMENT STACK 'STACK'DB 128 DUP(?)S ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:SMAIN PROC PARMOV AX,DATAMOV DS,AXCLI;修改中断向量表PUSH ESPUSH BXMOV AH,35H ;保护原中断向量MOV AL,0BHINT 21HMOV INT0B,ESMOV INT0B+2,BXPOP BXPOP ESPUSH DSPUSH DXMOV DX,OFFSET DISP ;设置新的中断向量PUSH BXMOV BX,SEG DISPMOV DS,BXPOP BXMOV AX,250BHINT 21HPOP DXPOP DS;8259清除0BH号中断屏蔽位IN AL,21HMOV IMR,ALAND AL,0F7HOUT 21H,AL;启动AD转换NEXT: MOV DX,P_ADMOV AL,0OUT DX,AL;等待中断,并检测是否有按键PUSH CXMOV CX,100LOOP $POP CXSTIMOV AH,1INT 16HJZ NEXT;恢复8259中断屏蔽位CLIMOV AL,IMROUT 21H,AL;恢复中断向量表PUSH DXPUSH DSMOV DX,INT0BMOV DS,DXMOV DX,INT0B+2MOV AX,250BHINT 21HPOP DSPOP DXMOV AX,4C00HINT 21HMAIN ENDPDISP PROC FARPUSH AXPUSH DXMOV DX,P_AD ;读入AD转换结果IN AL,DXMOV AH,0 ;AH中为低位,AL中为高位SHL AX,4SHR AL,4PUSH AX ;输出高位MOV AL,AHLEA BX,TABXLATBMOV DL,ALMOV AH,2INT 21HPOP AXLEA BX,TAB ;输出低位XLATBMOV DL,ALMOV AH,2INT 21HMOV DL,0DH ;输出回车MOV AH,2INT 21HMOV DL,0AH ;输出回车MOV AH,2INT 21HMOV AL,20HOUT 20H,ALPOP DXPOP AXIRETDISP ENDPCODE ENDSEND MAINDATA SEGMENTADD_DA DW 290HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,ADD_DAMOV AL,0NEXT: OUT DX,AL ;向DA送数据ADD AL,10MOV CX,5 ;延时LOOP $MOV AH,1 ;检测按键INT 16HJZ NEXTMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAINDATA SEGMENTADD_DA DW 290HLEN DB 32DATA_IN DB 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96hdb 80h,66h,4eh,38h,25h,15h,09h,04hdb 00h,04h,09h,15h,25h,38h,4eh,66hDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,ADD_DABEGIN: MOV BH,LENLEA SI,DATA_INNEXT: MOV AL,[SI]OUT DX,AL ;向DA送数据INC SIDEC BHMOV CX,1 ;延时LOOP $CMP BH,0 ;一个周期已完成JZ BEGINMOV AH,1 ;检测按键INT 16HJZ NEXTMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAIN。
T1a.asm;4000H起256个字节清0Block equ 4000hmov dptr, #Block ; 起始地址mov r0, #0 ; 清 256 字节clr aLoop: movx @dptr, ainc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一ljmp $endT1a.c;4000H起256个字节清0xdata unsigned char Buffer[256] _at_ 0x4000; void main(){unsigned int index;unsigned char xdata * ptr;ptr = &Buffer; // 起始地址for (index = 0; index <= 255; index++) {*ptr++ = 0; // 清0, 地址加一}}T1b.asm;3000H起长度256字节的存储块移到4000Hmov r0, #30hmov r1, #00hmov r2, #40hmov r3, #00hmov r7, #0Loop: mov dph, r0mov dpl, r1movx a, @dptrmov dph, r2mov dpl, r3movx @dptr, acjne r1, #0ffh, Goon1inc r0Goon1: inc r1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3djnz r7, Loopljmp $endT1b.c;3000H起长度256字节的存储块移到4000Hxdata unsigned char Buffer1[256] _at_ 0x3000;xdata unsigned char Buffer2[256] _at_ 0x4000;void main(){unsigned int index;unsigned char xdata * ptr1;unsigned char xdata * ptr2;ptr1 = &Buffer1;ptr2 = &Buffer2;for (index=0; index <= 255; index++) {*ptr2++ = *ptr1++;}}T2.ASM 8255输入输出实验mode equ 082h ; 方式0,PA,PC输出,PB输入1000,0010 PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址org 0hmov a, #modemov dptr, #CAddrmovx @dptr,a ; 输出控制字;实验1:PA口作输出,驱动LED,实现单个LED循环点亮。
EX_A: mov a,#80H ;最左灯先亮mov dptr,#PortAmov b,#8H ;右移位数OutA: movx @dptr,a ; 输出PortA,使相应灯亮rr a ; 亮灯右移位mov r5,#1 ;延时时间与r5成正比call delay ; 延时djnz b, OutA;实验2:PB口作输入,读入开关量,所得的数据由PA口输出,驱动LED EX_B: mov dptr,#PortBmovx a,@dptr ; 读入开关量mov dptr,#PortA ; 开关量输出到PortA驱动LEDmovx @dptr,amov r5,#2 ;延时时间与r5成正比call delay ;延时延时ljmp 0;延时子程序delay: mov r7,#0mov r6,#0ddd: djnz r7,ddddjnz r6,ddddjnz r5,dddretendT2.c 8255输入输出实验#define mode 0x82 // 方式0,PA,PC输出,PB输入xdata unsigned char PortA _at_ 0x8000 ; // Port Axdata unsigned char PortB _at_ 0x8001 ; // Port Bxdata unsigned char PortC _at_ 0x8002 ; // Port Cxdata unsigned char CAddr _at_ 0x8003 ; // 控制字地址void delay(unsigned char CNT){unsigned int i;while (CNT-- !=0)for (i=20000; i !=0; i--);}void main(){register unsigned char i, dd;CAddr = mode; // 方式0, PA,PC输出, PB输入while(1){dd = 0x80;for(i = 0; i<8; i++){PortA = dd; // 输出到PAdd >>= 1; // 移位delay(1); // 延时};dd = PortB; // PB输入PortA = dd; // 再输出到PAdelay(2);}#include <reg51.h>sbit LED = P1^0;bit LEDBuf;void ExtInt0() interrupt 0{LEDBuf = !LEDBuf;LED = LEDBuf;}void main(){LEDBuf = 0;LED = 0;TCON = 0x01; // 外部中断0下降沿触发IE = 0x81; // 打开外部中断允许位(EX0)及总中断允许位(EA) while (1) ;}T4.ASM 计数器/定时器实验;用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转Tick equ 10000 ; 10000 ×100us = 1sT100us equ 256-50 ; 100us时间常数(6M)C100us equ 30h ; 100us记数单元,初值=10000,高位低地址 LEDBuf equ 0 ;可寻址位00h作显示缓冲区LED equ P1.0ljmp Start;中断服务程序org 000bh ;中断入口T0Int: push PSWmov a, C100us+1 ;10000的低8位不为0时,继续-1jnz Goondec C100us ; 10000的低8位为0时,10000的高8位-1 Goon: dec C100us+1mov a, C100usorl a, C100us+1jnz Exit ; 100us 记数器不为0, 返回mov C100us, #high(Tick) ; 1秒定时到,重置记数器,取反LED mov C100us+1, #low(Tick)cpl LEDBufExit: pop PSWreti;主程序Start: mov TMOD, #02h ; 方式2, 定时器mov TH0, #t100usmov TL0, #t100usmov IE, #10000010b ; EA=1, IT0 = 1setb TR0 ; 开始定时clr LEDBufclr LEDmov C100us, #high(Tick) ; 100us记数单元初值=10000的高8位 mov C100us+1, #low(Tick) ; 100us记数单元初值=10000的低8位Loop: mov c, LEDBuf ;显示输出mov LED, cljmp LoopendT4.c 计数器/定时器实验;用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转#include <reg51.h>#define Tick 10000 // 10000 x 100us = 1s#define T100us (256-50) // 100us时间常数(6M)unsigned int C100us; // 100us记数单元bit LEDBuf;sbit LED = P1^0;void T0Int() interrupt 1{C100us--;if (C100us == 0) {C100us = Tick; // 100us 记数器为0, 重置记数器LEDBuf = !LEDBuf; // 取反LED}}void main(){TMOD = 0x02; // 方式2, 定时器TH0 = T100us;TL0 = T100us;IE = 0x82; // EA=1, IT0 = 1LEDBuf = 0;LED = 0;C100us = Tick;TR0 = 1; // 开始定时while (1) {LED = LEDBuf;}}T5a.ASM; 利用实验仪提供的显示电路,动态显示一行数据OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED: ; 显示子程序mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart: ;主程序mov sp, #40hmov Num, #0MLoop: inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲 inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendT5a.c;利用实验仪提供的显示电路,动态显示一行数据#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i, j;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}OUTBIT = 0; // 关所有八段管}void main(){unsigned char i = 0;unsigned char j;while(1) {LEDBuf[0] = LEDMAP[ i & 0x0f];LEDBuf[1] = LEDMAP[(i+1) & 0x0f];LEDBuf[2] = LEDMAP[(i+2) & 0x0f];LEDBuf[3] = LEDMAP[(i+3) & 0x0f];LEDBuf[4] = LEDMAP[(i+4) & 0x0f];LEDBuf[5] = LEDMAP[(i+5) & 0x0f];i++;for(j=0; j<30; j++)DisplayLED(); // 延时}}T5b.ASM; 把按键输入的键码在六位数码管上显示出来OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED: ; 显示子程序mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey: ;检测是否有按键mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey: mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop: mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp ExitGoon1: mov r1, a ; 键值 = 列 X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值 mov r1, #4LoopC: rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit: mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart: ;主程序mov sp, #40hmov LEDBuf+0, #0ffh ; 显示 8.8.8.8. mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop: call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示 call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopendT5b.c;把按键输入的键码在六位数码管上显示出来#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}}code unsigned char KeyTable[] = { // 键码定义0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07};unsigned char TestKey(){OUTBIT = 0; // 输出线置为0return (~IN & 0x0f); // 读入键状态(高四位不用)}unsigned char GetKey(){unsigned char Pos;unsigned char i;unsigned char k;i = 6;Pos = 0x20; // 找出键所在列do {OUTBIT = ~ Pos;Pos >>= 1;k = ~IN & 0x0f;} while ((--i != 0) && (k == 0));// 键值= 列x 4 + 行if (k != 0) {i *= 4;if (k & 2)i += 1;else if (k & 4)i += 2;else if (k & 8)i += 3;OUTBIT = 0;do Delay(10); while (TestKey()); // 等键释放return(KeyTable[i]); // 取出键码} else return(0xff);}void main(){LEDBuf[0] = 0xff;LEDBuf[1] = 0xff;LEDBuf[2] = 0xff;LEDBuf[3] = 0xff;LEDBuf[4] = 0x00;LEDBuf[5] = 0x00;while (1) {DisplayLED();if (TestKey()) LEDBuf[5] = LEDMAP[GetKey() & 0x0f];}}T6.ASM; 实现两个实验台之间的串行通讯。