微机接口技术课程设计报告

《微机接口技术课程设计》

设计报告

    题目:                

专业:  10电子信息工程 

    班级:                

    学号:       

    姓名:                

   指导老师:                 

重庆交通大学信息科学与工程学院

设计时间:20## 614 日到 20## 6 28

1.设计任务说明

综合应用接口技术各汇编语言程序设计技术,在PC机上实现时钟显示、定时和响铃。

?利用BIOS 和DOS 的系统功能调用,能将计算机系统的日期和时间读出并 显示出来。

?用“时:分:秒” (都是两位)的形式连续显示系统时间。

?利用定时接口芯片每秒钟响一次铃。

4提示输入定时时间(即定时秒数),每经历指定的秒数,则演奏乐曲。

2. 总体设计

(1)利用定时中断实现时钟显示。

(2)在定时中断发生时同时调用发声程序实现响铃。

3. 详细设计

当产生定时中断时(由8259A的IRQ0引起),CPU转入BIOS的08H号中断处理程序,在该中断处理程序中是一条软中断指令“INT 1CH”,而在该软中断程序中只有一条IRET指令,这样系统每秒钟产生18.2次定时中断,调用18.2次INT 1CH,这为开发者提供了一个编写与时间有关的程序的软中断接口,上例的定时响铃就是借用这个软接口实现的。其具体操作如下:

①在时钟显示程序,截获1CH号中断,在新的1CH中断处理程序安排一个计数器,记录调用的次数,每18次(约一秒钟)显示一次当前时间。

②利用BOIS的1AH号中断的0号功能,读取当前计时器的数值:

入口参数:AH=02H

执行:    INT 1AH

出口参数:AL=午夜信号,CH=时的BCD码,CL=分的BCD码,DH=秒的BCD码  

③利用BIOS的10H号中断的13H号功能,实现在屏幕的右上角显示时间。

④在主程序中要保存原1CH号中断的中断向量,并设置新的时钟显示中断程序的中断向量,然后作其它工作,如调用BIOS的键盘中断INT 16H的0号功能,等待用户按键盘,也就是等待中断的发生,并在屏幕右上角显示时间……,当用户按键后,主程序工作完成后,恢复原1CH中断向量。

发声程序用定时器驱动扬声器方式,这是直接利用8253/8254定时器产生声音的一种方法。

定时器2的GATE2与8255A的端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连,当PB1=1时,允许OUT2输出的频率信号到达扬声器电路。

利用定时中断实现时钟显示的流程图:

微机接口技术课程设计报告

在定时中断发生时同时调用发声程序实现响铃的流程图:

微机接口技术课程设计报告

4.程序及说明

count_val=18            ;间隔数(约为一秒)

dpage=0

row=3

column=85-buff_len

color=07h                ;显示属性

.286

.model small

.data

MUSTEP  dw 330,294,262,294,3

dup(330)                              

         dw 294,294,294,330,392,392

         dw 294,294,330,294,262

         dw 330,392,330,294,330,392,330,294,330

         dw 330,392,330,294,262,294,330,392,294

         dw 262,262,220,196,196,220,262,294,330,262

         dw -1

.code         

count dw count_val

yy db ?

xx db ?

hhhh  db ?,?," : "

mmmm  db ?,?,' : '

ssss  db ?,?

      db 0ah

mess1 db 4 dup(?)

      db " : "

mess2 db 2 dup(?)

      db " : "

mess3 db 2 dup(?)

      db 0dh,0ah,24h

year dw ?

month db ?

day db ?

buff_len=$-offset hhhh             ;显示信息长度   

cursor dw ?                       ;保存当前光标位置

 new1ch:

        cmp cs:count,0             ;是否到显示时候

        jz next                    ;是转next

     dec cs:count               ;否则间隔计数器减1

     iret                      ;中断返回

next:

    mov cs:count,count_val       ;间隔计数器重置初值18

    sti                        ;开中断

    pusha                      ;保护现场

    push ds

    push es

    push cs                     ;填写DS和ES              

    pop ds

    push ds

    pop es     

    call get_t                   ;读取系统时间及日期       

    mov bh,dpage               ;BX←页号

    mov ah,3                   ;取原光标位置

    int 10h

    mov cursor,dx               ;保存原光标位置

    mov bp,offset hhhh           ;bp←时间信息串首地址

    mov bh,dpage

    mov dh,row

    mov dl,column

    mov bl,color

    mov cx,buff_len-6

    mov al,0                    ;a1←显示模式,移动光标          

    mov ah,13h                  ;显示时钟

    int 10h

    mov bh,dpage

    mov dx,cursor

    mov ah,2                    ;恢复光标原位置

    int 10h

    pop es                      ;恢复现场

     pop ds

     popa

        cmp yy,0

        jnz rrr

        call music

     rrr: dec yy

        call   ring

     iret

 get_t  proc                      ;取当前系统时间和日期过程  

   mov ah,2                   ;取时间信息   

   int 1ah

   mov al,ch

   call ttasc              ;调用转换压缩BCD码为ASCII码子程序  

   xchg ah,al

   mov word ptr hhhh,ax           ;保存小时数

   mov al,cl

   call ttasc

   xchg ah,al

   mov word ptr mmmm,ax

   mov al,dh

   call ttasc

   xchg ah,al

   mov word ptr ssss,ax

   mov ah,2ah                 ;取日期数信息 

   int 21h

   mov year,cx

   mov month,dh

   mov day,dl

   mov ax,year

  mov bx,length mess1

