ADC0809模拟量采集实验报告Word文档下载推荐.docx
《ADC0809模拟量采集实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ADC0809模拟量采集实验报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
CODE,DS:
DATA
START:
MOVAX,DATA;
初始化,取段基址
MOVDS,AX
MOVDX,OFFSETCRT;
AX←CRT段基址
MOVAH,09H;
DOS9号调用,显示提示信息
INT21H
LAB:
MOVDX,IO0809A;
DX←IN0端口地址
OUTDX,AL;
启动A/D转换
MOVCX,0FFFFH;
CX=FFFFH
DELAY:
LOOPDELAY;
调延时子程序
INAL,DX;
AL←IN0端口数据
MOVBL,AL;
BL←AL,暂存IN0端口数据
MOVCL,4;
CL=4
SHRAL,CL;
AL内容右移4位,
CALLDISP;
调显示子程序,显示高四位
MOVAL,BL;
AL←BL,IN0端口数据
ANDAL,0FH;
“与”操作,屏蔽高4位
CALLDISP;
调显示子程序,显示低四位
MOVAH,02;
DOS2号调用
MOVDL,20H;
DL=20H,“空格”的ASCII码
INT21H;
显示空格
PUSHDX;
DX进栈保护
MOVAH,06H;
DOS6号调用,有键按下退出
MOVDL,0FFH;
DL=FFH
INT21H;
执行键盘输入操作
POPDX;
DX出栈
JELAB;
ZF=1,没有键按下,转到标号LAB继续从IN0端口输入数据
MOVAX,4C00H;
返回DOS
INT21H
DISPPROCNEAR;
显示字符子程序
MOVDL,AL;
DL←AL
CMPDL,9;
DL内容与9比较
JLEDDD;
DL≤9,转到标号DDD
ADDDL,7;
DL>9,DL←DL+7
DDD:
ADDDL,30H;
DL←DL+30H,转换成ASCII码
显示字符
RET
DISPENDP
CODEENDS
ENDSTART;
结束
七.编译过程
DAC0832控制直流电机转速
(1)学习并掌握DAC0832的性能及编程方法。
(2)了解直流电机速度控制的基本原理。
直流电机的转速是由0832的Ub输出脉冲的占空比例来决定的,正向占空比例越大,电机转速越快,反之越慢,如图4.12所示。
0832的输出Ub为双极性,当输入量小于80H时,输出为负,电机反转。
等于80H时,输出为0,电机停止转动。
大于80H时,输出为正,电机正转。
本实验0832输出的数字量只需要两个数值80H和FFH,80H对应电机反转,FFH对应电机正转,通过不同的延时时间达到改变电机转速的目的。
如图4.12所示,0832输出端Ub与直流电机Uj端相连,CS接地址端口2A0H~2A7H。
8255的PC0~PC5分别与开关K0~K5相连,CS接地址端口280H~287H。
0832输出80H的持续时间是不变的,输出FFH的持续时间越长,电机转动时的速度就越快。
持续时间长短,可以利用开关用K0~K5来控制,共5个档,达到使电机加速、减速的目的。
K0对应的速度最慢,K5对应的速度最快。
程序流程图如图4.13所示。
DATASSEGMENT;
IOPORTEQU0D880H-280H;
IO0832AEQUIOPORT+2A0H;
0832地址
IO8255CEQUIOPORT+282H;
8255端口C口地址
IO8255TEQUIOPORT+283H;
8255控制口地址
BUF1DW0;
预留字单元
BUF2DW0;
K0~K5ARESPEEDSWITCH'
,0DH,0AH
K0ISLOWESTSPEED'
K5ISHIGHESTSPEED'
,0DH0AH
STIRANYSWHITCH,VIEWELECTRICMORTORSPEED'
;
STACKSSEGMENT;
堆栈段
DB100DUP(?
)
STACKSENDS
CODESEGMENT;
DATA,SS:
STACKS,ES:
MOVES,AX
MOVAX,STACKS
MOVSS,AX
MOVDX,OFFSETCRT;
DX←CRT首地址
DOS9号调用
INT21H;
显示提示信息
MOVDX,IO8255T;
DX←8255控制口地址
MOVAL,8BH;
AL=8BH,控制字
OUTDX,AL;
设置8255端口C输入
LLL:
MOVAL,80H;
AL=80H
MOVDX,IO0832A;
DX←0832端口地址
0832输出80H,对应0V
MOVAH,06h;
DOS6号功能调用,判断是否有键按下?
INT21H
JEINTK;
ZF=1,表示没有键按下没,转到标号INTK
MOVAH,4CH;
ZF=1,表示有键按下,返回DOS
INT21H
INTK:
MOVDX,IO8255C;
DX←8255端口C地址
INAL,DX;
AL←开关状态
TESTAL,01H;
测试PC0=1?
JNZK0;
ZF=0,则PC0=1,表明拨动了K0开关,转到标号K0
TESTAL,02H;
测试PC1=1?
JNZK1;
ZF=0,则PC1=1,表明拨动了K1开关,转到标号K1
TESTAL,04H;
测试PC2=1?
JNZK2;
ZF=0,则PC2=1,表明拨动了K2开关,转到标号K2
TESTAL,08H;
测试PC3=1?
JNZK3;
ZF=0,则PC3=1,表明拨动了K3开关,转到标号K3
TESTAL,10H;
测试PC4=1?
JNZK4;
ZF=0,则PC4=1,表明拨动了K4开关,转到标号K4
TESTAL,20H;
测试PC5=1?
JNZK5;
ZF=0,则PC5=1,表明拨动了K5开关,转到标号K5
JMPLLL;
无条件转到标号LLL
K0:
MOVBUF1,0FFFFH;
BUF1=FFFFH,延时时间常数
MOVBUF2,9000H;
BUF2=9000H,延时时间常数
MOVCX,BUF1;
DELAY1:
LOOPDELAY1;
CX-1→CX,CX≠0,转到标号DELAY1
MOVAL,0FFH;
AL=FFH,对应0832输出+5V
OUTDX,AL
MOVCX,BUF2;
CX=9000H
DELAY2:
LOOPDELAY2;
CX-1→CX,CX≠0,转到标号DELAY2
K1:
MOVBUF2,0A000H;
BUF2=A000H,延时时间常数
JMPDELAY;
无条件转到标号DELAY
K2:
MOVBUF2,0B000H;
BUF2=B000H,延时时间常数
K3:
MOVBUF2,0E000H;
BUF2=E000H,延时时间常数
K4:
MOVBUF2,0F000H;
BUF2=F000H,延时时间常数
K5:
MOVBUF2,0FFFFH;
BUF2=FFFFH,延时时间常数
JMPDELAY
ENDSTART;
加法程序
学习并掌握数据传送和算术运算指令的用法。
编写多位十进制数相加程序。
将两个多位十进制数28056,47193相加,并在屏幕上显示加数、被加数、和。
要求两个操作数均以ASCII码形式各自顺序存放在DATA1和DATA2内存单元中,并将结果送回DATA1处(低位在前,高位在后)。
三.程序流程图
程序流程如图2.1所示。
两操作数在内存中存放的情况如图2.2所示。
四.参考程序
SHOWMACROB;
宏定义
MOVDL,B;
B为要显示字符的ASCII码
MOVAH,02H
INT21H;
2号功能调用,在屏幕上显示一个字符
ENDM
DATA1DB33H,39H,31H,37H,34H;
被加数47193的ASCII码(倒序存放)
DATA2DB36H,35H,30H,38H,32H;
加数28056的ASCII码(倒序存放)
DATA3DB'
———'
,0DH,0AH,'
$'
DATAENDS
STACKSEGMENTSTACK;
STADB20DUP(?
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT;
代码段
ASSUMECS:
STACK,ES:
MOVAX,DATA;
MOVAX,STACK
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2;
取DATA2(加数)的偏移地址
MOVBX,05;
设置地址指针,BX=5(加数为5位)
SHOW20H;
宏调用,显示“空格”(ASCII码为20H)
CALLDISPL;
调显示子程序
SHOW0DH;
宏调用,“回车”
SHOW0AH;
宏调用,“换行”
MOVSI,OFFSETDATA1;
取DATA1(被加数)的偏移地址
设置地址指针,BX=5(被加数为5位)
SHOW2BH;
宏调用,显示“+”(ASCII码为2BH)
SHOW0AH;
MOVCL,7;
CL=7,显示7个“-”,构成直线
S1:
SHOW2DH;
宏调用,显示“-”(ASCII码为2DH)
LOOPS1;
CX-1→CX,CX≠0,转到标号S1
SHOW0DH
SHOW0AH
MOVDI,OFFSETDATA2;
CALLADDA;
调加法程序
取DATA1的偏移地址,显示两数之和
SHOW20H
BX=5,设置地址指针
DISPLPROCNEAR;
显示子程序
DS1:
SHOW[SI+BX-1];
宏调用,倒序显示数据
DECBX;
BX←BX-1
JNZDS1;
BX≠0,转到标号DS1,继续显示数据
DISPLENDP
ADDAPROCNEAR;
加法子程序
MOVDX,SI;
DATA1的偏移地址传送给DX
MOVBP,DI;
DATA2的偏移地址传送给BP
AD1:
SUBBYTEPTR[SI+BX-1],30H;
将ASCII码转化为十六进制数,并存入DATA1
SUBBYTEPTR[DI+BX-1],30H;
将ASCII码转化为十六进制数,并存入DATA2
DECBX;
JNZAD1;
BX≠0,转到标号AD1,继续转换
MOVSI,DX;
SI←DATA1的偏移地址
MOVDI,BP;
DI←DATA2的偏移地址
MOVCX,05;
CX=5,设置计数常数
CLC;
清除进位表示,CF=0
AD2:
MOVAL,[SI];
AL←DATA1中的低位数
MOVBL,[DI];
BL←DATA1中的低位数
ADCAL,BL;
带进位相加
AAA;
十进制调整
MOV[SI],AL;
将结果保存到DATA1中
INCSI;
指向下一位
INCDI
LOOPAD2;
CX-1→CX,CX≠0,转到标号AD2,继续加法
AD3:
ADDBYTEPTR[SI+BX-1],30H;
将十六进制转化为ASCII码
ADDBYTEPTR[DI+BX-1],30H
JNZAD3;
BX≠0,转到标号AD3,继续转换
ADDAENDP
ENDSTART
五.编译过程
结果=75249
乘法程序
掌握乘法指令和循环指令的用法,编写十进制数乘法程序
实现十进制数的乘法。
被乘数(29054)和乘数(3)均以ASCII码的形式存放在内存中,要求在屏幕上显示乘数、被乘数、积。
程序流程如图2.2所示。
程序执行前数据在内存中的存放情况如图2.4所示,程序执行后数据在内存中的存放情况如图2.5所示。
2.3两数相乘程序流图
SHOWMACROB;
宏定义
MOVDL,B;
MOVAH,02H;
INT21H
DATA1DB32H,39H,30H,35H,34H;
被乘数29054的ASCII码
DATA2DB33H;
乘数3的ASCII码
RESULTDB6DUP(00H);
预留6个字节单元
STACKSEGMENT;
STADB20DUP(?
SI←DATA1(被乘数)的偏移地址
MOVCL,5;
CL=5,设置计数常数
宏调用,显示一个“空格”
调显示子程序,显示被乘数
SHOW0DH;
SHOW2AH;
宏调用,显示乘号“*”
MOVSI,OFFSETDATA2;
SI←DATA2(乘数)的偏移地址
MOVBL,[SI];
BL←乘数,BL=33H
ANDBL,00001111B;
屏蔽乘数ASCII码的高四位,BL=3
MOVCL,1;
CL=1
调显示子程序,显示乘数
MOVCL,7;
CL=7
宏调用,显示7个“-”,构成直线
CX-1→CX,CX≠0,转到标号S1
SI←DATA1被乘数首地址
MOVDI,OFFSETRESULT;
DI←乘积首地址
MOVAX,00H;
AX=0
MOVCX,05;
LOOP1:
MOVAL,[SI];
依次将被乘数的各个位传送给AL
ANDAL,00001111B;
屏蔽被乘数ASCII码的高四位,转换为十六进制数
INCSI;
SI←SI+1,指向下一个单元
MULBL;
AX←AL×
BL
AAM;
乘法的ASCII码调整指令
ADDAH,[DI];
加进位
AAA;
加法的ASCII码调整指令
MOV[DI],AH;
将结果高八位送入指定的存储器单元
INCDI;
指向下一个单元
MOV[DI],AL;
将结果低八位送入指定的存储器单元
LOOPLOOP1;
CX-1→CX,CX≠0,转到标号LOOP1
MOVSI,OFFSETRESULT;
SI←乘积首地址
MOVCX,06;
CX=6
LOP:
MOVDL,[SI];
DL←依次取乘积
ADDDL,30H;
DL←DL+30H,转换为ASCII码
MOV[SI],DL;
原单元←乘积的ASCII码
LOOPLOP;
CX-1→CX,CX≠0,转到标号LOP
SI←乘积首地址
MOVCL,6;
CL=6