多路温度采集系统编程设计课程设计报告Word格式文档下载.docx
《多路温度采集系统编程设计课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《多路温度采集系统编程设计课程设计报告Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
![多路温度采集系统编程设计课程设计报告Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/c3e70516-d13f-4d38-b422-29f9bb626c4d/c3e70516-d13f-4d38-b422-29f9bb626c4d1.gif)
2.1实验目的
为了实现计算机对生产过程及对象的控制,需要将对象的各种测量参数按照要求转换成数字信号送入计算机。
经计算机运算处理后再再转换成适合于对生产过程进行控制的量。
所以在微机和生产过程之间,必须设置信息的变换和传递通道。
而我们所做的模拟输入通道,主要功能就是随时间变化的模拟输入信号变成数字信号送入计算机,主要有多路转换器,采样保持器和A/D转换器等组成。
本实验通过设计一个微机控制的温度采集系统,旨在使学生能做到以下几点:
1.了解微机控制的温度采集系统软硬件设计原理和方法。
2.进一步掌握定时/计数器、并行接口芯片和中断控制器的工作原理与使用方法。
3.学会利用A/D转换芯片实现信号的A/D转换。
2.2实验设备
l.80X86系列微机一台。
2.微机硬件实验平台。
3.定时/计数器8254
4.ADC0809。
2.3实验内容及要求
(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;
(2)、基于80x86微机接口的控制器硬件电路设计与调试;
(3)、功能要求:
具有报警功能(如:
声、光、电形式),系统可实现6路温度信号的巡回采集检测、各路巡回检测的温度范围0~1020CO(温度信号用电位器可调电压模拟);
4、指标要求4CO对应数字量为01H)、每隔2s检测一次,每一路连续检测5次,取其中值,当前温度用4位数显示在计算机显示屏幕上,6路同时显示,每2s刷新一次显示。
显示方式为:
例:
1号炉温度:
0800CO
2号炉温度:
1000CO
3号炉温度:
0700CO
4号炉温度:
0800CO
5号炉温度:
0650CO
6号炉温度:
0870C
在许多传统行业中,多路高温度采集系统是不可或缺的。
电厂,石化行业及制药厂等企业生产过程中,普遍存在着需要进行温度测量的场合。
因为温度是生产过程和科学实验中普遍且重要的物理参数。
在工业生产中,为了高效生产,必须对生产过程的主要参数,如温度,压力,速度等进行有效的检测并控制。
其中温度检测在生产过程中占有相当大的比例。
而我们所做的课题正是以8086cpu为核心设计一个温度巡回监测系统(A/D采用ADC0809).系统可实现温度信号的采集,在显示器上显示当前的温度和通道号。
模拟现场六路温度巡回检测,温度范围0-1020摄氏度。
每隔两秒检测一次,每一次检测六路信号,每路信号连续检测五次,并取这五个数据的中值经标度变换后送显示器显示,6路同时显示,每次显示持续两秒。
在采集完某一路信号时,将采集到的信号与给定值比较,如果超出给定范围则进行报警。
该系统主要用于温度检测,是一个状态反馈系统,并非动态控制系统。
他可以利用放大器实现多个点的温度巡回检测,并在屏幕上显示当前的温度值和通道号。
当温度信号改变时,显示的值也随之改变,并且实现当温度超出给定范围时进行报警的功能。
3.2程序设计流程图
Y
N
N
Y
第四章硬件设计
系统的主要功能是实现温度信号的采集,在显示器上显示当前的温度和通道号。
模拟现场六路温度的温度巡回检测,温度范围0-1020摄氏度。
每隔两秒检测一次,经标度变换后送显示器显示,六路同时显示,每次显示持续两秒。
实验步骤如下:
(1)确认从PC机引出的两根扁平电缆已经连接在试验平台上。
(2)编写程序然后编译连接。
(3)参考接线图连接试验线路。
(4)运行参考程序,观察显示器上的通道号和温度值。
(5)改变温度的值观察是否实现报警功能。
4.2硬件接线图
4.3所用到的芯片及其各自功能说明
4.3.1芯片列表
可编程定时器/计数器8254,ADC0809
Intel8086CPU是16位微处理器,它采用N—沟道,耗尽型负载的硅栈工艺制造,外型为双列直插式,有40个引脚。
8086CPU有16根数据线和20根地址线,直接寻址空间为1MB。
能够完成微型计算机的基本操作数的读取,指令的执行,中断控制等基本功能。
4.3.38254的功能简介
18254的内部结构
8254采用NMOS工艺制成,有24个引脚,所有输入、输出端均TTL电平兼容,单一电源(Vcc=+5V)供电,最高计数速率为2.6MHz。
它包括3个计数器(即计数器0、1、2)、数据总路线缓冲器、读/写逻辑以及控制寄存器等4个部分。
②8254的外部引脚
图3.38254引脚图
A1、A0:
地址输入线,用来址8254内部的4个端口,即3个计数器和1个控制字寄存器与CPU系统地址线相连。
CLK0、CLK1、CLK2:
时钟脉冲输入端,用于输入定时脉冲或计数脉冲信号。
CLK可以是系统的时钟脉冲,也可以由系统时钟分频或者其他脉冲源提供。
当用于定时时,这个脉冲必须是均匀的、连续的、周期精确的,而用于计数时,这个脉冲可以是不均匀的、断续的、周期不定的。
GATE0、GATE1、GATE3:
门控输入端,用于外部控制计数器的启动计数和停止计数的操作。
两个或两个以上计数器连用时,可用此信号同步,也可用于与外部某信号的同步。
OUT0、OUT1、OUT2:
计数输出,当计数器从初值开始完成计数操作进,OUT引脚输出相应的信号。
③8254的工作方式
方式0:
减1计数到0,产生中断请求信号。
方式1:
减1计数到0,产生可重复触发的单稳态负脉冲信号。
方式2:
减1计数到1,分频器(速率信号发生器)。
方式3:
减1计数到初值的1/2,方波发生器。
方式4:
减1计数到0,软件触发产生选通负脉冲信号。
方式5:
减1计数到0,硬件触发产生选通负脉冲信号。
④8254方式控制字格式
D7D6
D5D4
D3D2D1
D0
00选计数器0
01选计数器1
10选计数器2
00计数器锁存
01只读写低8位
10先读写高8位
11先读写低8位
再读写高8位
000方式0
001方式1
X10方式2
X11方式3
100方式4
101方式5
0二进制计数
1BCD计数
4.3.4ADC0809的功能简介
ADC0809包括一个8位的逐次逼近型的ADC部分,并提供一个8通道的模拟多路开关和联合寻址逻辑,用它可直接输入8个单端的模拟信号,分别进行A/D转换,在多点巡回检测、过程控制等应用领域中使用非常广泛,ADC的主要技术指标为
分辨率:
8位单电源:
+5V
总的不可调误差:
1LSB转换时间:
取决于时钟频率
模拟输入范围:
单极性0~5V时钟频率范围:
10KHZ~1280KHZ
ADC0809的外部管脚如下图所示
ADC0809的外部管脚图
1haoluwenduú
║1020degree
2haoluwenduú
3haoluwenduú
║0720degree
4haoluwenduú
║0608degree
5haoluwenduú
║0248degree
6haoluwenduú
六路温度都在指定的温度范围内,不产生报警时的结果显示
║0000degreeThetemperatureisbelowthan60degree
程序设计为当温度低于60摄氏度时蜂鸣器报警,并且在屏幕上产生相应的提示
3号炉和4号炉温度低于60摄氏度报警
5.2C语言程序结果
1haoluwendu:
1020degree
2haoluwendu:
3haoluwendu:
688degree
4haoluwendu:
592degree
5haoluwendu:
248degree
6haoluwendu:
804degree
676degree
12degreeThetempetureisbelowthan60degree
6.1汇编语言程序
;
***************根据CHECK配置信息修改下列符号值*******************
IOY0EQU0E400H;
片选IOY0对应的端口始地址
IOY1EQU0E440H;
片选IOY1对应的端口始地址
*****************************************************************
MY8254_COUNT0EQUIOY0+00H*4;
8254计数器0端口地址
MY8254_COUNT1EQUIOY0+01H*4;
8254计数器1端口地址
MY8254_COUNT2EQUIOY0+02H*4;
8254计数器2端口地址
MY8254_MODEEQUIOY0+03H*4;
8254控制寄存器端口地址
AD0809EQUIOY1+00H;
AD0809的端口地址
AD0809_MODEEQUIOY1+08H*4;
AD0809的状态口地址
DATASEGMENT;
数据段
DBUFDB100DUP(?
);
数据区
STR1DB'
haoluwendu:
$'
;
显示的字符串
STR2DB'
Thetemperatureisbelowthan60degree$'
;
显示提示信息
STR3DB'
degree$'
FREQ_LISTDW556,495,556,624,495,416,416,371,495,0;
频率表
TIME_LISTDB6,2,4,4,6,2,4,4,12;
时间表
DATAENDS
STACK1SEGMENTSTACK'
STACK'
堆栈段
ST1DB100DUP(?
)
STACK1ENDS
CODESEGMENT;
代码段
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,STACK1
MOVSS,AX
MOVAX,DATA
MOVDS,AX;
DS指向数据区段址
CLD;
清方向标志
MOVAX,0000H
MOVES,AX
MOVAL,50H;
保存原中断向量入口地址
MOVAH,35H
INT21H
PUSHES
PUSHBX
PUSHDS
MOVAX,SEGADINT;
设置中断向量入口地址
MOVDS,AX
MOVDX,OFFSETADINT
MOVAL,50H
MOVAH,25H
POPDS
WAIT1:
INT50H;
中断调用
PUSHCX;
延时
PUSHAX
PUSHDX
PUSHBX
MOVCX,0FFFFH
D1:
MOVAX,0FFFFH
D2:
DECAX
JNZD2
LOOPD1
MOVAH,6:
清屏
MOVAL,0
MOVCX,0
MOVDH,24
MOVDL,79
MOVBH,7
INT10H
MOVAH,2;
置光标到页面左上角
MOVDH,0
MOVDL,0
MOVBH,0
POPBX
POPDX
POPAX
POPCX
MOVAH,1;
判断是否有按键按下
INT16H
JZWAIT1;
无按键则跳回继续等待,有则退出
QUIT:
POPDX;
退出
MOVAX,4C00H;
返回到DOS
中断服务程序,对每个通道均采集一个数据,存进DBUF
ADINTPROCNEAR;
调用子程序
STARTA:
MOVCX,0006H;
设置通道计数器初值
MOVDX,AD0809;
DX指向ADC通道
TRANS2:
CALLNEXT;
调用转换子程序
LOOPTRANS2;
循环采集六路信号
IRET;
自中断返回
ADINTENDP
DALLY1PROCNEAR;
软件延时子程序,用于ADC转换时延时保证转换完成
PUSHCX
MOVCX,4000H
D5:
MOVAX,0600H
D6:
JNZD6
LOOPD5
RET
DALLY1ENDP
DALLY2PROC;
延时子程序,用于8254产生方波时延时,为扬声器发生报警提供信号延时
E0:
MOVCX,10H
E1:
E2:
JNZE2
LOOPE1
DECDL
JNZE0
DALLY2ENDP
ALARMPROC;
报警子程序
MOVDX,OFFSETSTR2;
显示温度低于某一值
MOVAH,9
PUSHDX
PUSHSI
PUSHDI
MOVDX,MY8254_MODE;
初始化8254工作方式
MOVAL,36H;
定时器0、方式3
OUTDX,AL
BEGIN:
MOVSI,OFFSETFREQ_LIST;
装入频率表起始地址
MOVDI,OFFSETTIME_LIST;
装入时间表起始地址
PLAY:
MOVDX,0FH;
输入时钟为1.0416667MHz,1.0416667M=0FE502H
MOVAX,0E502H
DIVWORDPTR[SI];
取出频率值计算计数初值,0F4240H/输出频率
MOVDX,MY8254_COUNT0
OUTDX,AL;
装入计数初值
MOVAL,AH
MOVDL,[DI];
取出演奏相对时间,调用延时子程序
CALLDALLY2
ADDSI,2
INCDI
CMPWORDPTR[SI],0;
判断是否到曲末?
JNEPLAY
退出时设置8254为方式2,OUT0置0
MOVAL,10H
POPDI
POPSI
POPDX
ALARMENDP
NEXTPROC;
信号巡回采集子程序
NEXT1:
MOVSI,OFFSETDBUF;
SI指向WENDU偏移地址
MOVBL,05H;
为采集提供计数依据
NEXT2:
MOVAH,0000H
启动一次转换
CALLDALLY1;
延时保证转换完成
INAL,DX;
读取结果
TRANS:
MOV[SI],AL将采集的5个数据保存
INCSI
DECBL
JNZNEXT2
选中值
MOVCL,04H;
选出五个数中的最大值
MOVBX,SI
C1:
MOVAL,[BX]
CMPAL,[SI]
JAF1
F1:
LOOPC1
MOVAL,00H;
将最大值置零
MOV[BX],AL
MOVCX,04H;
再一次选择五个数的最大值
C2:
JAF2
F2:
LOOPC2
MOVAL,00H;
将新的最大值置零
MOV[BX],AL
第三次选择最大值
C3:
JAF3
F3:
LOOPC3
MOVAL,[BX];
第三次选出的最大值即为原数据的中值
POPCX
SUBAH,AH
MOVSI,AX;
将中值保存到SI寄存器
PUSHDX;
保存通道号
MOVDL,07H;
显示炉号数
SUBDL,CL
ADDDL,30H
MOVAH,02H
MOVDX,OFFSETSTR1;
显示字符串号炉温度
POPAX
POPDX
MOVBL,04H;
将采集的数据进行数值转换
MULBL
SUBDX,DX
MOVCX,1000;
分离出千位数并显示
DIVCX
XCHGAX,DX
MOVCL,100;
分离出百位数并显示
DIVCL
ADDAL,30H
MOVDL,AL
XCHGAL,AH
MOVCL,10;
分离出十位数并显示
ADDAH,30H;
显示个位数
MOVDL,AH
MOVDX,OFFSETSTR3;
显示degree
CMPSI,0FH;
与60摄氏度比较
JAS;
若在指定范围内则继续转换
CALLALARM;
若不在指定范围则报警
S:
MOVDL,0AH;
换行
MOVDL,0DH;
将光标置行首
ADDDL,04H;
DX指向下一个通道
NEXTENDP
CODEENDS
ENDSTART
6.2C语言源程序
#include<
stdio.h>
stdlib.h>
conio.h>
bios.h>
ctype.h>
process.h>
voidkey(void);
//判断是否右键按下,有则退出
voiddelay1(inttime);
//延时函数
voidalarm(void);
//报警函数
voiddelay2(inttime);
//****************根据查看配置信息修改下列符号值*******************
#defineIOY00xE400//8254端口地址
#defineIOY10xE440//ADC0809端口地址
//***