mov si,offset mess1

call todasc

mov al,month

xor ah,ah

mov bx,length mess2

mov si,offset mess2

call todasc

mov al,day

xor ah,ah

mov bx,length mess3

mov si,offset mess3

   call todasc

ret

get_t   endp

ttasc   proc             ;时间调用转换压缩BCD码为ASCII码子程序      

push cx

mov ah,al

and al,0fh

mov cl,4

shr ah,cl

add ax,3030h

pop cx

ret

ttasc   endp

   

todasc  proc                 ;日期调用转换为ASCII码子程序            

       pusha

       mov cx,10

t1:

       xor dx,dx

       div cx

    add dl,30h

    mov [si+bx-1],dl

    dec bx

    jnz t1

        popa

     ret

todasc endp

gsound proc

       pusha

       mov al,10110110b     ;定时器2控制字,方式3,输出方波

       out 43h,al

       mov  dx,12h          ;dx|ax ←11933100hz       

       mov  ax,348ch

       div di

       out 42h,al           ;定时器2 分频系数       

       mov al,ah

       out 42h,al

       in al,61h            ;a1←61h口     

       mov ah,al             ;61h口原数保存到ah中

       or al,03h             ;61h口的pb和pb置1

       out 61h,al            ;本行执行后即开始发声

wait1:

      mov cx,8289h

      call waitf

      dec bx

      jnc wait1

      mov al,ah              ;恢复61h口原数据           

      out 61h,al

      popa

      ret

gsound endp

ring proc

     pusha

     mov dx,10000            ;dx←发声次数           

     in al,61h               ;d1 ←0(发声开关)

     and al,0fdh             ;d1取反     

sound:xor al,02h               

     out 61h,al

     mov cx,05fffh           ;cx 延时循环初值            

  ww:loop ww

     dec dx

     jne sound

     popa

     ret

ring endp

music  proc

     mov al,xx

     mov  yy,al

     mov ax,@data

     mov ds,ax

     lea si,musfre       ;取频率表的首地址     

     lea bp,ds:mustime   ;取节拍时间表首地址   

freq:

    mov di,[si]           ;di ←频率          

    cmp di,-1             ;结束演奏?   

    je end_mus

    mov bx,[bp]           ;bx←节拍时间值       

    call gsound           ;调用发声程序   

    add si,2               ;指向下一个发声频率   

    add bp,2

    jmp freq               ;继续演奏下一个音节        

end_mus:  ret

music endp

waitf  proc                  ;入口参数:CX=COUNT OF 15.08us

      push ax

waitf1:

       in al,61h

       and al,10h

       cmp al,ah

       je waitf1

       mov ah,al

       loop waitf1

       pop ax

       ret

waitf  endp

   

old1ch  dd ?

start:  mov ax,@code

      mov ds,ax

      mov ah,1

      int 21h

      mov ah,30h

      sub al,ah

      mov yy,al

      mov xx,al

      push cs

   pop ds                       ;填写DS        

   mov ax,351ch                 ;取1CH号中断向量

   int 21h

   mov word ptr old1ch,bx       ;保存向量偏移地址

   mov word ptr old1ch+2,es

   mov dx,offset new1ch         ;dx 新时钟中断入口偏移地址

   mov ax,251ch                ;新中断段地址已在DS中

   int 21h                     ;设置新的1CH号中断向量

   mov ah,0                    ;等待按键(即等待中断发生)

   int 16h

      lds dx,old1ch                 ;DX 原中断入口偏移地址    

     mov ax,251ch                ;恢复原中断向量

     int 21h

       mov ah,4ch

     int 21h                   ;程序结束

     end start

5.系统测试

     对程序进行编译和链接,成功得实现了显示系统时间和日期,并且能够定时播放简单音乐。

6.总结与体会

    这次课程设计,对于我来说还是十分困难的。由于平时不注重上机的练习,在平常的上机课也只是按照书本上的内容依次敲入程序,按步调试,并没有去深刻的理解书本上的理论,和每一步要实现的功能。因此这次的课程设计给我造成了很大的困扰,好在最后经过一番努力,终于做出来程序,并实现功能,我还是很高兴的。

    本次实验,要实现时钟的显示和定时控制两项功能,以往的上机实验课上有这方面的探索,所以这次实验我在以前实验的基础上调用另外的子程序,来实现其基本要求。通过这次课程设计,我深刻地认识到要把课堂理论和上机实践联系起来的重要性,仅仅是实现了程序的功能还要了解每一步的作用。或许汇编语言比较高级语言来说有些枯燥和难懂,但是其在一些重要领域有着极重要的地位而难以取代,这门科目的结束并不是学习的结束,我会继续学习汇编语言,让其实现应有的价值。

  

相关推荐