接口与通信.docx

上传人:b****7 文档编号:10177863 上传时间:2023-02-09 格式:DOCX 页数:24 大小:328.27KB
下载 相关 举报
接口与通信.docx_第1页
第1页 / 共24页
接口与通信.docx_第2页
第2页 / 共24页
接口与通信.docx_第3页
第3页 / 共24页
接口与通信.docx_第4页
第4页 / 共24页
接口与通信.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

接口与通信.docx

《接口与通信.docx》由会员分享,可在线阅读,更多相关《接口与通信.docx(24页珍藏版)》请在冰豆网上搜索。

接口与通信.docx

接口与通信

目录

1.8259外部中断控制……………………………………………………1

1

1.1课程设计要求……………………………………………………1

1.2课程设计目的……………………………………………………1

1.3实验电路…………………………………………………………1

1.4程序框图…………………………………………………………1

1.5程序代码…………………………………………………………2

1.6心得体会…………………………………………………………4

2.计时器的模拟实现……………………………………………………4

2

2.1课程设计要求……………………………………………………4

2.2课程设计目的……………………………………………………4

2.3电路原理图………………………………………………………4

2.4程序框图…………………………………………………………5

2.5代码设计及接线分析…………………………………………….5

2.6程序代码…………………………………………………………5

2.7心得体会……………………………………………………….10

3.温度采集及模拟控制……………………………………………….10

1

2

3

3.1课程设计要求………………………………………………….10

3.2课程设计目的………………………………………………….11

3.3程序框图……………………………………………………….11

3.4题目分析……………………………………………………….11

3.5程序代码……………………………………………………….12

3.6心得体会……………………………………………………….17

 

B.18259外部中断控制

(参考Lab8000.pdf中的:

硬件实验35)

1、课程设计要求

用8088/86控制8259可编程中断控制器,实现对外部中断的响应和处理。

要求程序中对每次中断进行计数,并将计数结果用8255的PA口输出到LED。

2、课程设计目的

(1)8088/86与8259的连接方法

(2)学习8088/86对8259的控制方法

3、实验电路:

4、程序框图:

5、代码如下:

modeequ82h;8255工作方式PA,PC输出,PB输入

PA8255equ8000h;8255PA口输出地址

CTL8255equ8003h;控制口端口

ICW1equ00010011b;单片8259,边缘触发,上升沿中断,单片,要写ICW4

ICW2equ00100000b;中断号为20H

ICW4equ00000001b;工作在8086/88方式,非特殊全嵌套,非缓冲方式

OCW1equ11111110b;只响应INT0中断

CS8259Aequ09000h;8259偶地址

CS8259Bequ09001h;8259奇地址

datasegment

CNTdb0

dataends

codesegment

assumecs:

code,ds:

data

IEnterprocnear;中断子程序

pushax

pushdx

movdx,PA8255

incCNT;计数值加1

moval,CNT

outdx,al;在8255的PA口输出计数值

movdx,CS8259A

moval,20h;中断服务程序结束指令

outdx,al

popdx

popax

iret;中断返回,恢复断点

IEnterendp

IInitproc;8259初始化子程序

movdx,CS8259A;设置初始化命令ICW1,写入偶地址端口

moval,ICW1

outdx,al

movdx,CS8259B;设置初始化命令ICW2,写入奇地址端口

moval,ICW2

outdx,al

moval,ICW4;设置初始化命令ICW4,写入奇地址端口

outdx,al

moval,OCW1;设置操作命令OCW1,写入奇地址端口

outdx,al

ret;返回

IInitendp

startprocnear;主程序

movdx,CTL8255

moval,mode

outdx,al;在8255的控制口端口写入控制方式字

cli;中断标志IF置0,禁止中断

movax,0

movds,ax

movbx,4*ICW2;中断号

movax,code

shlax,4;x16

addax,offsetIEnter;中断入口地址(段地址为0)

mov[bx],ax

movax,0

incbx

incbx

mov[bx],ax;代码段地址为0

callIInit;调用子程序对8259进行初始化设置

movax,data

movds,ax

movCNT,0;计数值初始为0

moval,CNT

