串行接口实验报告

时间:2024.3.31

实验名称:          串行接口          

专业班级:                     

    号:                 

    名:                       

同组人员:                      

指导教师:                    

报告日期:            

实验二

1. 实验目的... 3

2. 实验内容... 3

3. 实验原理... 3

4. 程序代码... 6

5. 实验体会... 13

实验二

1.实验目的

1.熟悉串行接口芯片8251的工作原理

2.掌握串行通讯接收/发送程序的设计方法

2.实验内容

通过对8251芯片的编程,使得实验台上的串行通讯接口(RS232)以查询方式实现信息在双机上的。具体过程如下:

1. 从A电脑键盘上输入一个字符,将其通过A试验箱的8251数据口发送出去,然后通过B试验箱的8251接收该字符,最后在B电脑的屏幕上显示出来。

2.从A试验箱上输入步进电机控制信息(开关信息),通过A试验箱的8251数据口发送到B试验箱的 8251数据口,在B试验箱上接收到该信息之后,再用这个信息控制B试验箱上的步进电机的启动停止、转速和旋转方向。

3.实验原理

1.8251控制字说明

在准备发送数据和接收数据之前必须由CPU把一组控制字装入8251。控制字分两种:方式指令和工作指令,先装入方式指令,后装入工作指令。

另外,在发送和接收数据时,要检查8251状态字,当状态字报告“发送准备好”/“接收准备好”时,才能进行数据的发送或接收。

7-222.8251方式指令(端口地址2B9H)

3.8251工作指令(端口地址2B9H)

 

4.8251状态字(端口地址2B9H)

5.8253控制字(283H)

6.8253计数初值(283H)

计数初值=时钟频率/(波特率× 波特率因子)

    本实验:脉冲源=1MHz

            波特率=1200

           波特率因=16

    计数初值= 1000000/1200*16=52

7.程序流程框图

4.程序代码

Fxc.asm

;************************;

;*8251串行通讯(自发自收)*;

;************************;

data segment

 io8253a    equ 280h    ;8253计数0端口地址

 io8253b    equ 283h    ;8253控制端口地址

 io8251a    equ 2b8h    ;8251数据端口地址

 io8251b    equ 2b9h    ;8251控制端口地址

 mes1 db 'you can play a key on the keybord!',0dh,0ah,24h

 mes2 dd  mes1

data ends

code segment

   assume cs:code,ds:data

start:      mov ax,data

      mov ds,ax

      mov dx,io8253b       ;设置8253计数器0工作方式

      mov al,16h           ;控制字为00010110B

      out dx,al

      mov dx,io8253a

      mov al,52         ;给8253计数器0送初值

      out dx,al

      mov dx,io8251b       ;初始化8251

      ;xor al,al

      ;mov cx,03         ;向8251控制端口送3个0

 ;delay:     call out1

      ;loop delay

      mov al,40h        ;向8251控制端口送40H,使其复位

      call out1

      mov al,4eh        ;设置为1个停止位,8个数据位,波特率因子为16

      call out1

      mov al,27h        ;向8251送控制字允许其发送和接收

      call out1

     lds dx,mes2       ;显示提示信息

      mov ah,09

      int 21h

waiti:   mov dx,io8251b

     in al,dx

     test al,01        ;发送是否准备好

     jz next

     mov ah,0bh

     int 21h

     test al,0ffh       ;检测是否有键盘输入     

     jz next

     mov dl,0ffh        ;有键盘输入,读入字符

     mov ah,06h       

     int 21h

     cmp al,27         ;若为ESC,结束

     jz exit

     mov dx,io8251a

     ;inc al

     out dx,al         ;发送

    ; mov cx,40h

;s51:       loop s51          ;延时

next:      mov dx,io8251b

     in al,dx

     test al,02        ;检查接收是否准备好

     jz waiti           ;没有,等待

     mov dx,io8251a

     in al,dx          ;准备好,接收

     mov dl,al

     mov ah,02         ;将接收到的字符显示在屏幕上

     int 21h

     jmp waiti

exit:      mov ah,4ch        ;退出

     int 21h

out1 proc near       ;向外发送一字节的子程序

      out  dx,al

      ;push cx

      ;mov  cx,40h

;gg:       loop gg           ;延时

   ;   pop  cx

      ret

out1 endp

code ends

end start

Send .asm

   ;************************;

;*8251串行通讯(自发自收)*;

;************************;

data segment

 io8253a    equ 280h    ;8253计数0端口地址

 io8253b    equ 283h    ;8253控制端口地址

 io8251a    equ 2b8h    ;8251数据端口地址

 io8251b    equ 2b9h    ;8251控制端口地址

buf3 byte    0

 mes1 db 'you can play a key on the keybord!',0dh,0ah,24h

 mes2 dd  mes1

