扬大微机课设报告数据采集.docx
《扬大微机课设报告数据采集.docx》由会员分享,可在线阅读,更多相关《扬大微机课设报告数据采集.docx(17页珍藏版)》请在冰豆网上搜索。
扬大微机课设报告数据采集
扬大微机课设报告-数据采集
扬州大学
微机原理及应用课程设计报告
题目数据采集
班级
学号
姓名
同组成员
指导教师
成绩
2015.07.10
三、部分电路设计
LED显示单元的接线:
A/D转换单元:
8255连接LEDADC0809连接880386及输入电压
PA0-----------AD0~D7---------------XD0~XD7
PA1------------BA、B、C--------------GND
PA2------------CIN0---------------ADJ(0~5V)
PA3------------DWR---------------IOW#
PA4------------ERD-----------------IOR#
PA5------------FCS---------------IOY1
PA6------------GCLK---------------CLK
PA7------------DP
串行单元的接线:
喇叭报警器:
8255连接803868254连接80386,ADC0809
D0~D7-------------XD0~XD7D0~D7------------------XD8~XD15
PB0~PB5---------X1~X6A0~A1------------------XA1~XA2
CS-----------------IOY3CS-----------------------IOY2
A0~A1-----------XA1~XA2CLKO-------------------CLK
WR---------------IOW#WR----------------------WR
RD----------------IOR#RD----------------------RD
GATE0----------------+5V
OUT0--------------------SPK
四、硬件接线图
图1ADC0809连线图
图28255A连线图
图38254连线图
五、软件设计流程图
1.根据功能需求,系统主程序主要包括初始化程序、A/D转换子程序、显示子程、BCD转换子程序和报警子程序。
主程序流程图见图4所示
图四:
主程序流程图
2.A/D转换子程序用来控制对ADC0809对电压数据的采样和模拟输入电压的转换,并将对应的数值存放到相应的数据段BCD字节单元,供CPU取出显示到LED单元。
数据的读取方式可以采用延时等待的方式,ADC0809的转换控制如下:
选择通道并启动转换→等待中断→读取转换结果。
A/D转换子程序的程序流程图如图5所示。
图5:
AD转换
3.显示子程序跟BCD码转换子程序
显示子程序采用动态扫描法实现三位数码管的数值显示。
测量所得的A/D转换数据放在数据段BCD字节存储单元,测量数据在显示时需要转换为十进制BCD码放在TABLE1表中。
由于ADC0809是将模拟信号转换为数字信号,所以要将数字信号转换为对应的电压值,公式为V=DATA/51。
转换时取一位整数和两位小数,再将数据转换为显示码就可以输出显示了。
三位数据显示程序流程图如图6所示。
显示子程序中调用了BCD码转换子程序,BCD码转换程序是将数据转换为BCD码值。
显示子程序是将数据一次性输出,主要是将对应的段码和位码输出,注意小数点的处理。
延时子程序利用8254计时,用8255来查询计时是否完成。
BCD码转换子程序流程图见图7所示。
Y
N
N
Y
Y图7BCD转换子程序流图
N
图6三位数据显示程序流程图
4.报警子程序
报警子程序是接受8254的信号来发出警告的。
当采样的平均值超过4.5V时,8254将会发一路信号给SPK喇叭,喇叭发出声响警告。
报警子程序流程图如图8所示。
N
Y
图8报警子程序流程图
六、程序段功能汇总
(1)ADC0809的IN0端口地址为:
640H,8255A的端口地址为:
A口:
6C0H、B口:
6C2H、C口:
6C4H、控制口:
6C6H。
(2)首先启动一次A/D转换,将转换结束后将采集数据保存到存储器中。
;A/D转换子程序
GET:
MOVBX,0
MOVCX,5
LOOP1:
MOVDX,0640H;AD转换器的端口地址
OUTDX,AL;启动AD转换器
CALLDALLY;等待延迟
INAL,DX;从AD转换器的端口地址读出数据
XORAH,AH;AX高八位AH清0
ADDBX,AX;将读出的数据进行累加
LOOPLOOP1;读5次数据进行累加
MOVAX,BX
MOVDL,5;为了数据精确求取5次的平均值
DIVDL
MOVAVERAGE,AL;送入变量单元内
LEASI,AVERAGE
(3)将采集到的数据转换为十进制数,转换好的三位十进制数据分别保存于存储器的显示缓冲区中。
;BCD转换子程序
CHBCD:
LEABX,TABLE1
LEASI,BCD
MOVCX,3;实现三位数码管的数值显示,依次送个位和小数点后的两位
MOVAL,AVERAGE
XORAH,AH
LOOP2:
MOVDL,51;(X/5)256=得到的二进制电压值,变成十进制数的话是逆过程,256/5=51,所以除以51得到十进制电压
DIVDL;平均值除以51
XLAT
MOV[SI],AL;求bcd码送入对应BCD单元
INCSI
MOVAL,AH
XORAH,AH
MOVDL,10
MULDL
LOOPLOOP2;精确到小数点后两位
(4)8254初始化,8254的端口地址设为680H~686H,通道0的工作方式设定为方式3,初值为1000,8255A的PC3初始电平设为低电平。
(5)数据显示完毕之后,判断缓冲中采集数据是否大于[(4.5/5)*255]=229(用数字0~255的范围来模拟电压0~5V的范围,4.5V相当于十进制数的229),如果是则将PC3置位高电平,8254输出方波驱动扬声器发声报警。
;报警程序段
JUG:
PUSHCX
PUSHAX
MOVAL,AVERAGE;取出之前存入的平均值,放进AL
CMPAL,0E5H;4.5V占比重0.9,256*0.9=226用16进制表示为0E5H
JNBNEXT2;超过4.5V的警戒值,启动报警
MOVDX,0686H
MOVAL,36H
OUTDX,AL
MOVAL,0
OUTDX,AL
JMPNEXT3
NEXT2:
MOVDX,0686H;8254的端口初始化,
MOVAL,36H;00110110B计数器0,读写高低位,采用方式3二进制计数
OUTDX,AL
MOVAX,2000
MOVDX,0680H;计数器0送初值
OUTDX,AL
MOVAL,AH
OUTDX,AL
CALLDALLY
NEXT3:
POPAX
POPCX
RET
七、程序清单
SSTACKSEGMENTSTACK
DW64DUP(?
)
SSTACKENDS
PUBLICBCD
DATASEGMENT
TABLE1DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;数码管表
;对应012345数码管共阴极
BCDDB0,0,0
AVERAGEDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
CALLGET
CALLJUG;判断是否大于4.5
CALLCHBCD
CallPRT1
CALLPRT;调用显示子程序
JMPSTART
;BCD转换子程序
CHBCD:
LEABX,TABLE1
LEASI,BCD
MOVCX,3;实现三位数码管的数值显示,依次送个位和小数点后的两位
MOVAL,AVERAGE
XORAH,AH
LOOP2:
MOVDL,51;(X/5)256=得到的二进制电压值,变成十进制数的话是逆过程,256/5=51,所以除以51得到十进制电压
DIVDL;平均值除以51
XLAT
MOV[SI],AL;求bcd码送入对应BCD单元
INCSI
MOVAL,AH
XORAH,AH
MOVDL,10
MULDL
LOOPLOOP2;精确到小数点后两位
;A/D转换子程序
GET:
MOVBX,0
MOVCX,5
LOOP1:
MOVDX,0640H;AD转换器的端口地址
OUTDX,AL;启动AD转换器
CALLDALLY;等待延迟
INAL,DX;从AD转换器的端口地址读出数据
XORAH,AH;AX高八位AH清0
ADDBX,AX;将读出的数据进行累加
LOOPLOOP1;读5次数据进行累加
MOVAX,BX
MOVDL,5;为了数据精确求取5次的平均值
DIVDL
MOVAVERAGE,AL;送入变量单元内
LEASI,AVERAGE
MOVBL,[SI]
;源程序,显示程序段
PRT:
MOVDX,06C6H;初始化8255
MOVAL,80H;10000000BABC输出方式
OUTDX,AL
MOVCX,100H
LOOP3:
LEASI,BCD
MOVAH,0FEH;置位码
LOOP4:
MOVAL,AH
MOVDX,06C2H;初始化B口
OUTDX,AL
MOVAL,[SI]
CMPAH,0FEH
JNZNEXT1
ORAL,80H;最高位置1小数点点亮
NEXT1:
MOVDX,06C0H;初始化A口
OUTDX,AL
CALLDALLY
ROLAH,1
INCSI
CMPAH,0F7H
JNZLOOP4
LOOPLOOP3
RET
DALLY:
PUSHCX;延时程序
PUSHAX
MOVCX,10H
A77:
MOVAX,10H
A88:
DECAX
JNZA88
LOOPA77
POPAX
POPCX
RET
;报警程序段
JUG:
PUSHCX
PUSHAX
MOVAL,AVERAGE;取出之前存入的平均值,放进AL
CMPAL,0E5H;4.5V占比重0.9,256*0.9=226用16进制表示为0E5H
JNBNEXT2;超过4.5V的警戒值,启动报警
MOVDX,0686H
MOVAL,36H
OUTDX,AL
MOVAL,0
OUTDX,AL
JMPNEXT3
NEXT2:
MOVDX,0686H;8254的端口初始化,
MOVAL,36H;00110110B计数器0,读写高低位,采用方式3二进制计数
OUTDX,AL
MOVAX,2000
MOVDX,0680H;计数器0送初值
OUTDX,AL
MOVAL,AH
OUTDX,AL
CALLDALLY
NEXT3:
POPAX
POPCX
RET
CODEENDS
ENDSTART
八、实验结果及分析
实验是通过转动ADJ单元上的旋钮调节输入的电压的,旋钮输出的电压经过AD转换器后转换成具体的数值。
当输入的电压平均值在4.5v以下时喇叭没有警告的声音发出。
当转动旋钮使电压超过4.5v时,喇叭有报警的声音发出。
报警声音的音调跟送入的频率有关,频率越高音调越高。
实验成功。
九、课程设计体会和总结
此次的微机原理课程设计,在学期基础实验的基础上提高了我们对于微机原理的实际应用要求,在不断的深入理解理论知识的基础上,我们这组同学通过不断的修改和调试最终成功的运行了我们的程序,达到了老师对于此次课程设计的要求。
通过这一个星期的课程设计,我对于微机原理这门课程的掌握程度以及实际的应用能力都有了一定程度上的提高。
组员之间的共同合作,不同的分工,我们各司其职,默契配合,共同解决面临的难题,共同分享成功的喜悦。
在实践的检验中,我们学到的知识得到了有效的巩固,动手的能力,独立思考的能力,团队合作的能力都得到了有效的锻炼。
在设计的过程当中我们也遇到了很多的问题。
一开始的时候我们的接线遇到了问题,碰到LED的显示的时候并不知道怎么办才好。
经过学习之后懂得了LED灯的原理终于有所突破。
至于8255A芯片和8254我们都很熟悉根本不算什么难的问题。
接线图完成之后就开始进行编程。
汇编的东西我们又重新的温习了一边。
在编程的过程当中我发现单独的模块来说我们都可以很好地完成但是涉及到系统性的东西就很不容易,后来想了想原因就是我们很少写完整的程序都是写的具体的某一个功能的程序片段。
这次涉及到完整的程序我们的进度显然是慢了些。
但是后来经过数次的调整终于没有了大的问题。
就在即将验收的时候我们忽略了一个重要的问题,就是我们没有将十六进制的采集到的电压在LED灯上显示,只是显示了转换成BCD码的数值,后来又经过一番的调整终于完成了。
我们大家都很高兴。
尽管这次的设计过程很简单,但是我们每个人心中都是很开心的。
这次课程设计培养了我们的动手能力,系统的运用了我们之前学过的知识,加深了我们对于微机原理的理解。