movdx,PA8255

outdx,al

sti;中断标志IF置1,允许中断

LP:

;等待中断,并计数。

nop

jmpLP

startendp

codeends

endstart

6、心得体会:

这个实验比较简单,也不是第一次做了,通过书本及实验,对8259也的原理也相对了解,知道如何运用了,根据程序框图,代码很容易就明白了。

做起来还是很简单的。

B.2计时器的模拟实现

(参考Lab8000.pdf中的:

硬件实验18)

1、课程设计要求

利用电子时钟的原理,设计实现一个计时器(倒计时),时间精度是0.1秒,即每计数10次就等于1秒

在最右边的数码管上显示0.1秒的计数值,在最左边的数码管上显示1秒的计数值,从9秒开始计数,到0.0秒就结束程序

通过总线方式控制八段LED数码管控制计数值的显示(使用总线方式驱动LED不需要8255的参与)

2、课程设计目的

(1)熟练掌握定时器8253/8254的定时计数功能

(2)熟练掌握8259A外部中断及中断服务程序的设计

(3)熟练掌握总线方式驱动八段LED数码管

(4)熟练掌握汇编子程序的编写方法

(5)熟练掌握八段LED数码管的控制方式

3、电路原理图

4、程序框图

5、代码设计及接线分析:

由于题目要求该计时器的精度为0.1,而我选择接入的时钟脉冲为1MHz,它是精度为10^-6,所要要将其扩大10^5倍,而一个计数器计数的最大次数为2^16=65535<10^5,因此需要用两个计数器级联,计数器0的输出做计数器1的时钟信号,使其循环10^5次,从而达到0.1秒1跳。

则接线如下:

8253_CS->CS(0C000H)

8259_CS->CS(0D000H)

KEY/LED_CS->CS(8000H)

GATE0、GATE1->VCC

CLK0->1MHz

OUT0->CLK1、OUT1->INT0

5、代码如下:

CONTROLequ0c003h;计数器的控制端口

COUNT0equ0c000h;计数器0的入口地址

COUNT1equ0c001h;计数器1的入口地址

COUNT2equ0c002h;计数器2的入口地址

OUTBITequ08002h;位控制口

OUTSEGequ08004h;段控制口

ICW1equ00010011b;单片8259,上升沿中断,要写ICW4

ICW2equ00100000b;中断号为20H

ICW4equ00000001b;工作在8086/88方式

OCW1equ11111110b;只响应INT0中断

CS8259Aequ0d000h;8259地址

CS8259Bequ0d001h

datasegment

LEDBufdb2dup(?

);显示缓冲

