微机接口课设报告Word文件下载.docx
《微机接口课设报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《微机接口课设报告Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![微机接口课设报告Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/29/c24c1bbc-80fa-47b5-b985-a60fc1269772/c24c1bbc-80fa-47b5-b985-a60fc12697721.gif)
本程序实现两路数据采集;
一路采集温度信号,一路采集压力信号。
对每一路信号要连续采集8次,然后把8次A/D转化后的平均值显示在数码管上。
左边三位显示压力值,右边三位显示温度值。
●拨码开关:
将拨码开关sw2拨上。
表示将GAL20V8的地址输入A-5接至系统地址线A5;
A-6接至系统地址线A6;
A-7接至系统地址线A7。
●压力实验模块的“压力输出”端接至AD0809的输入端IN0,温度实验模块的“温度输出”端接至AD0809的输入端IN1。
把8255的B1口接至温度实验模块的“占空比输入”端。
●0809的EOC输出端与8259的IRQ0端相连,0809的CS连CS8(3E0H)
●8259的片选CS-1连地址输出CS6(3A0H),8259的INT1连总线输入INYR,8259模块的INT-A连总总线的INTA,8259的SP/1连+5V。
●8255并行模块下方的4个片选信号CS-1、CS-2、CS-3和CS-4分别与地址译码输出模块的对应引脚(实验箱中部的CS-1、CS-2、CS-3和CS-4)链接,最高位8255的B1接占空比输入和led灯,接led灯用于观察占空比是否有效,B7接led灯和蜂鸣器,C0接任意一开关作为启停键。
如按上述连线,则8255的A口、B口、C口和控制口地址分别为200H、204H、208H和20CH;
8259的奇地址是3A8H,偶地址是3A0h。
注意:
在温度实验模块的“占空比输入”端如果长期加上高电平,三端稳压管U3和负载电阻长时间通电加热,温度过高容易引起器件烧坏。
(2)软件编程
数据段:
定义max,db类型,用于存放越界值;
定义Ygewei,db类型,用于存放压力值的个位;
定义yshiwei,db类型,用于存放压力值的十位;
定义ybaiwei,db类型,用于存放压力值的百位;
定义wgewei,db类型,用于存放温度值的个位;
定义Wshiwei,db类型,用于存放温度值的十位;
定义Wbaiwei,db类型,用于存放温度值的百位;
定义ybuff缓冲区,db类型,用于存放八次取样的压力值;
定义wbuff缓冲区,db类型,用于存放八次取样的温度值;
定义c,db类型,用于存放取样次数;
定义s8,db类型,除数8;
定义Afg,db类型,用于标志是否越界。
程序段:
●主程序模块
给变量赋初值,max赋0c8h,即最大越界值为200,c赋0h,s8赋8,afg赋00h,表示未出现越界;
对8255、8259初始化,四片8255初值由高到低为81808080h,然后将0ffffffff送入A口B口,使数码管熄灭,且占空比有效,报警器无效,将0c05060ah,使显示压力值的数码管和显示温度值的数码管显示颜色分别为绿色和红色;
8259初始化icw1,icw2,icw3分别为13h、08h、05h;
设置中断向量,中断类型号位08h,中断服务程序名为pick;
设置中断屏蔽字为00h;
启动0809in0采集数据;
判断是否采集到有越界的数值;
计算平均值并显示结果;
判断是否继续,关闭则暂停,开启则继续。
●中断程序模块
关中断;
判断是否已采满8次,是直接跳至结束中断部分,否继续执行;
判断是否已采到越界值,是直接跳至结束中断部分,否继续执行;
采入压力值;
判断是否越界,是置afg为0ffh,直接跳至结束中断部分,否继续执行;
将采样值存入ybuff;
启动0809in1;
延时;
采入温度值;
将采样值存入wbuff;
启动0809in0;
发中断结束信号;
开中断;
流程图:
●中断服务程序流程图:
●主程序流程图
主要程序代码:
.486p
datasegmentat0use16
org1000h
maxdb?
ygeweidb?
yshiweidb?
ybaiweidb?
wgeweidb?
wshiweidb?
wbaiweidb?
ybuffdb8dup(?
)
wbuffdb8dup(?
cdb?
s8db?
afgdb?
dataends
codesegmentuse16
assumeds:
data,cs:
code
org1600h
beg:
jmpstart
sevencoddb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,
80h,90h,88h,83h,0c6h,0a1h,86h,8eh
start:
movax,data
movds,ax
cli
movmax,0c8h
movc,0h
movs8,8
movafg,00h
moveax,81808080h;
8255初始化
movdx,20ch;
控制口方式字左三片80h,右一片81h
outdx,eax
moveax,0ffffffffh
movdx,200h
outdx,eax;
a口灭灯
;
moveax,0ffffffffh
movdx,204h
b口熄灭,输出占空比,led灭
moveax,0c05060ah
movdx,208h
moval,13h;
8259初始化icw1
movdx,3a0h
outdx,al
calldelayin1
moval,08h;
icw2
movdx,3a8h
movax,05h;
icw4
movax,offsetpick;
中断向量设置,08h号中断
movbx,20h
mov[bx],ax
movax,segpick
mov[bx+2],ax
moval,00h;
中断屏蔽字
movdx,3a8H
outdx,al
movdx,3e0h;
启动0809in0口开始
next:
sti
calldelayint
cmpafg,0ffh
jewarn1
leabx,ybuff
xorax,ax
movcx,8
addby:
addal,[bx]
adcah,0
incbx
loopaddby
movcl,8
divcl;
平均值在al中
movah,0h
movcl,10
divcl
movygewei,ah
movyshiwei,ah;
换码
leabx,sevencod
movybaiwei,al
moval,ygewei
xlat
movygewei,al
moval,yshiwei
movyshiwei,al
moval,ybaiwei
leabx,wbuff
addbw:
adcah,0
loopaddbw
movwgewei,ah
movwshiwei,ah
movwbaiwei,al
moval,wgewei;
movwgewei,al
moval,wshiwei
movwshiwei,al
moval,wbaiwei
movdx,200h;
输出结果
movdx,201h
movdx,202h
movdx,205h
movdx,206h
moval,wgewei
moval,0
in55c:
movdx,207h
moval,0f0h;
占空比输入无效;
灭灯
movdx,20bh
inal,dx
cmpal,00h
jein55c
moval,0ffh;
占空比输入有效;
movc,0
jmpnext
warn1:
movdx,207h;
输出报警
moval,00h
outdx,al;
占空比输入无效;
亮灯
in55cn:
cmpal,0fh
jein55cn
jmpin55c
pickproc
cmpc,8
jenend
jeincc
movdx,3e0h
cmpal,max
jbsavby
movafg,0ffh
jmpincc
savby:
movybuff[bx],al
movdx,3e4h
jbsavbw
savbw:
movwbuff[bx],al
incc:
incc
nend:
moval,20h;
发中断结束信号
iret
pickendp
delayin1proc
pushdx
pushax
pushcx
movcx,200h
loop$
popcx
popax
popdx
ret
delayin1endp
delayintproc
movcx,0h
delayintendp
codeends
endbeg
(3)测试结果与分析
1.关闭启停键,运行程序,占空比输入等亮起,表示无效,数码管显示为000和000;
2.打开启停键,温度值显示为173,表示此时采集到的温度值为173,随时间的推移,温度值逐渐增大,用手摸一下热敏电阻下方的三端稳压管U3,可以感觉到其温度上升;
3.不久之后,温度上升至199便不再上升,此时两个同时led灯亮起,蜂鸣器鸣叫报警,此时说明检测到温度超过允许的最大值,且自动使占空比输入无效;
4.关闭启停键,报警灯熄灭,蜂鸣器停止鸣叫,占空比输入等亮,表示无效;
5.过几分钟后,启动启停键,占空比输入灯熄灭,表示有效,数码管显示温度值为187并逐渐上升,表明重新加热,温度测试完毕;
6.按压压力感应器,数码管压力显示部分数值随手的按压力度增大而减小;
7.用力按压压力感应器,使其结果超过200,数码管显示数值停留在199,此时报警led灯亮起,蜂鸣器鸣叫报警,此时说明检测到压力超过允许的最大值;
8.松开手,关闭启停键,报警灯熄灭,蜂鸣器停止鸣叫;
9.启动启停键,压力显示数值回到000,继续按压压力感应器,显示数值重新开始变化,压力测试完毕。
结果表明,程序运行正确且满足实验要求。
五、课设小结
报告的最后,我来总结一下我的这次微机原理与接口技术课程设计。
课设最初,我像很多同学一样,想图个简单,寒假也可以早点回去,弄个电子钟得了,反正电脑里有源代码,只要看懂并且自己测试成功便可以了。
可是,强烈的自我责任感告诉我,坚决不能浪费一个这样好的锻炼自我能力的机会,我问自己:
“抄人家的程序有意思么?
!
一点挑战性都没有。
”于是,我毅然决定修改实验题目,做数据采集。
正式课设的前一两天,感觉非常迷茫,看了实验指导书的介绍,以及书上我认为存在一定问题的流程图,脑子里乱七八糟,完全无从下手去编程。
首先最重要的一点是不能抽象的思考出程序运行的整个过程,特别是中断服务程序在何时应该被调入,哪些工作应该由主程序做,哪些由中断服务程序完成。
于是,我根据自己对实验要求的理解,一步一步的画出了我自己的流程图,也就是上面的流程图的雏形。
根据流程图编写出了程序。
在这过程中,遇到了一些问题。
令我印象最为深刻的是决定如何采样。
因为0809采样有两路信号,发中断请求却是一个口,这样要在中断服务无程序中判断采样是那一路数据,以及下次启动0809的那一路数据进行转换,这样就比较麻烦。
在做数据采集的同学之间,,我们也讨论过这个问题,有同学的想法是一次中断程序完成一次所有数据的采集,即16个数据,这样的做法我的想法是已经失去了采用中断的意义了。
于是,我的做法是,一次采两个数据,每一路一个,进八次中断完成一整次采集。
另一个印象比较深刻的问题是如何控制输出报警信息以及占空比输入和控制开关键,即设置启停键。
由于我所用到显示的数码管只需六个,即用到了3片8255,于是我便想到用最后一片来完成以上功能,B下口输出占空比,B上口输出报警,C下口设为启停键输入。
完成编程后的在运行过程中,遇到的第一个问题是在求平均数时出现了除发错误,经过检查时被除数计算错误,数值太大导致除法溢出。
在检查与改正的过程中,我不知不觉中又复习了一遍算数运算过程。
所以说,课设的过程也是是一个学习的过程,更是一个复习的过程。
你说我怎么能放弃这么好的一个过程呢!
之后进行的调试就比较顺利了,由于有了流程图,编写出的程序严格地按照流程图运行,因此运行结果也不会错得太离谱。
这次课设,首先,我感到很欣慰,因为我选择了自己完成课设,并且达到了目的。
其次,我感到很高兴,因为通过这次课设,不管是在理论学习上还是在实践应用上,我的能力都得到了进一步的提高,这些都是以后在职场上拼杀的本钱!
有了这些,我才能在职场中脱颖而出!
最后,感谢老师给我们安排这次机会,让我们得到成长!
计算机0802龚科
2011年1月8日