您的当前位置:首页正文

微机原理程序

来源:好兔宠物网


微机原理程序(共7页)

--本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小--

;**********************; ;* 数/模转换实验1 *; ;* 产生锯齿波 *;

;**********************; io0832a equ 290h code segment assume cs:code start: mov cl,0

mov dx,io0832a lll: mov al,cl out dx,al add cl,10 push dx

mov ah,06h ;判断是否有键按下 mov dl,0ffh int 21h pop dx

jz lll ;若无则转LLL mov ah,4ch ;返回 int 21h code ends end start

;**********************; ;* 数/模转换实验2 *; ;* 产生正弦波 *;

;**********************; data segment

io0832a equ 290h Sin db

80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db

0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h

db

80h,66h,4eh,38h,25h,15h,09h,04h Db

00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据 data ends code segment

assume cs:code,ds:data start: mov ax,data mov ds,ax

ll: mov si,offset sin ;置正弦波数据的偏移地址为SI

mov bh,32 ;一组输出32个数据

lll: mov al,[si] ;将数据输出到D/A转换器

mov dx,io0832a out dx,al mov ah,06h mov dl,0ffh int 21h jne exit mov cx,1

delay: loop delay ;延时 inc si ;取下一个数据 dec bh

jnz lll ;若未取完32个数据则转lll jmp ll

exit: mov ah,4ch ;退出 int 21h code ends end start

;****************************; ;* AD转换器2--示波器 *; ;* 采集数据在屏幕是作图 *; ;****************************; io0809b equ 299h code segment

assume cs:code

start: mov ax,0012h ;设屏幕显示方式为VGA 640X480模示 int 10h start1:

mov ax,0600h

int 10h ;清屏

and cx,0 ;cx为横坐标

draw: mov dx,io0809b ;启动A/D转换器通道1 out dx,al

mov bx,200;500 ;延时 delay: dec bx jnz delay

in al,dx ;读入数据

2

mov ah,0

mov dx,368 ;dx为纵坐标 sub dx,ax

mov al,0ah ;设置颜色 mov ah,0ch ;画点 int 10h

cmp cx,639 ;一行是否满 jz start1 ;是则转start inc cx ;继续画点 push dx

mov ah,06h ;是否有键按下 mov dl,0ffh int 21h pop dx

je draw ;无,则继续画点 mov ax,0003 ;有恢复屏幕为字符方式 int 10h

mov ah,4ch ;返回 int 21h code ends end start

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

io8253a equ 280h io8253b equ 283h io8251a equ 2b8h io8251b equ 2b9h

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 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 waiti

mov ah,01 ;是,从键盘上读一字符

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 next ;没有,等待 mov dx,io8251a

in al,dx ;准备好,接收 mov dl,al

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

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 ;

;8259中断查询方式应用实验

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

; 2008年03月为8259应用修改 ;*****************************************************************

I8259_1 EQU 2B0H ;8259的ICW1端口地址

I8259_2 EQU 2B1H ;8259的ICW2端口地址

I8259_3 EQU 2B1H ;8259的ICW3端口地址

I8259_4 EQU 2B1H ;8259的ICW4端口地址

O8259_1 EQU 2B1H ;8259的OCW1端口地址

O8259_2 EQU 2B0H ;8259的OCW2端口地址

O8259_3 EQU 2B0H ;8259的OCW3端口地址

data segment

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

mess1 db 'Hello! This is interrupt * 0 *!',0dh,0ah,'$'

mess2 db 'Hello! This is interrupt * 1 *!',0dh,0ah,'$'

mess3 db 'Hello! This is interrupt * 2 *!',0dh,0ah,'$'

mess4 db 'Hello! This is interrupt * 3 *!',0dh,0ah,'$'

mess5 db 'Hello! This is interrupt * 4 *!',0dh,0ah,'$'

mess6 db 'Hello! This is interrupt * 5 *!',0dh,0ah,'$'

mess7 db 'Hello! This is interrupt * 6 *!',0dh,0ah,'$'