DelayTdb1dup(?

leftdb0;左边的值

rightdb0;右边的值

LEDMAP:

;八段管显示码

db3fh,06h,5bh,4fh,66h,6dh,7dh,07h

db7fh,6fh,77h,7ch,39h,5eh,79h,71h

dataends

codesegment

assumecs:

code,ds:

data

Delayprocnear

pushax;延时子程序

pushcx

moval,0

movcx,ax

loop$

popcx

popax

ret

Delayendp

DisplayLEDprocnear

movbx,offsetLEDBuf

movcl,2;共2个八段管;cl的值由6改成2

movah,00100000b;从左边开始显示;把原本的00100000改成00000010

DLoop:

movdx,OUTBIT

moval,0

outdx,al;关所有八段管

moval,[bx]

movdx,OUTSEG

outdx,al

movdx,OUTBIT

moval,ah

outdx,al;显示一位八段管

pushax

movah,1;用来觉得延时程序调用的次数

callDelay

popax

shrah,5;因为要实现一个在最右端,一个在最左端,所以右移5位

incbx

deccl

jnzDLoop

movdx,OUTBIT

moval,0

outdx,al;关所有八段管

ret

DisplayLEDendp

IEnterprocnear

pushax

pushdx

decright

moval,right

cmpal,0ffh;由于是从9.0开始倒数,0自减1后变为0ffh,所以要与0ffh比较

jneExit

movright,9

decleft

moval,left

cmpal,0ffh

jneExit

movleft,9

Exit:

movdx,CS8259A

moval,20h;中断服务程序结束指令

outdx,al

popdx

popax

iret

IEnterendp

IInitproc

movdx,CS8259A

moval,ICW1

outdx,al

movdx,CS8259B

moval,ICW2

outdx,al

moval,ICW4

outdx,al

moval,OCW1

outdx,al

ret

IInitendp

startprocnear

movax,data

movds,ax

movleft,9

movright,0

cli

movax,0

movds,ax

moval,36h;00110110B;计数器0,16位,方式3,二进制

movdx,CONTROL

outdx,al

movax,1000

movdx,COUNT0

outdx,al;计数器低字节

moval,ah

outdx,al;计数器高字节

moval,76h;01110110B;计数器1,16位,方式3,二进制

movdx,CONTROL

outdx,al

movax,100

movdx,COUNT1

outdx,al;计数器低字节

moval,ah

outdx,al;计数器高字节

movbx,4*ICW2;中断号

movax,code

shlax,4;x16

addax,offsetIEnter;中断入口地址(段地址为0)

mov[bx],ax

movax,0

incbx

incbx

mov[bx],ax;代码段地址为0

callIInit

movax,data

movds,ax

sti

LP:

;等待中断

moval,left

movah,0

movbx,offsetLEDMAP

addbx,ax

moval,[bx]

oral,80h;使小数点能显示出来

movLEDBuf,al

moval,right

movah,0

movbx,offsetLEDMAP

addbx,ax

moval,[bx]

movLEDBuf+1,al

callDisplayLED

moval,left;用于判断是否倒数到0,先判断左边的一位

cmpal,0;若左边为0,则再判断右边

jnzLP;当两位数都为零,则关中断

moval,right;不必继续循环倒数

cmpal,0

jnzLP

cli

jmpLP

startendp

codeends

endstart

心得体会:

这个题目相对于第一个来说,难度有所提高,设计代码时主要是精度为0.1的设计会比较困难,要用到两级计数器级联;另外就是中断的判断是0ffh而不是0这里一不留神就很容易出错;接着就是设置什么时候停止倒数。

解决以上问题,整份代码就基本出来了。

完成得还不错。

 

B.3温度采集及模拟控制

(参考Lab8000.pdf中的:

硬件实验14、23、26)

1、课程设计要求

利用实验板上的ADC0809做A/D转换器,实验板上的电位器提供模拟温度输入,编制程序,将模拟量转换成二进制数字量,采用中断方式下,A/D转换结束后会自动产生EOC信号,将其与CPU的外部中断相接,编程用中断方式读回A/D结果。

同时,通过8255A控制八段LED数码管控制计数值的显示温度

注意:

1)参考电压

2)将电位器的最大值和最小值对应的模拟量测量出来

2、课程设计目的

(1)熟练掌握ADC0809的功能

(2)熟练掌握8259A外部中断及中断服务程序的设计

(3)熟练掌握8255A方式驱动八段LED数码管

(4)熟练掌握汇编子程序的编写方法

(5)熟练掌握八段LED数码管的控制方式

3、程序框图

4、题目分析

该题目主要是通过电位器产生模拟温度输出,用0809进行转换,并自动产生EOC信号,与8259相接;8259收到信号后,产生中断,通过8255的PA、PB端口作为段和位,输出当前温度。

主要设计:

因为电位器输出不是很稳定,则采用平均采样,每次输出当前温度,先进行16次采样,求出平均值,再输出;为了使显示的温度停留时间加长,采用循环显示1次;由于每次采集温度,都需要启动0809,则在主程序中加了0809的循环启动;因为温度的取值范围为:

0~2^8-1,则,设置显示结果的时候用3个数码管显示,还要对没一位值对应输出等。

 

5、代码如下:

MD8255equ080h;方式0,PA,PC输出,PB输入

PA8255equ8000h;PortA

PB8255equ8001h;PortB

CTL8255equ8003h;8255控制端口

AS0809equ0c000h;AD采样输入片选

ICW1equ00010011b;单片8259,上升沿中断,要写ICW4

ICW2equ00100000b;中断号为20H