data ends

code segment

   assume cs:code,ds:data

start:      mov ax,data

      mov ds,ax

      mov dx,io8253b       ;设置8253计数器0工作方式

      mov al,16h           ;控制字为00010110B

      out dx,al

      mov dx,io8253a

      mov al,52         ;给8253计数器0送初值

      out dx,al

      mov dx,io8251b       ;初始化8251

mov     dx,28bh             ;8255控制口初始化

        mov     al,81h              ;1000,0001

        out     dx,al

      ;xor al,al

      ;mov cx,03         ;向8251控制端口送3个0

 ;delay:     call out1

      ;loop delay

      mov al,40h        ;向8251控制端口送40H,使其复位

      call out1

      mov al,4eh        ;设置为1个停止位,8个数据位,波特率因子为16

      call out1

      mov al,27h        ;向8251送控制字允许其发送和接收

      call out1

     lds dx,mes2       ;显示提示信息

      mov ah,09

      int 21h

waiti:   mov dx,io8251b

     in al,dx

     test al,01        ;发送是否准备好

     jz next

     mov ah,0bh

     int 21h

     test al,0ffh       ;检测是否有键盘输入     

     jz next

    ; mov dl,0ffh        ;有键盘输入,读入字符

     ;mov ah,06h      

    ; int 21h

mov dx,28ah

in al,dx

     cmp al,27         ;若为ESC,结束

     jz exit

     mov dx,io8251a

     ;inc al

     out dx,al         ;发送

    ; mov cx,40h

;s51:       loop s51          ;延时

next:      mov dx,io8251b

     in al,dx

     test al,02        ;检查接收是否准备好

     jz waiti           ;没有,等待

     mov dx,io8251a

     in al,dx          ;准备好,接收

     mov dl,al

     mov ah,02         ;将接收到的字符显示在屏幕上

     int 21h

     jmp waiti

exit:      mov ah,4ch        ;退出

     int 21h

out1 proc near       ;向外发送一字节的子程序

      out  dx,al

      ;push cx

      ;mov  cx,40h

;gg:       loop gg           ;延时

   ;   pop  cx

      ret

out1 endp

code ends

end start

步进电机:

 1.K0=0,逆时针转;K0=1,顺时针转

 2.K1=0,慢转;K1=1,快转

data        segment

        buf1 db      3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh      ;LED显示

        buf2 byte    0              ;步进电机数据

        buf3 byte    0              ;保存开关数据

        buf4 byte    0            ;保存顺转数据

        buf5 byte    9            ;保存反转数据

        buf6 byte    0           ;开关机

data        ends

code    segment

        assume    cs:code,ds:data

start:

        mov     ax,data

        mov     ds,ax

        mov     buf2,00110011b      ;步进电机数据

        mov     dx,28bh             ;8255控制口初始化

        mov     al,81h              ;1000,0001

        out     dx,al

;-----------------------------逆转控制----------------

R0:     mov     dx,28ah             ;读C口

        in      al,dx

       

        mov     buf3,al             ;保存C口数据

       

        test    al,04               ;

        jnz     kai                  ;转反转

       

        test    al,01               ;测试K0=1?

        jnz     L0                  ;转反转

       

       

        mov     al,buf4             ;走马灯开始一步顺转

        cmp     al,9

        jnz     S1

    

        call    change9_0

S1:     inc     al                  ;数据加1

        mov     buf4,al

        mov     bx,offset buf1

        xlat

        mov     dx,289h             ;B口输出

        out     dx,al               ;数据完成加1

        mov     al,buf2             ;电机开始一步逆转

        ror     al,1                ;数据左移

        mov     buf2,al

        mov     dx,288h             ;A口输出

        out     dx,al               ;电机完成一步逆转

       

        mov     al,buf3             ;回复C口数据

       

        test    al,02

        jnz     R1                  ;转快转

        call    delay_s             ;否则慢转

        jmp     R0

       

R1:     call    delay_q             ;快转

        jmp     R0

;------------------------------顺转控制-----------------

L0:     mov     al,buf5             ;走马灯开始一步顺转

        cmp     al,0

        jnz     S2

T2:     test    al,03              ;测试K2=1?

        jnz     T2

           

        call change0_9       

S2:     dec     al                  ;数据减1

        mov     buf5,al             ;

        mov     bx,offset buf1

        xlat

        mov     dx,289h             ;B口输出

        out     dx,al               ;走马灯结束一步顺转

       

        mov     al,buf2             ;电机开始一步顺转

        rol     al,1                ;数据右移

        mov     buf2,al

        mov     dx,288h             ;A口输出

        out     dx,al               ;电机结束一步顺转

        mov     al,buf3             ;回复C口数据

       

        test    al,02

        jnz     L1                  ;转快转

        call    delay_s             ;否则慢转

        jmp     R0