mess8 db 'Hello! This is interrupt * 7 *!',0dh,0ah,'$' data ends

stacks segment db 100 dup() stacks ends

STACK1 SEGMENT STACK DW 256 DUP() STACK1 ENDS

CODE SEGMENT ASSUME

CS:CODE,DS:DATA,SS:stacks,ES:DATA .386

START: mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax

MOV DX,I8259_1 ;初始化8259的ICW1

MOV AL,13H ;边沿触发、单片8259、需要ICW4

4

OUT DX,AL CMP AL,02H

JE IR2ISR MOV DX,I8259_2 ;初始化8259 CMP AL,03H 的ICW4

JE IR3ISR MOV AL,0B0H ;非自动结束 CMP AL,04H EOI

JE IR4ISR OUT DX,AL CMP AL,05H ;MOV AL,00H JE IR5ISR ;OUT DX,AL CMP AL,06H MOV AL,03H JE IR6ISR OUT DX,AL CMP AL,07H

JE IR7ISR MOV DX,O8259_1 ;初始化 JMP QUERY 8259的OCW1

MOV AL,00H ;打开IR0和IR1IR0ISR: MOV AX,DATA 的屏蔽位

MOV DS,AX

OUT DX,AL MOV DX,offset mess1 ;

信息

QUERY: MOV AH,1 ;判断是否 MOV AH,09 有按键按下 INT 21H INT 16H

JMP EOI JNZ QUIT ;有按键则退出

IR1ISR: MOV AX,DATA MOV DX,O8259_3 ;向8259的 MOV DS,AX

OCW3发送查询命令 MOV DX,offset mess2 ; MOV AL,0CH 信息

OUT DX,AL MOV AH,09 INT 21H

JMP EOI IN AL,DX ;读出查询字

MOV AH,AL IR2ISR: MOV AX,DATA AND AL,80H

MOV DS,AX

TEST AL,80H ;判断中断是否 MOV DX,offset mess3 ;已响应

信息

JZ QUERY ;没有响应则继续 MOV AH,09 查询

INT 21H MOV AL,AH JMP EOI

AND AL,07H IR3ISR: MOV AX,DATA CMP AL,00H

MOV DS,AX

JE IR0ISR ;若为IR0请求, MOV DX,offset mess4 ;跳到IR0处理程序 信息

CMP AL,01H

MOV AH,09 JE IR1ISR ;若为IR1请求, INT 21H 跳到IR1处理程序

JMP EOI

5

显示提示显示提示显示提示显示提示IR4ISR: MOV AX,DATA MOV DS,AX

MOV DX,offset mess5 ;显示提示信息

MOV AH,09 INT 21H JMP EOI

IR5ISR: MOV AX,DATA MOV DS,AX

MOV DX,offset mess6 ;显示提示信息

MOV AH,09 INT 21H JMP EOI

IR6ISR: MOV AX,DATA MOV DS,AX

MOV DX,offset mess7 ;显示提示信息

MOV AH,09 INT 21H JMP EOI

IR7ISR: MOV AX,DATA MOV DS,AX

MOV DX,offset mess8 ;显示提示信息

MOV AH,09 INT 21H

EOI:

MOV DX,O8259_2 ;向8259发送中断结束命令 MOV AL,20H OUT DX,AL JMP QUERY

QUIT: MOV AX,4C00H ;结束程序退出

INT 21H

CODE ENDS END START

;*******************************; ;* DMA传送实验(块传送) *;

6

;* 2008年2月为8237扩展板修改 *; ;*******************************; io8237 equ 280h ;从8237地址 code segment assume cs:code start:

mov ax,0D000h mov es,ax mov bx,4000h

mov cx,0ffH;传输个数 mov dl,40h;字符A rep1: inc dl mov es:[bx],dl inc bx

cmp dl,5ah jnz ss1 mov dl,40h ss1: loop rep1

mov dx,18h ;关闭主8237 mov al,04h out dx,al

mov dx,1dh ;复位主8237 mov al,00h out dx,al

