王晶晶Word文档下载推荐.docx
《王晶晶Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《王晶晶Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
串行(RS232/RS485)通信程序,数据处理程序等。
6.下位机程序:
串行(RS232/RS485)通信程序,执行部件控制程序。
a>
绪论,概述
我们选做的题目是“病人监控系统”,下位机负责实时采集病人的心率,并发送给主机。
主机对接受的数据处理:
判断是否正常(50-80),若出现不正常,就会有警报声,且警报灯会闪烁。
并且,显示屏上有“normal”、“abnormal”的显示。
实验用到双工串行通信,A/D转换,并行通信。
实验用到的接口芯片有:
8251、8253、8255、ADC0809
b>
实施计划及分工
我们把任务大体分成四个部分:
界面、串行通信、声光报警、AD转换。
每个人对负责的模块承担主要任务,同时我们也探讨疑难问题。
C>
按照功能模块编程调试
1、界面调试程序:
playmacroA,B;
定义宏,该宏的功能是在指定光标处显示输出设定属性的字符
movdx,A;
运用宏可以简化代码
movah,2
int10h
movah,15
moval,03h
movbl,0ch
movcx,B
movah,9
endm
datasegment
h1db0ah,0dh
db0ah,0dh,'
PATIENTMONITORSYSTEM'
Thisisapatientmonitorsystem,monitoring'
03h,03h,03h,03h
Iftherateismorethen120orlessthen50,'
display"
abnormal"
andalarm.'
Elsedisplay"
normal"
.'
db0ah,0dh
MadebyPengFangWangJingjingHuHuanLeiLiuYing.'
'
01h,01h,01h,01h,'
2005.9.5HUSTCS0203$'
h2db0ah,0dh
db0ah,0dh,11h,'
pressanykeytostart'
pressESCtoquit$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movah,0
moval,3
int10h;
设置成80×
25彩色文本方式
play0000h,80;
输出第一行边框
movdx,0314h;
设置光标位置
int21h
leadx,h1;
输出提示信息
movah,9
int21h
play0307h,3;
输出用红心符号排列组成的红十字标志
play0407h,3
play0505h,7
play0605h,7
play0707h,3
play0807h,3
play0b00h,80
leadx,h2;
提示用户输入信息
movah,8;
8号中断调用,停住界面
movah,6;
清屏
moval,0
movbh,10
movcx,0
movdh,24
movdl,79
movah,15;
设置光标位置
movdx,0
movax,4c00h;
程序退出
codeends
endstart
2、二进制转换成十进制显示
功能分析:
下位机采集的数据在机器内是二进制表示的,为能及时给用户反映信息,必须在显示器上显示出来。
而屏幕上是以字符串的方式显示的。
因此,必须把二进制值转换成十进制字符串所对应的ASCII码。
调试程序:
输出bufb中的值
stacksegment
db200dup(0)
stackends
pdb10
bufadb8dup(0)
bufbdb20,30,139,134,60
resultdb?
assumecs:
code,ss:
stack,ds:
data
start:
movcx,5;
送要转换的个数
leadi,bufb;
待转换的二进制的存储区首址给di
lopa:
moval,[di];
待转换字符送al
leasi,bufa;
转换后字符区首地址给si
callf2t10;
调用f2t10进行二十进制转换
mov[si],byteptr0dh;
在末尾加回车换行
mov[si+1],byteptr0ah
mov[si+2],byteptr'
$'
leadx,bufa;
显示转换后的十进制数
incdi;
指向下一个待转换的二进制数
looplopa;
若cx不为0,则转lopa继续转换
movah,1
movah,4ch
;
*********f2t10子程序********************
f2t10proc
pushcx
pushdx
lop1:
movah,0;
除以10,所得的商存al,余数入栈,并记录余数的个数
divp
movresult,al
moval,ah
movah,0
pushax
inccx
moval,result
oral,al;
若商不为0则转lop1继续循环
jnelop1
lop2:
popax;
从栈中弹出一位十进制
addal,30h;
转换成对应的ASCII码
mov[si],al;
存入转换后字符存储区
incsi;
指针后移
deccx
jnelop2;
未转换完则继续循环
popdx;
恢复现场
popcx
ret
f2t10endp
3、AD转换
芯片ADC0809引脚功能介绍:
D0-D7:
数字量输出信号线
IN0-IN7:
8路模拟量输入信号线
ALE:
地址锁存允许信号,用于锁存通道号。
START:
启动转换信号,正脉冲有效。
EOC:
转换结束状态信号,高电平有效,转换结束时为高电平。
OE:
允许输出信号,高电平有效。
部分代码:
input:
movtemp,al;
保存通道号
jmpbegin
begin:
movdx,30eh;
送通道号
moval,temp
outdx,al
movcx,0f00h
lop:
looplop
movdx,30ch;
启动A/D转换
moval,00
movcx,0f00h;
delay
looplop1
movah,0ch;
检测是否有ESC键按下
incal
jnzwait1;
若无键按下,则查转换结束
movah,8;
若有ESC键按下,则程序退出
cmpal,1bh
jzquit
wait1:
查转换结束EOC(EOC=D7)
inal,dx
andal,80h
jzwait1;
若未结束(D7=0),则等待
read:
若已结束,则读数据
pushax;
存数据
4、双工通信:
下位机与主机间的通信
主机的接收代码:
receiv:
movdx,ctr151;
接收数据
testal,02;
接收数据准备好?
RXRDY=1?
jzreceiv;
未准备好,即无数据接收,则转按键发送
movdx,data51;
已准备好,即有数据传送过来,则接收1个字符
movc,al
calltranslate
callcomp
calldelay
movah,0bh
cmpal,0
jzreceiv
movah,08h
cmpal,1bh;
是ESC?
jeover;
是,则退出,返回DOS
jmpreceiv;
不是,则接收1个字符后,再转按键发送
over:
moval,0ch;
置PC6=0,关闭8253-5的GATE2,停止输出方波
movdx,303h
下位机的发送代码:
transm:
movdx,ctrl151;
testal,01
jztransm
calladpo
movdx,data51
moval,a
movdl,al
cmpal,00h
jetransm
jeover
jmptransm
体会:
此次接口实验是每4人完成一道题,在此次实验中我感受最深的是团结合作的精神。
首先,我们讨论出了‘病人监控系统’的功能。
然后,进行分工。
分给我的模块是界面部分,我当时想着一定要把界面部分做好点。
因为界面还是挺重要的。
开发一个系统,用户不必要了解内部如何实现的,用户只要知道如何去用,界面的信息是什么意思就可以了。
所以界面部分还是挺重要的。
可等待我做的时候,我才发现用汇编编写界面的程序太难了。
不是编程很难,而是要做出漂亮的界面实在太难。
我只能尽量做好点了。
我们做的是“病人监控系统”,我联想到“红十字会”。
因此,我在界面上用红心排出了一个红十字的标志。
当然,我很快就完成了。
然后,我没有闲着。
我去给partner当打杂的了。
下位机采集的数据在机内是二进制的,主机接收到的数据也是二进制的,为显示出来,必须进行转换。
我编写了二十进制转换的程序。
由于上个学期我们做过双工通信的实验,这次在通信上遇到的问题还不是太大。
因此,很快我们的实验基本功能都已经完成。
可老师检查不通过。
原因是我们没有用到AD转换。
啊,看来我们要返工了。
因为我们原来采取的方法是从键盘输入数据,现在要改成AD转换,那么通信部分就要改动了。
这个时候已经是星期三了,时间紧迫。
唉,后悔当初没有好好听讲,这就要付出代价了。
于是,我们集中力量攻AD转换的程序,真是“团结就是力量”。
虽然以前也没有用过ADC0809芯片,但通过我们自己的琢磨,从零开始,我们还是把它拿下了。
这就是团结的力量。
当然,我从这次的实验中也看出自己存在的不足:
实践能力太差,还很需要努力。
同时,我也在此处感谢同组成员给我的帮助,从她们哪儿我学到了很多。