T3:     test    al,03              ;测试K2=1?

        jnz     T3

               

L1:     call    delay_q             ;快转

        jmp     R0

kai:    mov     dx,28ah             ;读C口

        in      al,dx

        mov     buf3,al             ;保存C口数据

        test    al,04               ;

        jz     L0                  ;转反转

        jmp    kai

exit:   mov  ah,4ch

        int   21h

delay_s    proc  near               ;长延时

            mov  bx,20h

    lp1:    mov  cx,0ffffh

    lp2:    loop      lp2

            dec      bx

            jnz      lp1

            ret

delay_s    endp

delay_q    proc  near               ;短延时

            mov  bx,1

    lp11:   mov  cx,0ffffh

    lp22:   loop      lp22

            dec      bx

            jnz      lp11

            ret

delay_q    endp

change9_0 proc near

        mov buf4,-1

        mov al,buf4

        ret

change9_0 endp

change0_9 proc near

        mov buf5,10

        mov al,buf5

        ret

change0_9 endp

code        ends

        end start

5.实验体会

这次实验需要用到两种芯片8253和8251,两种芯片的作用分别是8253提供串行通讯所需的特定频率的脉冲信号,8251提供输入输出控制,所以在实验的过程中需要熟悉这两种芯片的方式字等使用规范,在仔细阅读了书本以及书本的编程实例后,基本摘掉了程序的设计方法

实验过程中,出现了程序编译通过了但是不能运行的情况,后来经过检查发现是程序没有设置好的原因,要设置为编译后运行状态,否知只编译不运行,经过这次实验,知道了8253和8251两种芯片的基本用法,对课本上的知识有了更深入的理解,收获不少。

更多相关推荐:
接口实验报告

一实验目的1掌握8255A编程原理2掌握键盘的输入和数码管的显示3提高理论与实践相结合的能力强化所学内容二实验要求用8255A实现模拟电梯用键盘输入要求电梯所到达的楼层数码管显示电梯当前所在楼层电梯在初始楼层当...

接口技术实验4报告

上海大学计算机学院计算机接口技术实验4专业计算机科学与技术班级周一13节姓名学号计算机工程与科学学院报告日期20xx年10月29日实验名称AD转换实验和电机驱动实验一实验目的1掌握ADC0809芯片的硬件电路知...

微机接口实验报告

实验一显示程序实验20xx年4月22日1实验目的及实验内容实验目的1掌握在PC机上以十六进制数形式显示数据的方法2掌握部分DOS功能调用的使用方法3熟悉Tddebug调试环境和TurboDebugger的使用实...

接口实验报告

现代微机原理与接口技术接口部分实验报告学号09008112姓名马京亚成绩学号东南大学计算机科学与工程学院二一年十二月微机原理与接口技术接口部分实验报告目录实验二可编程定时器计数器82533实验三Windows中...

接口实验报告

武汉轻工大学现代微机原理与接口技术报告学号姓名班级成绩20xx年5月15日110511313王雪瑞网工一班实验1定时与中断接口程序设计实验项目定时与中断接口程序设计实验日期4月22日实验场地东7409实验环境硬...

接口实验报告

一实验目的及要求目的通过本次综合实验使学生综合运用计算机接口与通信技术汇编语言以及电子技术等课程的内容为以后从事计算机检测与控制工作奠定一定的基础要求1主要掌握并行IO接口芯片82538255A中断控制芯片82...

接口实验报告

接口实验报告,内容附图。

计算机接口实验报告

计算机接口实验报告,内容附图。

接口实验报告

接口实验报告班级0313班姓名吴传文学号0120xx016704实验一并行接口实验实验内容利用8255接口控制显示灯逐位循环点亮实验要求当C口的PC71状态时用开关SW4按下控制显示灯从高位到低位逐位循环点亮右...

接口实验报告要求2

华北电力大学微机原理与接口技术实验报告课程名称微机原理与接口技术实验名称8251A串行口通信实验指导教师徐欢班级学号姓名同组人实验台号实验日期实验成绩实验报告内容要求一实验目的了解串行通信的一般原理和8251A...

接口与通信实验报告

华北电力大学实验报告实验名称课程名称专业班级学号指导教师8255并行接口实验中断特性及8259应用编程实验8253定时计数应用实验模数AD转换实验接口与通信实验设计学生姓名成绩实验日期实验报告如打印纸张用A4左...

计算机接口实验报告

计算机接口技术实验电子与信息工程班级电子0911姓名学号20xx年5月9日实验一IO地址译码一实验目的掌握IO地址译码电路的工作原理二实验原理和内容实验电路如图11所示图中线路两端有节点的信号线需要用户用实验导...

接口实验报告(32篇)