mov dx,18h ;开启主8237,DACK信号高有效 mov al,80h out dx,al

mov dx,1bh ;主8237为级联方式

mov al,0c0h out dx,al

mov dx,io8237+08h ;关闭从8237

mov al,04h out dx,al

mov dx,io8237+0dh ;复位从8237

mov al,00h out dx,al

mov dx,io8237+02h ;写目的地址低位

mov al,00h out dx,al

mov dx,io8237+02h ;写目的地址高位

mov al,42h out dx,al

mov dx,io8237+03h ;传送字节数低位

mov al,0ffh out dx,al

mov dx,io8237+03h ;传送字节数高位

mov al,00h out dx,al

mov dx,io8237+00h ;源地址低位

mov al,00h out dx,al

mov dx,io8237+00h ;源地址高位

mov al,40h out dx,al

mov dx,io8237+0bh ;通道1写传输,地址增 mov al,85h out dx,al

mov dx,io8237+0bh ;通道0读传输,地址增 mov al,88h out dx,al

mov dx,io8237+08h ;DREQ低电平有效,存储器到存储器,开启从8237

mov al,41h out dx,al

mov dx,io8237+09h ;通道1请求

mov al,04h out dx,al

mov cx,0F000h delay: loop delay

mov ax,0D000h mov es,ax

mov bx,04200h;目的地址起始 mov cx,0ffh;读出字符个数 rep2: mov dl,es:[bx] mov ah,02h int 21h inc bx loop rep2 mov ax,4c00h int 21h code ends end start

;******************* ;* 8253分频 *

;******************* io8253a equ 280h io8253b equ 281h io8253c equ 283h code segment assume cs:code

start:mov dx,io8253c ;向8253写控制字

mov al,36h ;使0通道为工作方式3

out dx,al

mov ax,1000 ;写入循环计数初值1000

mov dx,io8253a

out dx,al ;先写入低字节 mov al,ah

out dx,al ;后写入高字节 mov dx,io8253c

mov al,76h ;设8253通道1工作方式2 out dx,al

mov ax,1000 ;写入循环计数初值1000

7

mov dx,io8253b

out dx,al ;先写低字节 mov al,ah

out dx,al ;后写高字节 mov ah,4ch ;程序退出 int 21h code ends end start

;*************************; ;* 8253方式0计数器实验 *; ;*************************; io8253a equ 283h io8253b equ 280h code segment assume cs:code

start: mov al,14h ;设置8253通道0为工作方式2,二进制计数 mov dx,io8253a out dx,al

mov dx,io8253b ;送计数初值为0FH

mov al,0fh out dx,al

lll: in al,dx ;读计数初值 call disp ;调显示子程序 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz lll

mov ah,4ch ;退出 int 21h

disp proc near ;显示子程序 push dx

and al,0fh ;首先取低四位 mov dl,al

cmp dl,9 ;判断是否<=9

jle num ;若是则为'0'-'9',ASCII码加30H

add dl,7 ;否则为'A'-'F',ASCII码加37H

num: add dl,30h

mov ah,02h ;显示

int 21h

mov dl,0dh ;加回车符 int 21h

mov dl,0ah ;加换行符 int 21h pop dx

ret ;子程序返回 disp endp code ends end start

对不起,我题找不到了,但是我可以告诉你重点在哪 2012的题编程很多,但是选择填空都是很基本的问题。不像之前做的模拟题,而且编程题很综合,涉及到DOS层调用(调用软中段输入和显示),

8259,8255,8254这几个东西的编程,7段数码管,串口通信,波特率计算。所以你基础的汇编语言的编写得熟悉,然后就是书上那些例程得看明白,像什么WINDOWS什么,我忘了具体是哪一节的那块可以不用看,DMA芯片大概看一下应该不会出编程。重点章节有:第一章,第二章第一节,第二节随意看看,第三章一到六节,节,第五章,第六章123节,第八章1到6节第九章1,2节,第十章。好好看,祝你成功

8

因篇幅问题不能全部显示,请点此查看更多更全内容