ICW4equ00000001b;工作在8086/88方式

OCW1equ11111110b;只响应INT0中断

CS8259Aequ0d000h;8259地址

CS8259Bequ0d001h

LowTempequ0;A/D0

HighTempequ255;A/D255

datasegment

LEDBufdb3dup(?

);显示缓冲

DelayTdb1dup(?

CurTempdb1dup(?

);当前的温度

 

LEDMAP:

;八段管显示码

db3fh,06h,5bh,4fh,66h,6dh,7dh,07h

db7fh,6fh,77h,7ch,39h,5eh,79h,71h

dataends

codesegment

assumecs:

code,ds:

data

 

Delayprocnear

pushax;延时子程序

pushcx

moval,0

movcx,ax

loop$

popcx

popax

ret

Delayendp

DisplayLEDprocnear;数码管显示子程序

movbx,offsetLEDBuf

movcl,3;共6个八段管

movah,00000100b;从左边开始显示

DLoop:

movdx,PB8255;位

moval,0

outdx,al;关所有八段管

moval,[bx]

movdx,PA8255;段

outdx,al

movdx,PB8255

moval,ah

outdx,al;显示一位八段管

pushax

movah,1

callDelay

popax

shrah,1

incbx

deccl

jnzDLoop

movdx,PB8255

moval,0

outdx,al;关所有八段管

ret

DisplayLEDendp

DisplayResultprocnear;结果显示子程序

moval,CurTemp

movah,0

movcl,100;先除以100,商存al,为百位的值

divcl

movch,ah;余数放ch保存起来

movah,0

movbx,offsetLEDMAP

addbx,ax

moval,[bx]

movLEDBuf,al;显示百位值

moval,ch;把余数取出来放al再除以10

movah,0

movcl,10

divcl

movch,ah

movah,0

movbx,offsetLEDMAP

addbx,ax

moval,[bx]

movLEDBuf+1,al;输出十位值

movbx,offsetLEDMAP

moval,ch

movah,0

addbx,ax

moval,[bx]

movLEDBuf+2,al;输出个位值

ret

DisplayResultendp

IInitproc;8259初始化子程序

movdx,CS8259A

moval,ICW1

outdx,al

movdx,CS8259B

moval,ICW2

outdx,al

moval,ICW4

outdx,al

moval,OCW1

outdx,al

ret

IInitendp

IEnterprocnear

pushax

pushdx

callReadTEMP;调用ReadTemp得到平均温度

movdx,PB8255

moval,CurTemp

outdx,al;输出当前温度值

callDisplayResult;显示结果

movDelayT,1

DispAgain1:

;显示

callDisplayLED

decDelayT

jnzDispAgain1

 

movdx,CS8259A

moval,20h;中断服务程序结束指令

outdx,al

popdx

popax

iret

IEnterendp

ReadADprocnear

movdx,AS0809

moval,0

outdx,al

moval,60

rr:

decal;delay延时

jnzrr

movdx,AS0809

inal,dx;读出AD采样的二进制数据

ret

ReadADendp

ReadTempprocnear;求平均温度子程序

movbx,0

movcl,16;设置采样的次数

RLoop:

callReadAD;调用ReadAD子程序

movah,0

addbx,ax;把采样的16次数据全部加起来

deccl

jnzRLoop

shrbx,4;除以16求平均值

movax,bx;ax存放的是AD的平均采样数据

movcl,HighTemp-LowTemp

mulcl

moval,ah;/256

addal,LowTemp

movCurTemp,al;得到当前温度

ret

ReadTempendp

startprocnear

movax,data

movds,ax

movCurTemp,0

cli

movax,0

movds,ax

moval,MD8255;写8255控制字

movdx,CTL8255

outdx,al

movbx,4*ICW2;中断号

movax,code

shlax,4;x16

addax,offsetIEnter;中断入口地址(段地址为0)

mov[bx],ax

movax,0

incbx

incbx

mov[bx],ax;代码段地址为0

callIInit

movax,data

movds,ax

movdx,PA8255

outdx,al

sti

again:

;等待中断

moval,0

movdx,AS0809

outdx,al;起动A/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1