首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 范文大全
  • 古典文学
  • 职场知识
  • 中国文学
  • 公文书信
  • 外国名著
  • 寓言童话
  • 百家讲坛
  • 散文/诗歌
  • 美文欣赏
  • 礼仪知识
  • 民俗风情
  • 谜语大全
  • 名言警句
  • 微机原理与接口技术单片机软件报告

    时间:2021-03-05 16:47:28 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:微机 单片机 接口

    微机原理与接口技术单片机软件报告 本文关键词:微机,单片机,接口,原理,报告

    微机原理与接口技术单片机软件报告 本文简介:实验报告课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________实验名称:__单片机软件实验_____一、实验目的和要求(必填)二、实验内容和原理(必填)三、主要仪器设备(必填)四、操作方法和实验步骤五、实验数据记录和处理六、实验结果与分析(

    微机原理与接口技术单片机软件报告 本文内容:

    实验报告

    课程名称:___微机原理与接口技术_指导老师:_____________成绩:__________________

    实验名称:__

    单片机软件实验

    _____

    一、实验目的和要求(必填)二、实验内容和原理(必填)

    三、主要仪器设备(必填)四、操作方法和实验步骤

    五、实验数据记录和处理六、实验结果与分析(必填)

    七、讨论、心得

    线

    实验一、内存操作

    一、

    实验目的

    a)

    掌握数据传送指令;

    b)

    掌握各种数据传送指令的寻址方式;

    c)

    熟练运用keil

    环境对汇编程序进行调试;

    d)

    掌握数据传送、复制等程序的设计与调试方法。

    二、

    实验内容

    基础型实验内容

    1、

    下列程序的功能是给外部RAM8000~80FFH的256个单元的内容赋值,赋值的内容取决于程序中A的赋值。在Keil环境运行该程序,并观察寄存器及内存单元的变化

    2、

    下列程序将3000H起始的256个字节存储块移动到4000H起始的256个字节存储块,在Keil环境运行如下程序,观察寄存器及存储单元的变化。

    设计型实验内容

    1、

    在keil环境修改内部RAM

    30H

    ~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H-3FH到40H-4FH的数据块拷贝。

    2、

    在keil环境修改内部RAM

    30H

    ~3FH的内容分别为#00H-#0FH,设计程序实现将片内30H~3FH单元的内容复制到片外1030H~103FH中。

    3、

    在keil环境修改内部RAM

    30H

    ~3FH的内容分别为#00H-#0FH,设计程序实现将内部RAM30H

    ~3FH内容逆序拷贝到外部数据XRAM:0000H

    ~000FH中。使用单步、断点方式调试程序,查看特殊功能寄存器、内部数据RAM、外部数据空间的变化。

    三、

    实验设备

    计算机一台

    四、

    实验代码

    基础型

    1、

    ORG

    0000H

    START

    EQU

    8000H

    MAIN:

    MOV

    DPTR,#START

    ;起始地址

    MOV

    R0,#0

    ;设置256字节计数值

    MOV

    A,#1H

    Loop:

    MOVX

    @DPTR,A

    INC

    DPTR

    ;指向下一个地址

    DJNZ

    R0,Loop

    ;计数值减一

    NOP

    SJMP

    $

    END

    2、

    ORG

    0000H

    MOV

    DPTR,#3000H

    MOV

    A,#01H

    MOV

    R5,#0

    ;设置256字节计数值

    LOOP:

    MOVX

    @DPTR,A

    INC

    DPTR

    DJNZ

    R5,LOOP

    MOV

    R0,#30H

    MOV

    R1,#00H

    MOV

    R2,#40H

    MOV

    R3,#00H

    MOV

    R7,#0

    LOOP1:

    MOV

    DPH,R0

    MOV

    DPL,R1

    ;外部地址

    MOVX

    A,@DPTR

    MOV

    DPH,R2

    MOV

    DPL,R3

    MOVX

    @DPTR,A

    INC

    R1

    INC

    R3

    DJNZ

    R7,LOOP1

    SJMP

    $

    END

    设计型

    1、

    ORG

    0000H

    MAIN:MOVR2,#10H

    ;循环次数赋值

    MOV

    A,#00H

    MOVR1,#30H

    LOOP1:[email protected],A

    INC

    R1

    INC

    A

    DJNZ

    R2,LOOP1

    ;计数值减1

    MOV

    R2,#10H

    ;循环次数重新赋值

    MOVR1,#30H

    MOV

    R0,#40H

    ;赋值完成

    LOOP2:MOV

    A,@R1

    [email protected],A

    INC

    R1

    INC

    R0

    DJNZR2,LOOP2

    ;拷贝完成

    LJMP

    1000H

    END

    2、

    ORG

    1000H

    MAIN:MOV

    R2,#10H

    ;循环次数赋值

    MOV

    A,#00H

    MOV

    R1,#30H

    LOOP3:MOV

    @R1,A

    INC

    R1

    INC

    A

    DJNZ

    R2,LOOP3

    ;计数值减1

    MOV

    R2,#10H

    ;循环次数重新赋值

    MOV

    DPTR,#1030H

    MOV

    R1,#30H

    ;赋值完成

    LOOP4:MOV

    A,@R1

    MOVX

    @DPTR,A

    INC

    R1

    INC

    DPTR

    DJNZ

    R2,LOOP4

    ;拷贝完成

    LJMP

    2000H

    END

    3、

    ORG

    2000H

    MAIN:MOV

    R2,#10H

    ;循环次数赋值

    MOV

    A,#00H

    MOV

    R1,#30H

    LOOP5:MOV

    @R1,A

    INC

    R1

    INC

    A

    DJNZ

    R2,LOOP5

    ;计数值减1

    MOV

    R2,#10H

    ;循环次数重新赋值

    MOV

    R1,#3FH

    MOV

    DPTR,#0000H

    CLR

    C

    LOOP6:MOV

    A,@R1

    MOVX

    @DPTR,A

    DEC

    R1

    ;减一,实现逆序

    INC

    DPTR

    DJNZ

    R2,LOOP6

    SJMP

    $

    END

    五、

    实验结果

    基础型

    1、

    2、

    X:3000H

    X:4000H

    设计型

    1、

    2、

    3、

    六、

    讨论心得

    这次实验主要熟悉了keil环境的使用,简单练习了循环语句、赋值语句、对外部存储器的读取与赋值等,比较基础,主要积累经验。开始认识到代码规范、注释的重要性,以后注意。

    实验二、数制与代码转换

    一、

    实验目的

    a)

    了解微机系统中的数制与代码表示方法;

    b)

    掌握计算机中使用的各种代码转换方法;

    c)

    掌握实现分支、循环的指令及其程序的编写方法;

    二、

    实验内容

    基础型实验内容

    1、

    以下程序完成单字节的ASCII码到十六进制数转换,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。

    2、

    以下程序完成单字节的BCD码到十六进制数转换,,在Keil环境运行程序,观察寄存器及内存单元的变化。

    3、

    以下程序将单字节十六进制数A的值转换为十进制数,存放在30H~32H中,完成空白处程序填写,并在Keil环境运行程序,观察寄存器及内存单元的变化。

    设计型实验内容

    1、

    设一串字母的ASCII存于30H起始的单元中,设计程序判断字母是否为大写字母,是则将大写字母的ASCII字符转换成小写字母的ASCII字符,为小写则不转换。

    2、

    将单字节十六进制数D8H转换为十进制数,存放在30H~33H中。,

    3、

    设计程序,将十六进制数614EH转换成ASCII码,使用单步、断点方式调试程序,查看结果。

    三、

    实验设备

    计算机一台

    四、

    实验代码

    基础型

    1、

    RESULT

    EQU

    30H

    ORG

    0000H

    MOV

    A,#41H;“A”的ASCII码

    CLR

    C

    SUBB

    A,#37H

    ;

    转换为十六进制

    A

    MOV

    RESULT,A

    LJMP

    1000H

    END

    2、

    RESULT

    EQU

    30H

    ORG

    1000H

    MOV

    A,#23H

    MOV

    R0,A

    ANL

    A,#0F0H

    SWAP

    A

    MOV

    B,#0AH

    MUL

    AB

    MOV

    RESULT,A

    ;转换高位

    MOV

    A,R0

    MOV

    B,#0FH

    ANL

    A,B

    ADD

    A,RESULT

    MOV

    RESULT,A

    ;

    转换低位

    LJMP

    2000H

    END

    3、

    RESULT

    EQU

    30H

    ORG

    2000H

    MOV

    A,#7BH

    MOV

    B,#64H

    DIV

    AB

    MOV

    RESULT,A

    ;除以100得百位数

    MOV

    A,B

    MOV

    B,#0AH

    DIV

    AB

    MOV

    RESULT+1,A

    ;除以10得十位数

    MOV

    RESULT+2,B

    ;余数为个位数

    SJMP

    $

    END

    设计型

    1、

    ORG

    0000H

    MOV

    R0,#30H

    MOV

    30H,#41H

    MOV

    31H,#42H

    MOV

    32H,#43H

    MOV

    33H,#61H

    MOV

    34H,#62H

    MOV

    35H,#63H

    L0:CJNE

    @R0,#0,SUB1

    LJMP

    1000H

    SUB1:

    ACALL

    HASC1

    INC

    R0

    LJMP

    L0

    ORG

    0200H;子程序:将大写字母ASCII码转换为小写字母ASCII码

    HASC1:

    CJNE

    @R0,#41H,L1

    ;与A的ASCII码比较

    MOV

    @R0,#61H

    RET

    L1:

    JC

    L2

    CJNE

    @R0,#56H,L3

    ;与Z的ASCII码比较

    MOV

    @R0,#75H

    RET

    L2:RET

    L3:JC

    L4

    RET

    L4:MOV

    A,@R0

    ;A与Z之间则转换为小写

    ADD

    A,#20H

    MOV

    @R0,A

    RET

    END

    2、

    RESULT

    EQU

    30H

    ORG

    1000H

    MOV

    A,#0D8H

    MOV

    B,#64H

    DIV

    AB

    MOV

    RESULT+1,A

    ;除以100得百位数

    MOV

    A,B

    MOV

    B,#0AH

    DIV

    AB

    MOV

    RESULT+2,A

    ;除以10得十位数

    MOV

    RESULT+3,B

    ;余数为个位数

    LJMP

    2000H

    END

    3、

    ORG

    2000H

    MOV

    30H,#61H

    MOV

    31H,#4EH

    MOV

    R1,#40H

    MOV

    R0,#30H

    MOV

    R2,#2

    L5:MOV

    A,@R0

    MOV

    B,#0F0H

    ANL

    A,B

    SWAP

    A

    ACALL

    HASC2

    INC

    R1

    MOV

    A,@R0

    MOV

    B,#0FH

    ANL

    A,B

    ACALL

    HASC2;调用子程序:将十六进制数转换为ASCII码

    INC

    R1

    INC

    R0

    DJNZ

    R2,L5

    SJMP

    $

    HASC2:

    CJNE

    A,#0AH,L6

    ;与A的十六进制数比较

    MOV

    @R1,#41H

    RET

    L6:JC

    L7

    ADD

    A,#37H

    ;0~9的数字加#37H

    MOV

    @R1,A

    RET

    L7:

    ADD

    A,#30H

    ;A~F的数字加#30H

    MOV

    @R1,A

    RET

    END

    五、

    实验结果

    基础型

    1、ASCII码41H为十六进制数0AH

    3、

    BCD码为23H的十六进制数为17H

    3、十六进制数7BH转换为十进制数为123

    设计型

    1、

    给30H及之后的地址赋值ABCabc的ASCII码

    将大写字母转换为小写字母

    2、将单字节十六进制数

    D8H

    转换为十进制数,存放在

    30H~33H

    3、十六进制数

    614EH存放在30H、31H,转换后的ASCII码在40H到43H

    六、

    讨论心得

    这次实验学习的内容主要是十六进制数、十进制BCD码、ASCII码之间的转换,以及子程序的书写与调用。对于判断是否为十六进制数、大小写字母,主要使用CJNE然后根据C的大小来判断比给定数大还是小,对于判断是否在一个区间需要使用两个CJNE来进行。

    10

    篇2:微机原理期末考试重点总结

    微机原理期末考试重点总结 本文关键词:微机,期末考试,原理,重点

    微机原理期末考试重点总结 本文简介:把寻找操作数的方式叫做(操作数)寻址方式立即数寻址方式寄存器寻址方式存储器寻址方式1、直接寻址方式2、寄存器间接寻址方式3、寄存器相对寻址方式4、基址变址寻址方式5、相对基址变址寻址方式微处理器的定义微处理器即中央处理单元,采用大规模集成电路技术制成的半导体芯片,内部集成了计算机的主要部件:控制器、

    微机原理期末考试重点总结 本文内容:

    把寻找操作数的方式叫做(操作数)寻址方式

    立即数寻址方式

    寄存器寻址方式

    存储器寻址方式

    1、直接寻址方式

    2、寄存器间接寻址方式

    3、寄存器相对寻址方式

    4、基址变址寻址方式

    5、相对基址变址寻址方式

    微处理器的定义

    微处理器即中央处理单元,采用大规模集成电路技术制成的半导体芯片,内部集成了计算机的主要部件:控制器、运算器、寄存器组。微处理器通过执行指令序列完成指定的操作,处理器能够执行全部指令的集合就是该处理器的指令系统。

    微机的总线结构的好处,使用特点。包括总线定义,分类。

    总线定义:指传递信息的一组公用导线,

    总线结构的好处:总线结构使得微机系统组态灵活,扩展方便。

    使用特点:在某个时刻只有一个总线主控设备控制系统总线。

    某一时刻只能有一个设备向总线发送信号,但可以有多个设备同时从总线上获取信号。

    总线按传输信号可以分为

    数据总线(用于CPU与其他部件之间传递信息,具有三态功能,且是双向的)、

    地址总线(用于传递CPU要访问的存储单元或I/O接口的地址信号)、

    控制总线(连接CPU的控制部件和内存、I/O设备等,用来控制内存和I/O设备的全部工作)

    冯×诺依曼存储程序工作原理

    1、

    将采取二进制形式表示数据和指令。指令由操作码和地址码组成

    2、

    将程序和数据存放在存储器中,计算机在工作时从存储器取出指令加以执行,自动完成计算任务。

    3、

    指令的执行是顺序的,即一般按照指令在存储器中存放的顺序执行,程序分支由转移指令实现。

    4、

    计算机由存储器、运算器、控制器、输入设备和输出设备五大基本部件组成,并规定了各部件的基本功能。

    8086微处理器的构成、每一个T状态的主要工作。基本的存储读、写总线周期构成。常用的控制信号。

    总线周期是指CPU通过总线与外部(存储器或I/O端口)进行一次数据交换的过程,即完成一次总线操作的时间

    指令周期是指一条指令经取指、译码、操作数读写直到指令完成所需要的时间。

    存储器读总线周期:T1状态——输出存储器的地址

    T2状态——输出控制信号-RD,选通存储器;DEN信号,选通数据收发器

    T3和Tw状态——检测数据传送是否能够完成

    T4状态——前沿读取数据,完成数据传送

    存储器写总线周期:T1状态——输出20位存储器地址A19~

    A0

    T2状态——

    -WR信号有效,-DEN信号有效以输出数据D7~D0

    T3和Tw状态——

    -WR、-DEN等控制信号持续有效,T3时钟下降沿检测READY信号,决定是否插入Tw;Tw期间,各信号延续状态。

    T4状态——完成数据传送,并准备过渡到下一操作。-WR、-DEN转为无效。

    常用的控制信号:

    ALE地址锁存允许,输出、三态、高电平有效

    IO/-M:I/O或存储器访问,输出、三态

    -WR:写控制,输出、三态、低电平有效

    -RD:读控制,输出、三态、低电平有效

    INTR、-INTA等

    存储器地址的译码问题

    全译码:

    所有的系统地址线均参与对存储单元的译码寻址

    特点:采用全译码,每个存储单元的地址都是唯一的,不存在地址重复

    译码电路可能比较复杂、连线也较多

    部分译码:

    只有部分(高位)地址线参与对存储芯片的译码

    特点:每个存储单元将对应多个地址(地址重复),需要选取一个可用地址

    可简化译码电路的设计、但系统的部分地址空间将被浪费

    存储芯片为什么要设置片选信号?它与系统地址总线有哪些连接方式?采用何种连接方式可避免地址重复?采用哪些连接方式可节省用于译码的硬件?

    解答:

    片选信号说明该存储器芯片是否被选中正常工作,设置它可以比较方便地实现多个存储器芯片组成大容量的存储空间

    存储器片选信号通常与CPU地址总线的高位地址线相关联,可以采用“全译码”、“部分译码”、“线选译码”方式

    采用全译码方式可以避免地址重复

    采用部分或线选译码可以节省译码硬件

    8086微处理器的内部结构,EU、BIU的定义和作用,流水线。

    BIU(总线接口单元):由指令队列、指令指针、段寄存器、地址加法器和总线控制逻辑构成。该单元管理着8088与系统总线的接口、负责CPU对存储器和外设进行访问。

    EU(执行单元):由ALU、通用寄存器、标志寄存器和指令译码逻辑等构成,它负责指令的译码、执行和数据的运算。

    两个单元相互独立,分别完成各自操作。两个单元可以并行执行,实现指令取指和执行的流水线操作

    8086的寻址方式。物理地址和逻辑地址的定义。两者之间转换。8086系统存储器采用分段管理方式。(要求很熟练)

    对于每个存储器单元都有一个唯一的20位地址,称为物理地址。

    在8088的总线内部和用户编程时,所采用的“段地址:偏移地址”形式,称为逻辑地址。

    一个存储器单元可以拥有多个逻辑地址,但可能拥有唯一的物理地址。

    转换过程:先将段寄存器提供的16位段地址左移四位,低位补0,恢复为20位地址,然后与由各种寻址方式提供的16位偏移地址相加,即得到20位的物理地址。

    8086微处理器的内部构成。8086的寄存器结构,标志寄存器中每一个标志位的含义及应用。8086复位时各寄存器的初始状态。

    内部构成:算术逻辑单元(运算器)、寄存器组、指令处理单元(控制器)

    寄存器结构:8086/8088共有8个的通用寄存器,1个标志寄存器,4个段寄存器和1个指令指针寄存器。

    进位标志

    CF:计算结果的最高有效位有进位,则CF=1,否则CF=0

    溢出标志

    OF:若算术运算的结果有溢出,则OF=1;否则

    OF=0

    全零标志位

    ZF:若运算结果为全0,则ZF=1,否则ZF=0

    符号标志

    CF:运算结果最高位为1,则SF=1;否则SF=0

    奇偶标志位

    PF:当运算结果最低字节中1的个数为零或偶数时,PF=1;否则PF=0(奇校验)

    辅助进位标志

    AF:运算时D3位(低半字节)有进位或借位时,AF=1;否则AF=0

    方向标志

    DF:存储地址自动增加,DF=1,否则DF=0

    中断允许标志:

    IF=1,则允许中断,IF=0,则禁止中断

    陷阱标志TF:

    TF=0,处理器正常工作;TF=1,处理器每执行一条指令就中断一次

    中断向量表。掌握中断向量表的构成,计算中断类型号,中断服务程序入口地址。中断的工作过程。

    中断向量表是一种表数据结构,是中断向量号与其对应的中断服务程序入口之间的链接表。该地址包括:偏移地址IP

    、段地址CS

    (共32位)

    每个中断向量的低字是偏移地址、高字是段地址,需占用4个字节(低对低,高对高)。

    8088

    微处理器从物理地址000H开始到3FFH(1KB),依次安排各个中断向量,向量号从0到255。256个中断向量所占用的1KB区域,称中断向量表

    中断向量的存放首址=N*4

    中断类型:

    8088

    CPU具有哪些中断类型?各种中断如何产生,如何得到中断向量号?

    除法错中断:在执行除法指令时,除数为0或商超过了寄存器所能表达的范围产生

    指令中断:在执行中断指令INT

    n时产生

    溢出中断:在执行溢出中断指令INTO时,溢出标志OF为1产生

    单步中断:单步标志TF为1,在每条指令执行结束后产生

    非屏蔽中断:外部通过NMI请求信号向微处理器提出请求时产生

    可屏蔽中断:外部通过INTR请求信号向微处理器提出请求,并在允许可屏蔽中断的条件下产生

    (2)除法错中断、溢出中断、单步中断、非屏蔽中断的向量号是8086微处理器内部已经确定

    指令中断的操作数n就是向量号

    可屏蔽中断的向量号在响应中断时通过数据总线从外部获得

    什么是8259A的中断结束字(EOI)?

    (1)IRi被响应时,ISR中对应的Di位被置1;

    (2)中断处理完毕,相应的Di位应置0。

    (3)向8259A送中断结束指令,使ISR的某位清0,指令的内容叫作中断结束字。

    8259A中IRR、IMR和ISR三个寄存器的含义

    中断请求寄存器IRR:

    保存8条外界中断请求信号IR0~IR7的请求状态

    Di位为1表示IRi引脚有中断请求;为0表示无请求

    中断屏蔽寄存器IMR:

    保存对中断请求信号IRi的屏蔽状态

    Di位为1表示IRi中断被屏蔽(禁止);为0表示允许

    中断服务寄存器ISR:

    保存正在被8259A处理的中断的状态

    Di位为1表示IRi中断正在处理中;为0表示没有被处理

    中断的概念。中断向量表的含义。深入理解8259的工作方式,优先权设置、中断结束处理、中断源屏蔽、中断触发等等。8259的初始化编程。中断服务程序编写。

    中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。

    优先权设置:在ISR的

    Di

    位置位期间,禁止再发生同级和低级优先权的中断,但允许高级优先权中断的嵌套

    中断结束处理:自动中断结束方式、普通中断结束方式、特殊中断结束方式;

    中断向量表的含义:256个中断向量所占用的1KB区域,称中断向量表

    计算机主机和I/O设备之间进行数据传送的方法。重点掌握查询方式完成数据传送的流程,要会编程。

    查询传送的特点是:工作可靠,适用面宽,但传送效率低

    查询输入接口(考电路):

    代码如下:

    mov

    dx,8000h

    ;dx指向状态端口

    Status:

    in

    al,dx

    ;读状态端口

    test

    al,01h

    ;测试标志位D0

    jz

    status

    ;D0=0,未就绪,继续查询

    inc

    dx

    ;D0=1,就绪,DX指向数据端口

    in

    al,dx

    ;从数据端口输入数据

    中断传送:

    中断传送是一种效率更高的程序传送方式;

    中断过程的完成由中断系统(硬件,如8259和CPU)和中断服务程序(软件)共同控制完成

    中断工作过程:

    1、

    中断请求(外设)

    2、中断响应(CPU)

    3、关中断(CPU)

    4、断点保护(CPU)

    5、中断识别(软件/硬件)

    6、现场保护(用户)

    7、中断服务(用户)

    8、恢复现场(用户)

    9、开中断(用户/CPU)

    10、中断返回(IRET/用户)

    最小组态的写总线周期时序:

    如何限制只能输入小写字母(

    61h~7Ah,课本P22),否则要求重新输入。

    .data

    msg

    db

    not

    a

    lowercase,input

    again,db0dh,0ah,$

    input:mov

    ah,1;输入小写字母

    int

    21h

    cmp

    al,61h

    jl

    once-again

    cmp

    al,7Ah

    ja

    once-again

    jmp

    convert

    once-again:

    mov

    dx,offset

    msg

    mov

    ah,9

    int

    21h

    jmp

    input

    convert:sub

    al,20h

    ;转换为大写字母

    ……

    采用查表法,实现一位16进制数转换为ASCII码显示

    04h——34h(4)

    0bh——42h(B)

    ASCIIdb

    30h,31h,32h,33h,34h,35h,36h,37h,38h,39h

    ;对应0

    ~

    9的ASCII码

    db

    41h,42h,43h,44h,45h,46h

    ;对应A

    ~

    F的ASCII码

    hexdb

    04h,0bh

    ;假设两个16进制数

    ;代码段

    mov

    bx,offset

    ASCII

    ;BX指向ASCII码表

    mov

    al,hex

    ;AL取得一位16进制数;恰好就是ASCII码表中的位移

    and

    al,0fh

    ;只有低4位是有效的,高4位清0

    xlat

    ;换码:AL←DS:[BX+AL]

    mov

    dl,al;欲显示的ASCII码送DL

    mov

    ah,2;2号DOS功能调用

    int

    21h;显示一个ASCII码字符

    mov

    al,hex+1;转换并显示下一个数据

    and

    al,0fh

    xlat

    mov

    dl,al

    mov

    ah,2

    int

    21h

    编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。(可调用书中的HTOASC子程序)

    HTOASCproc

    and

    al,0fh

    ;al低四位保存待转;换的16进制数

    cmp

    al,9

    jbe

    htoasc1

    add

    al,37h

    ;是A

    ~

    F,加37H

    ret

    ;子程序返回

    htoasc1:add

    al,30h

    ;0

    ~

    9,加30H

    ret

    ;子程序返回

    HTOASCendp

    push

    ax

    mov

    cl,4

    ror

    al,cl

    call

    HTOASC

    call

    disp_a_char

    pop

    ax

    call

    HTOASC

    call

    disp_a_char

    把从键盘输入的一个小写字母用大写字母显示出来(大小写字母转换)。

    mov

    ah,1;输入小写字母

    int

    21h

    sub

    al,20h;转换为大写字母

    mov

    dl,al

    mov

    ah,2

    int

    21h;显示

    写一个子程序,根据入口参数AL=0、1、2,依次实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。

    lucaseproc

    push

    bx

    mov

    bx,offset

    string

    cmp

    al,0

    je

    case0

    cmp

    al,1

    jz

    case1

    cmp

    al,2

    jz

    case2

    jmp

    done

    case0:cmp

    byte

    ptr

    [bx],0

    je

    done

    cmp

    byte

    ptr

    [bx],’A’

    jb

    next0

    cmp

    byte

    ptr

    [bx],’Z’

    ja

    next0

    add

    byte

    ptr

    [bx],20h

    next0:inc

    bx

    jmp

    case0

    case1:cmp

    byte

    ptr

    [bx],0

    je

    done

    cmp

    byte

    ptr

    [bx],’a’

    jb

    next1

    cmp

    byte

    ptr

    [bx],’z’

    ja

    next1

    sub

    byte

    ptr

    [bx],20h

    next1:inc

    bx

    jmp

    case1

    case2:cmp

    byte

    ptr

    [bx],0

    je

    done

    cmp

    byte

    ptr

    [bx],’A’

    jb

    next2

    cmp

    byte

    ptr

    [bx],’Z’

    ja

    next20

    add

    byte

    ptr

    [bx],20h

    jmp

    next2

    next20:cmp

    byte

    ptr

    [bx],’a’

    jb

    next2

    cmp

    byte

    ptr

    [bx],’z’

    ja

    next2

    sub

    byte

    ptr

    [bx],20h

    next2:inc

    bx

    jmp

    case2

    done:pop

    bx

    ret

    lucaseendp

    循环累加(调用子程序)

    arraydb

    12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h

    countequ

    $-array;数组元素个数

    resultdb

    ?;校验和;代码段(主程序)

    mov

    bx,offset

    array;BX←数组的偏移地址

    mov

    cx,count;CX←数组的元素个数

    call

    checksum;调用求和过程

    mov

    result,al;处理出口参数

    checksumproc

    xor

    al,al;累加器清0

    sum:add

    al,[bx];求和

    inc

    bx;指向下一个字节

    loop

    sum

    Ret

    Checksum

    endp

    计算AX中有符号数的绝对值

    cmp

    ax,0

    jge

    nonneg;条件满足(AX≥0),转移

    neg

    ax;条件不满足,求补(即绝对值P43)

    nonneg:

    mov

    result,ax;保存结果;不恰当的分支

    cmp

    ax,0

    jl

    yesneg;条件满足(AX<0),转移

    jmp

    nonneg

    yesneg:neg

    ax;条件满足,求补

    nonneg:mov

    result,ax;保存结果

    设置两个变量maxay和minay存放最大和最小值

    arraydw

    10

    dw

    -3,0,20,900,587,-632,777,234,-34,-56

    maxaydw

    ?;存放最大值

    minaydw

    ?;存放最小值

    lea

    si,array

    mov

    cx,[si];取得元素个数

    dec

    cx;减1后是循环次数

    add

    si,2

    mov

    ax,[si]

    mov

    bx,ax

    maxck:add

    si,2

    cmp

    [si],ax;与下一个数据比较

    jle

    minck

    mov

    ax,[si];AX取得更大的数据

    jmp

    next

    minck:cmp

    [si],bx

    jge

    next

    mov

    bx,[si];BX取得更小的数据

    next:loop

    maxck;计数循环

    mov

    maxay,ax;保存最大值

    mov

    minay,bx;保存最小值

    挑出数组中正数(不含0)和负数,分别形成正、负数组

    DATAS

    SEGMENT

    count

    equ

    10

    array

    dw

    23h,9801h…

    ayplus

    dw

    count

    dup(0)

    ayminus

    dw

    count

    dup(0)

    DATAS

    ENDS

    STACKS

    SEGMENT

    STACKS

    ENDS

    CODES

    SEGMENT

    ASSUME

    CS:CODES,DS:DATAS,SS:STACKS

    START:

    MOV

    AX,DATAS

    MOV

    DS,AX

    mov

    si,offset

    array

    mov

    di,offset

    ayplus

    mov

    bx,offset

    ayminus

    mov

    ax,ds

    mov

    es,ax

    mov

    cx,count

    cld

    again:

    lodsw

    cmp

    ax,0

    jl

    minus

    jz

    next

    minus:

    xchg

    bx,di

    stosw

    xchg

    bx,di

    next:

    loop

    again

    MOV

    AH,4CH

    INT

    21H

    CODES

    ENDS

    END

    START

    8259A

    的初始化程序段(7.8)

    mov

    al,13H

    ;写入ICW1:设定边沿触发方式,单片方式

    mov

    dx,0FFDCH

    out

    dx,al

    jmp

    intr1

    intr1:mov

    al,90H

    ;写入ICW2:设定IR0的中断向量号为90h

    mov

    dx,0FFDEH

    out

    dx,al

    jmp

    intr2

    intr2:mov

    al,1

    ;写入ICW4:设定普通嵌套方式,普通中断方式

    mov

    dx,0FFDEH

    out

    dx,al

    8259的初始化编程:

    主片:

    mov

    al,11h;写入ICW1

    out

    20h,al

    intr1:mov

    al,08h;写入ICW2

    out

    21h,al

    intr2:mov

    al,04h;写入ICW3

    out

    21h,al

    intr3:mov

    al,05h;写入ICW4

    out

    21h,al

    从片:

    mov

    al,11h;写入ICW1

    out

    0a0h,al

    intr5:mov

    al,70h;写入ICW2

    out

    0a1h,al

    intr6:mov

    al,02h;写入ICW3

    out

    0a1h,al

    intr7:mov

    al,01h;写入ICW4

    out

    0a1h,al

    试按如下要求分别编写8253的初始化程序,已知8253的计数器0~2和控制字I/O地址依次为204H~207H。⑶

    使计数器2工作在方式2,计数值为02F0H。

    mov

    al,0b4h

    mov

    dx,207h

    out

    dx,al

    mov

    ax,02f0h

    mov

    dx,206h

    out

    dx,al

    ;先写入低字节

    mov

    al,ah

    out

    dx,al

    ;后写入高字节

    8255的初始化编程

    要求:A口:方式1输入、CH口:输出、CL口:输入、B口:方式0输出

    方式控制字:1

    0110

    001

    B或B1H

    初始化的程序段:

    mov

    dx,0fffeh;假设控制端口为FFFEH

    mov

    al,0b1h;方式控制字

    out

    dx,al;送到控制端口

    某系统中8253芯片中计数器的0-2和控制字端口地址分别是FFF0H~FFF3H。

    编写8253两个计数器初始化程序及两个计数器的连通图。

    计数器0的计数值:5M/1K=5000=1388H

    方式控制字:00100101=25H、2DH、35H、3DH

    (十进制计数)

    00100100=24H、2CH、34H、3CH

    (二进制计数)

    计数器1的计数值:1000

    方式控制字:01101001=69H、79H

    (十进制计数)

    01101000=68H、78H

    (二进制计数)

    MOV

    DX,0FFF3H

    MOV

    AL,25H

    ;通道0,只写高字节,方式2,十进制

    OUT

    DX,AL

    MOV

    DX,0FFF0H

    MOV

    AL,50H

    ;计数初值5000

    OUT

    DX,AL

    MOV

    DX,0FFF3H

    MOV

    AL,69H

    ;通道1,方式4

    OUT

    DX,AL

    MOV

    DX,0FFF1H

    MOV

    AL,10H

    ;计数初值1000

    OUT

    DX,AL

    3、某字符输出设备(如打印机),其数据口和状态口的地址均为80H。在读取状态时,当标志位D7=0时,表明该设备闲,可以接收一个字符,请编写利用查询方式进行数据传送的程序段。要求将存放于符号地址addr处的一串字符(以$为结束标志)输出给该设备。

    mov

    bx,offset

    addr

    ;利用offset操作符,可在汇编过程中得到addr的偏移地址

    again:mov

    ah,[bx]

    cmp

    ah,’$’

    jz

    done

    status:in

    al,80h

    ;查询一次

    test

    al,80h

    ;两个80h不一样

    jnz

    status

    ;D7=1,表示设备忙,继续查询

    mov

    al,ah

    out

    80h,al

    ;输出一个字节

    inc

    bx

    jmp

    again

    ;循环

    done:……

    如图10.23为用一片8255A控制8个8段共阴极LED数码管的电路。现要求按下某个开关,其代表的数字(K1为1,K2为2,…K8为8)在数码管从左到右循环显示(已有一个延时子程序delay可以调用),直到按下另一个开关。假定8255A的数据端口A、B、C及控制端口的地址依次为FFF8H~FFFBH。编写完成上述功能的程序,应包括8255A的初始化、控制程序和数码管的显示代码表

    ;显示代码表

    tabledb

    0c0h;对应0(任意)

    db

    0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h

    ;对应1~8

    ;8255A初始化

    mov

    dx,0fffbh

    mov

    al,10001001b;=89h

    out

    dx,al

    ;控制程序

    again0:mov

    dx,0fffah;输入开关状态

    in

    al,dx

    mov

    cx,8;确定哪个开关闭合

    mov

    ah,01h;mov

    ah,08h

    again1:shr

    al,1;shl

    al,1

    jnc

    disp0

    inc

    ah;dec

    ah

    loop

    again1

    jmp

    disp1;显示字段

    disp0:mov

    bx,offset

    table

    mov

    al,ah

    xlat

    mov

    dx,0fff8h

    out

    dx,al;输出段码

    disp1:mov

    cx,8;循环显示8位

    mov

    al,01h

    mov

    dx,0fff9h

    disp2:out

    dx,al;输出位码

    call

    delay

    shl

    al,1

    loop

    disp2

    jmp

    again0;写入方式字

    mov

    al,100×00×1b;=81h

    mov

    dx,控制口地址;0fffeh

    out

    dx,al;加入下一段更好,使L0~L3全亮

    mov

    al,0fh

    mov

    dx,端口C地址;0fffch

    out

    dx,al;控制程序段

    mov

    dx,端口C地址;0fffch

    in

    al,dx;读入PC0~PC3

    mov

    cl,4shl

    al,cl;左移4位

    out

    dx,al;控制PC4~PC7

    以8255的B口作输入口、连接逻辑电平开关;以8255的A口作输出口、连接发光二极管电路。要求:当输入不是全0时,输出与输入保持一致(即高电平时点亮);当输入是全0时,令发光二极管循环点亮(或闪烁告警)。

    begin:

    mov

    dx,portc

    ;

    8255

    初始化

    mov

    al,82h

    A组方式0,A口出,

    B组方式0,B口入

    out

    dx,al

    mov

    ah,0ffh

    mov

    bl,0

    lp:

    mov

    dx,portb

    ;

    B

    口读入开关状态

    in

    al,dx

    test

    al,ah

    ;与ffh比较,看是否8个开关全闭合(0信号)

    jz

    shift

    mov

    dx,porta

    ;

    A

    口输出开关状态

    not

    al

    out

    dx,al

    jmp

    lp

    shift:

    mov

    al,bl

    ;bl初值为0

    mov

    dx,porta

    not

    al

    out

    dx,al

    call

    delay

    ;

    延时

    shl

    bl,1

    ;

    移位

    test

    bl,ah

    ;ah初值为ffh

    jnz

    lp

    mov

    bl,1

    jmp

    lp

    2、如果有一个输入设备,其数据口地址为FFE0H,状态口地址为FFE2H,当状态标志D0=1时,表明一个字节的输入数据就绪,请编写利用查询方式进行数据传送的程序段。要求从该设备读取100个字节并写到从2000H:2000H开始的内存中。

    通过读取状态寄存器的标志位来检查外设是否就绪。若不就绪就继续查询,即程序不断循环;直至就绪。然后,进行下一步的传送工作。

    mov

    bx,2000h

    mov

    ds,bx

    mov

    cx,100

    again:mov

    dx,0ffe2h

    status:in

    al,dx

    ;读入状态标志D0

    test

    al,01h

    ;al

    输入一个字节

    mov

    [bx],al

    ;al→ds:[bx],寄存器间接寻址

    inc

    bx

    查询方式完成数据传送。

    1、编程实现以下功能:当K0键单独按下时,发光二极管L0~L7将流水点亮(Ln→Ln+1),每个维持200ms;当K1键单独按下时,发光二极管L0~L7将反向流水点亮(Ln←Ln+1),每个也维持200ms;在其他情况下各发光二极管均不点亮。假定有延时200ms的子程序DELAY可直接调用。

    again:

    mov

    dx,8000h

    ;8000h是I/O端口地址

    in

    al,dx

    ;读入端口数据

    not

    al

    ;开关闭合,读入数据是0;反相,保证如图二极管点亮;

    cmp

    al,1

    ;K7~K0=11111110B

    ?或al=00000001B?

    je

    l1

    ;单独按下K0,转移到l1

    cmp

    al,2

    je

    l2

    ;单独按下K1,转移到l2

    jmp

    again

    ;其它情况,都不亮

    l1:

    mov

    cx,8

    ;计数器设为8

    mov

    al,1

    l11:

    out

    dx,al

    ;点亮一个LED

    call

    delay

    ;调用延时子程序,点亮状态保持200ms

    rol

    al,1

    ;循环左移(shl行吗?)

    loop

    l11

    ;循环直到cx减到0为止

    jmp

    again

    ;转到起点,继续查询端口变动

    l2:

    mov

    cx,8

    ;计数器设为8

    mov

    al,1

    l21:

    out

    dx,al

    ;点亮一个LED

    call

    delay

    ;调用延时子程序,点亮状态保持200ms

    ror

    al,1

    loop

    l21

    ;

    jmp

    again

    delay

    proc

    mov

    cx,0bfffh

    ;延时200ms。0bffh=3071(D),

    loop

    $

    ;延时时间=49151*33

    (时钟周期)/8000000(CPU工作频率)≈200ms

    delay

    endp

    loop

    again

    ;循环,输入100个字节

    4、按照图6-14所示的中断查询接口与相应的流程图,请编写用于中断服务的程序段。具体要求是,当程序查到中断设备A有中断请求(对应数据线D0),它将调用名为PROC0的子程序;如此,依次去查中断设备B~中断设备D,并分别调用名为PROC1~PROC3的子程序。

    sti

    ;开中断

    push

    ax

    push

    dx

    ……

    mov

    dx,8001h

    ;接口地址是8001h

    status:in

    al,dx

    test

    al,01h

    jnz

    service0

    test

    al,02h

    jnz

    service1

    test

    al,04h

    jnz

    service2

    test

    al,08h

    jnz

    service3

    ……

    service0:call

    proc0

    jmp

    done

    service1:call

    proc1

    jmp

    done

    service2:call

    proc2

    jmp

    done

    service3:call

    proc3

    jmp

    done

    ……

    done:pop

    dx

    pop

    ax

    iret

    ;中断返回

    15

    篇3:北京邮电大学微机原理硬件实验报告

    北京邮电大学微机原理硬件实验报告 本文关键词:微机,北京,邮电大学,原理,实验

    北京邮电大学微机原理硬件实验报告 本文简介:实验报告一:I/0地址译码和简单并行接口——实验一点亮灯CALLDELAY;延时MOVDX,2A8HOUTDX,AL;熄灭灯CALLDELAYJMPLOPCODEENDSENDSTARTDELAYPROCNEAR;延时子程序PUSHCXPUSHBXMOVBX,250;250×65535LP2:MOV

    北京邮电大学微机原理硬件实验报告 本文内容:

    实验报告一:I/0地址译码和简单并行接口

    ——实验一点亮灯

    CALL

    DELAY

    ;延时

    MOV

    DX,2A8H

    OUT

    DX,AL

    ;熄灭灯

    CALL

    DELAY

    JMP

    LOP

    CODE

    ENDS

    END

    START

    DELAY

    PROC

    NEAR

    ;延时子程序

    PUSH

    CX

    PUSH

    BX

    MOV

    BX,250

    ;250×65535

    LP2:

    MOV

    CX,0FFFFH

    LP1:

    LOOP

    LP1

    DEC

    BX

    JNZ

    LP2

    POP

    BX

    POP

    CX

    RET

    DELAY

    ENDP

    2、简单并行接口电路

    STACK

    SEGMENT

    STACK

    STACK

    DB

    100

    DUP(?)

    STACK

    ENDS

    DATA

    SEGMENT

    DATA

    ENDS

    CODE

    SEGMENT

    ASSUME

    CS:CODE,SS:STACK,DS:DATA

    START:MOV

    AX,DATA

    MOV

    DS,AX

    LOP:

    MOV

    AH,01H

    INT

    21H

    CMP

    AL,1BH

    ;检查是否按下退出esc键

    JZ

    ENDING

    MOV

    DX,2A8H

    ;将ascii码输出

    OUT

    DX,AL

    JMP

    LOP

    ENDING:MOV

    AL,0

    OUT

    DX,AL

    MOV

    AX,4C00H

    INT

    21H

    CODE

    ENDS

    END

    START

    六、

    实验总结

    在这三次实验中出现的问题以及相应的解决方法如下:

    实验一:因为对D触发器的特性有些遗忘,在编写程序时犯了不少错误,最终通过请教助教解决了一些疑问,从而顺利写出了代码。

    实验二:实验二的程序逻辑比较简单,但连线比较多,在实验过程中,也多次连错了线,通过检查纠正了连线错误,也很快完成了实验。

    七、

    实验收获与心得体会

    这次实验是第一次用汇编语言控制接口,因为理论课尚未讲到相关内容,做实验时,上手地比较慢。通过实验一实验二,熟练了对IN、OUT指令的使用,对接口有了初步认识。同时通过研究译码电路,对“地址”也有了进一步的认识。

    实验报告二:可编程并行接口8255的应用

    ——实验三A口输出C口输入,工作方式为00

    MOV

    DX,28BH

    ;控制端口地址

    OUT

    DX,AL

    ;8255初始化,写入工作方式控制字

    LOP:

    MOV

    DX,28AH

    ;将开关状态读入

    IN

    AL,DX

    MOV

    DX,288H

    ;讲状态输出到A口

    OUT

    DX,AL

    MOV

    AH,0BH

    ;检测键盘状态

    INT

    21H

    CMP

    AL,0FFH

    ;如果键盘上有输入则停止程序

    JZ

    ENDING

    JMP

    LOP

    ENDING:MOV

    AL,0

    MOV

    DX,288H

    OUT

    DX,AL

    MOV

    AX,4C00H

    INT

    21H

    CODE

    ENDS

    END

    START

    b)

    实验四

    STACK

    SEGMENT

    STACK

    STACK

    DB

    100

    DUP(?)

    STACK

    ENDS

    DATA

    SEGMENT

    DATA

    ENDS

    CODE

    SEGMENT

    ASSUME

    CS:CODE,SS:STACK,DS:DATA

    START:MOV

    AX,DATA

    MOV

    DS,AX

    MOV

    AL,10000000B

    MOV

    DX,28BH

    OUT

    DX,AL;8255初始化

    LOP:

    MOV

    AL,3FH;

    将0的段码输出给A口

    MOV

    DX,288H

    OUT

    DX,AL

    MOV

    AL,08H;输出位码给C口

    MOV

    DX,28AH

    OUT

    DX,AL

    CALL

    DELAY;延时程序

    MOV

    AL,06H

    ;将1的段码输出的A口

    MOV

    DX,288H

    OUT

    DX,AL

    MOV

    AL,04H

    ;输出选通位码

    MOV

    DX,28AH

    OUT

    DX,AL

    CALL

    DELAY

    MOV

    AL,7FH

    ;将8的段码输出的A口

    MOV

    DX,288H

    OUT

    DX,AL

    MOV

    AL,02H;输出选通位码

    MOV

    DX,28AH

    OUT

    DX,AL

    CALL

    DELAY

    MOV

    AL,06H;将8的段码输出的A口

    MOV

    DX,288H

    OUT

    DX,AL

    MOV

    AL,01H

    ;输出选通位码

    MOV

    DX,28AH

    OUT

    DX,AL

    call

    DELAY

    MOV

    AH,0BH

    ;检查键盘是否有输入

    INT

    21H

    CMP

    AL,0ffh

    JZ

    ENDING

    ;有则退出

    JMP

    LOP

    ENDING:

    MOV

    AL,00H

    MOV

    DX,28AH

    OUT

    DX,AL

    MOV

    AX,4C00H

    INT

    21H

    DELAY

    PROC

    NEAR

    PUSH

    CX

    PUSH

    BX

    MOV

    BX,005H

    ;250×65535

    LP2:

    MOV

    CX,0fFFFH

    LP1:

    LOOP

    LP1

    DEC

    BX

    JNZ

    LP2

    POP

    BX

    POP

    CX

    RET

    DELAY

    ENDP

    CODE

    ENDS

    END

    START

    c)

    实验五

    STACK

    SEGMENT

    STACK

    STACK

    DB

    100

    DUP(?)

    STACK

    ENDS

    DATA

    SEGMENT

    KEYVALUE

    DB

    71H,7CH,07H,4FH

    ;键盘值对应的段码表,LINE0

    DB

    79H,77H,7DH,5BH

    ;LINE1

    DB

    5EH,6FH,6DH,06H

    ;LINE2

    DB

    39H,7FH,66H,3FH

    ;LINE3

    ROW

    DB

    0EFH,0DFH,0BFH,7FH

    DATA

    ENDS

    CODE

    SEGMENT

    ASSUME

    CS:CODE,SS:STACK,DS:DATA

    START:MOV

    AX,DATA

    MOV

    DS,AX

    MOV

    AL,10000001B;C口高4位接键盘行输出,低4位列输入,A口输出

    MOV

    DX,28BH

    OUT

    DX,AL

    LEA

    BX,KEYVALUE

    MOV

    SI,0

    SCANROW:MOV

    AL,ROW[SI]

    ;扫描行

    MOV

    DX,28AH

    OUT

    DX,AL

    ;输出行

    CALL

    DELAY

    ;延迟消抖

    IN

    AL,DX

    ;读取列

    AND

    AL,0FH

    CMP

    AL,0FH

    JZ

    NEXT

    ;此行无键按下

    CMP

    AL,0EH

    JZ

    LINE0

    ;按下第0列的键

    CMP

    AL,0DH

    JZ

    LINE1;按下第1列的键

    CMP

    AL,0BH

    JZ

    LINE2;按下第2列的键

    JMP

    LINE3

    NEXT:

    INC

    SI

    CMP

    SI,4

    JB

    NEXT1

    MOV

    SI,0

    NEXT1:JMP

    SCANROW

    LINE0:MOV

    CL,[BX+SI+0];查表或许按下的键相应的输出段码

    JMP

    OUTPUT

    LINE1:MOV

    CL,[BX+SI+4]

    JMP

    OUTPUT

    LINE2:MOV

    CL,[BX+SI+8]

    JMP

    OUTPUT

    LINE3:MOV

    CL,[BX+SI+12]

    OUTPUT:CMP

    CL,3FH

    ;检查是否是0,是0就退出

    JZ

    ENDING

    MOV

    AL,CL

    MOV

    DX,288H

    ;传送段码给A口

    OUT

    DX,AL

    MOV

    AL,01H

    ;传送位码给B口

    MOV

    DX,289H

    OUT

    DX,AL

    MOV

    SI,0

    JMP

    SCANROW

    ;继续扫描

    ENDING:MOV

    AL,00

    MOV

    DX,289H

    OUT

    DX,AL

    MOV

    AX,4C00H

    INT

    21H

    DELAY

    PROC

    NEAR

    PUSH

    CX

    PUSH

    BX

    MOV

    BX,1

    ;250×65535

    LP2:

    MOV

    CX,0FFFH

    LP1:

    LOOP

    LP1

    DEC

    BX

    JNZ

    LP2

    POP

    BX

    POP

    CX

    RET

    DELAY

    ENDP

    CODE

    ENDS

    END

    START

    六、

    实验总结

    在这三次实验中出现的问题以及相应的解决方法如下:

    实验三:一开始没法用开关控制LED的亮灭,程序一运行就直接退出了,检查代码发现自己的退出条件写错了,修改后就能正常工作了。

    实验四:四个数码管显示不正常,四个数字都没法稳定的显示,经过调整延时的大小,能够使后两个数码管正常显示,但前两个数码管不受控制,最后发现是前两个数码管坏了。

    实验五:按下的键与数码管中显示的图形不一样,经过检查代码和实验箱,发现代码中按键对应的段码表行列顺序与实验箱不一致,经过调整,解决了不一致的问题。

    七、

    实验收获与心得体会

    这三次实验都是围绕着8255并行接口做一些小的应用,其中实验三与实验四逻辑比较简单,实验五稍微难一点,因为理论课还未讲到接口部分,硬件实验需要自己自学接口电路,但从中收获了不少知识,大致明白了如何使用一个接口芯片,学会了自己看手册,根据说明来编程使用接口电路,对地址有了更深刻的理解。

    代码都是实验前自己课下独立编写的,因此上实验室操作时比较顺利,但也遇到了一些小错误,但也都独立解决了,在这样的一个过程中,增强了自己的学习能力和独立解决问题的能力。

    实验报告三:可编程定时器/计数器(8253/8254)

    一、实验目的

    学习掌握8253用作定时器的编程原理;

    二、实验原理及内容

    (1)8253应用小结

    8253和8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。8254是8253的改进型。

    1.8253初始化

    使用8253前,要进行初始化编程。初始化编程的步骤是:

    向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。

    向使用的计数器端口写入计数初值。

    2.8253控制字

    D7D6=00:使用0号计数器,D7D6=01:使用1号计数器

    D7D6=10:使用2号计数器,D7D6=11:无效

    D5D4=00:锁存当前计数值

    D5D4=01:只写低8位(高8位为0),读出时只读低8位

    D5D4=10:只写高8位(低8位为0),读出时只读高8位

    D5D4=11:先读/写低8位,后读/写高8位计数值

    D3D2D1=000:选择方式0,D3D2D1=001:选择方式1

    D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3

    D3D2D1=100:选择方式4,D3D2D1=101:选择方式5

    D0=0:计数初值为二进制,D0=1:计数初值为BCD码数

    (2)实验电路

    1、按图4-8-1虚线连接电路

    2、接线:

    CS

    /8253

    Y0

    /IO

    地址

    GATE0

    /8253

    +5V

    CLK0

    /8253

    1M时钟

    OUT0

    /8253

    喇叭或蜂鸣器

    (3)实验内容

    1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。

    2.扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。

    注意:8253输入频率应小于2MHz。

    三、硬件连线图

    四、软件流程图

    1、主程序流程

    2、

    放音子程序流程

    3、

    弹琴子程序流程

    4、

    五、源程序

    STACK

    SEGMENT

    STACK

    STACK

    DB

    100

    DUP(?)

    STACK

    ENDS

    DATA

    SEGMENT

    INPUTINFO

    DB

    0AH,0DH,Please

    choose

    mode:1

    is

    playing

    music;2

    is

    spieling,0AH,0DH

    DB

    $

    ERROR_INFO

    DB

    0AH,0DH,illegal

    input,please

    input

    again!,0AH,0DH,$

    TONE

    DW

    3906,3472,3125,2932,2604,2347,2083

    ;音调1-7

    计数初始值

    TIME

    DW

    1000H,1000H,1000H,2000H,2000H,4000H,4000H

    ;持续时间

    DUANMA

    DB

    06H,5BH,4FH,66H,6DH,7DH,07H

    ;与乐谱所对应的数码管段码

    KEYVALUE

    DB

    71H,7CH,07H,4FH

    ;键盘值对应的段码表,LINE0

    DB

    79H,77H,7DH,5BH

    ;LINE1

    DB

    5EH,6FH,6DH,06H

    ;LINE2

    DB

    39H,7FH,66H,3FH

    ;LINE3

    TUNEK

    DW

    0,0,2083,3125

    DW

    0,0,2347,3472

    DW

    0,0,2604,3906

    DW

    0,0,2932,0

    ROW

    DB

    0EFH,0DFH,0BFH,7FH

    DATA

    ENDS

    CODE

    SEGMENT

    ASSUME

    CS:CODE,SS:STACK,DS:DATA

    START:MOV

    AX,DATA

    MOV

    DS,AX

    MOV

    AL,10000001B;8255初始化;C口高4位接键盘行输出,低4位列输入,A口输出

    MOV

    DX,28BH

    OUT

    DX,AL

    MOV

    AL,00110110B

    ;8253初始化,工作方式3,使用计时器0

    MOV

    DX,283H

    OUT

    DX,AL

    BEGIN:MOV

    AH,09H

    ;输入提醒,选择放音或弹琴模式或者退出程序

    LEA

    DX,INPUTINFO

    INT

    21H

    MOV

    AH,01H

    INT

    21H

    CMP

    AL,1

    JZ

    PLAY_MUSIC

    CMP

    AL,2

    JZ

    SPIELING

    CMP

    AL,1BH

    JZ

    ENDING

    JMP

    INPUT_ERROR

    ;输入检错

    INPUT_ERROR:MOV

    AH,09H

    LEA

    DX,ERROR_INFO

    INT

    21H

    JMP

    BEGIN

    PLAY_MUSIC:CALL

    PLAYMUSIC

    JMP

    BEGIN

    SPIELING:CALL

    SPIELINGP

    JMP

    BEGIN

    ENDING:

    MOV

    AX,4C00H

    INT

    21H

    PLAYMUSIC

    PROC

    PUSH

    SI

    ;保护现场数据

    PUSH

    DI

    PUSH

    AX

    PUSH

    BX

    PUSH

    CX

    PUSH

    DX

    LEA

    SI,TONE

    ;音调表

    LEA

    DI,TIME

    ;每一个音调持续时间表

    LEA

    BX,DUANMA;段码表

    MOV

    CX,7

    ;循环控制变量赋值

    LOP1:

    MOV

    AX,[SI]

    ;计数器赋值

    MOV

    DX,280H;

    计时器0的地址

    OUT

    DX,AL

    ;先写入低八位,再写入高八位

    MOV

    AL,AH

    OUT

    DX,AL

    INC

    SI

    INC

    SI

    MOV

    AL,[BX]

    ;在数码管上显示乐谱

    MOV

    DX,288H

    ;8255A口地址

    OUT

    DX,AL

    INC

    BX

    MOV

    AL,01H

    ;传送位码给B口

    MOV

    DX,289H

    OUT

    DX,AL

    MOV

    AX,[DI];延迟,AX为入口参数

    CALL

    DELAY

    INC

    DI

    INC

    DI

    MOV

    AH,0BH

    ;检测键盘是否有输入,有则跳出

    INT

    21H

    CMP

    AL,0FFH

    JZ

    POUT

    LOOP

    LOP1

    LEA

    SI,TONE

    LEA

    DI,TIME

    LEA

    BX,DUANMA

    MOV

    CX,7

    ;重新循环

    JMP

    LOP1

    POUT:

    POP

    DX

    POP

    CX

    POP

    BX

    POP

    AX

    POP

    DI

    POP

    SI

    RET

    PLAYMUSIC

    ENDP

    SPIELINGP

    PROC

    PUSH

    AX

    PUSH

    BX

    PUSH

    CX

    PUSH

    DX

    PUSH

    BP

    PUSH

    SI

    PUSH

    DI

    LEA

    BX,KEYVALUE

    LEA

    BP,TUNEK

    MOV

    SI,2;只扫描2,3行(0123

    4567)

    SCANROW:MOV

    AL,ROW[SI]

    ;扫描行

    MOV

    DX,28AH

    OUT

    DX,AL

    ;输出行

    PUSH

    AX

    MOV

    AX,1

    CALL

    DELAY

    ;延迟消抖

    POP

    AX

    IN

    AL,DX

    ;读取列

    AND

    AL,0FH

    CMP

    AL,0FH

    JZ

    NEXT

    ;此行无键按下

    CMP

    AL,0EH

    JZ

    LINE0

    CMP

    AL,0DH

    JZ

    LINE1

    CMP

    AL,0BH

    JZ

    LINE2

    JMP

    LINE3

    NEXT:

    MOV

    AL,36H

    ;键盘弹起,对8253重新初始化,是蜂鸣器停止发音

    MOV

    DX,283H

    OUT

    DX,AL

    INC

    SI

    CMP

    SI,4

    JB

    NEXT1

    MOV

    SI,2

    NEXT1:JMP

    SCANROW

    LINE0:MOV

    CL,[BX+SI+0]

    ;查表

    MOV

    DI,SI

    SHL

    DI,1

    MOV

    AX,DS:[BP+DI+0]

    JMP

    OUTPUT

    LINE1:MOV

    CL,[BX+SI+4]

    MOV

    DI,SI

    SHL

    DI,1

    MOV

    AX,DS:[BP+DI+8]

    JMP

    OUTPUT

    LINE2:MOV

    CL,[BX+SI+8]

    MOV

    DI,SI

    SHL

    DI,1

    MOV

    AX,DS:[BP+DI+16]

    JMP

    OUTPUT

    LINE3:MOV

    CL,[BX+SI+12]

    MOV

    DI,SI

    SHL

    DI,1

    MOV

    AX,DS:[BP+DI+24]

    OUTPUT:CMP

    CL,3FH

    ;检查是否是0,是0就退出

    JZ

    ENDSP

    MOV

    DX,280H

    ;

    输出数据给计数器

    OUT

    DX,AL

    MOV

    AL,AH

    OUT

    DX,AL

    MOV

    AL,CL

    ;数码管显示乐谱

    MOV

    DX,288H

    ;传送段码给A口

    OUT

    DX,AL

    MOV

    AL,01H

    ;传送位码给B口

    MOV

    DX,289H

    OUT

    DX,AL

    JMP

    SCANROW

    ;继续扫描

    ENDSP:POP

    DI

    POP

    SI

    POP

    BP

    POP

    DX

    POP

    CX

    POP

    BX

    POP

    AX

    RET

    SPIELINGP

    ENDP

    DELAY

    PROC

    NEAR

    PUSH

    CX

    PUSH

    AX

    ;

    MOV

    AX,1

    ;250×65535

    LP2:

    MOV

    CX,08FFH

    LP1:

    LOOP

    LP1

    DEC

    AX

    JNZ

    LP2

    POP

    AX

    POP

    CX

    RET

    DELAY

    ENDP

    CODE

    ENDS

    END

    START

    六、实验总结

    在本次实验中主要出现了如下问题:

    延迟函数没处理好,在本次实验中,我将弹琴功能和放音功能写在同一个程序中,两个部分都需要使用到延迟函数,在放音子程序中,延迟函数起到控制音调持续时间长短的作用,在弹琴功能中,延迟函数主要起键盘消抖的作用。不同的作用所要求的延迟时间长短不一样,一开始没注意到这个问题,导致放出来的音乐很刺耳。

    七、实验收获与心得体会

    本次实验主要内容是使用8254定时器来播放音乐,经过前几次实验,自己对接口电路的使用越来越熟练,按照手册对接口电路进行初始化和读写即可。实验过程也并不是一帆风顺,出现了一些错误,通过解决代码中的错误,我的调试能力得到了很大的锻炼,也变得更加有耐心去解决一些问题。

    实验报告四:串行通讯8251

    一、

    实验目的

    1、了解串行通讯的基本原理。

    2、掌握串行接口芯片8251的工作原理和编程方法。

    二、

    实验原理及内容

    1、按图4-16-1连接好电路,(8251插通用插座)其中8254计数器用于产生8251的发送和接收时钟,TXD和RXD连在一起。

    2、编程:

    从键盘输入一个字符,将其ASCII码加

    1

    后发送出去,再接收回来在屏幕上显示,(或将内存制定区域内存放的一批数据通过8251A的TXD发送出去,然后从RXD接收回来,并在屏幕上或数码管上显示出来。)实现自发自收。

    3、接线:

    CLK0

    /8254

    1M时钟

    GATE0

    /8254

    +5V

    0UT0

    /8254

    TX/RXCLK

    /8251

    CS

    /8254

    Y0

    /IO地址

    CS

    /8251

    Y7

    /IO地址

    RXD

    /8251

    TXD

    /8251

    三、

    硬件连线图

    四、

    软件流程图

    五、

    源程序

    STACK

    SEGMENT

    STACK

    STACK

    DB

    100

    DUP(

    0

    )

    STACK

    ENDS

    DATA

    SEGMENT

    REMIND_MSG

    DB

    0AH,0DH,please

    input

    character:,0AH,0DH,$

    NEXTROW

    DB

    0AH,0DH,$

    DATA

    ENDS

    CODE

    SEGMENT

    ASSUME

    DS:DATA,CS:CODE,SS:STACK

    START:MOV

    AX,DATA

    MOV

    DS,AX

    MOV

    AL,52

    ;设置8253计数器初值为52

    MOV

    DX,280H

    OUT

    DX,AL

    MOV

    DX,2B9H

    MOV

    AL,40H;先内部复位

    OUT

    DX,AL

    NOP

    MOV

    AL,01111110B

    ;方式控制字

    OUT

    DX,AL

    NOP

    MOV

    AL,37H;命令控制字

    OUT

    DX,AL

    NOP

    MOV

    AH,09H;输出提示语

    LEA

    DX,REMIND_MSG

    INT

    21H

    LOP:

    MOV

    DX,2B9H

    ;读状态字,检查发送器是否准备好

    WAITT1:IN

    AL,DX

    TEST

    AL,01H

    JZ

    WAITT1

    ;没准备好,继续查询

    MOV

    AH,01H

    ;输入字符

    INT

    21H

    CMP

    AL,1BH

    ;检查是否是结束字符

    JZ

    ENDING

    INC

    AL

    MOV

    DX,2B8H

    OUT

    DX,AL

    ;将数据传出

    MOV

    DX,2B9H

    WAITTT2:IN

    AL,DX

    ;读状态字,检查接收器是否准备好

    TEST

    AL,02H;

    JZ

    WAITTT2

    MOV

    DX,2B8H

    IN

    AL,DX

    MOV

    AH,02H

    ;输出字符

    MOV

    DL,AL

    INT

    21H

    MOV

    AH,09H;换行

    LEA

    DX,NEXTROW

    INT

    21H

    JMP

    LOP

    ;准备下一次输入

    ENDING:MOV

    AX,4C00H

    INT

    21H

    CODE

    ENDS

    END

    START

    六、

    实验总结

    本次实验的内容是利用8251芯片实现简单的串行通信,CPU通过查询方式与8251进行联络,实验中并没有出现明显问题。代码的缺陷是没有对接收到的数据进行检错就直接拿来使用。

    七、

    实验收获及心得体会

    本次实验是本学期的最后一次实验,通过前三次实验的训练,本次实验的代码写地比较顺利,

    通过四次微机硬件实验,对接口电路有了更深刻的认识,实践了理论课上的知识,对地址有了更准确的理解。掌握了认识、使用一个接口芯片的方法,同时还锻炼了自己编写汇编程序的能力。

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识