基于单片机的压力测试仪设计.docx
- 文档编号:25888558
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:23
- 大小:692.90KB
基于单片机的压力测试仪设计.docx
《基于单片机的压力测试仪设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的压力测试仪设计.docx(23页珍藏版)》请在冰豆网上搜索。
基于单片机的压力测试仪设计
在工业生产控制过程中,压力是一个很重要的参数。
比如利用测量大气压力来间接测量海拔高度,在工业生产中测量压力参数来判断反应的过程,在气象预测中,也需要测量大气压力来判断阴雨天气等等。
所有这些都需要掌握测量压力,所以压力表的设计拥有广阔的市场前景。
本课题就是基于此原因设计的一个简单压力计。
本课程设计用MPX4115专感器来检测压力参数,ADC0808进行模数转换后,利用AT89C524行数据处理后,由键盘设置测量量程,用发光二级管显示当前测量量程送液晶显示压力值。
本系统可根据需要进行功能扩展。
由于ADC0808支持8路信号采集,可以对8个压力点参数进行检测。
可以手动设置采集哪一路,或者循环采集。
还可以进行压力上下限报警。
在设计系统的时候,立足于界面友好性、性价比,可以在简单压力检测的时候使用。
关键词:
压力测试;单片机;ADC;传感器
1•设计要求3
2.设计方案与设计原理4
2.1系统总体设计4
2.2功能介绍4
3•元器件的识别与检测5
3.1AT89C52简介5
3.2ADC0808简介5
4制作与调试6
4.1系统软件设计6
4.2系统程序整体流程图7
4.3T0中断服务程序流程图8
4.4外部中断INTO流程图8
4.5系统总体框图9
4.6系统总体仿真电路9
4.7软硬件仿真调试及性能分析10
4.8程序代码11
5.设计心得17
6参考文献18
1.设计要求
本课程设计用MPX4115传感器来检测压力参数,ADC0808进行模数转换后,利用AT89C52进行数据处理后,由键盘设置测量量程,用发光二级管显示当量量程送液晶显示压力值。
数字压力传感器是工业实践中最为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。
本课程设计的数字压力传感器以单片机为主要部件,利用全桥测量原理,通过对
电路输出电压和标准压强的线性关系,建立具体的数学模型,将电压量纲(V)
改为压强纲(pa)即成为一台原始电子称。
其中测量电路中最主要的元器件就是电阻应变式传感器。
电阻应变式传感器
是传感器中应用最多的一种,本设计采用全桥测量电路,使系统产生的误差更小,输出的数据更精确。
而三运放大电路的作用就是把传感器输出的微弱的模拟信号进行一定倍数的放大,以满足A/D转换器对输入信号电平的要求。
ADC0809的A/D转换作用是把模拟信号转变成数字信号,进行模数转换,然后把数字信号输送到显示电路中去,最后由显示电路显示出测量结果。
并且能实现数字传感器之间的通讯,达到数据共享的目的。
从而更好的满足当今社会的要求。
2.设计方案与设计原理
2.1系统总体设计
压力计以AT89C52为核心,进行数据的处理和显示,并进行显示量程的切换。
压力测量采用MPX4115利用ADC0808实现A/D转换,由键盘设置量程转换,并且用发光二极管显示当前的量程。
2.2功能介绍
压力计的测量量程在10KPA~100KP,精度在0.5级。
利用16X1字符型LCD
显示和提示操作。
利用按键进行量程转换。
具体为XXXXKPA和XXXXKPA。
压力测量使用摩托罗拉公司的MPX4115传感器,采集电路以此为核心,为了
克服干扰,在MPX4115输出电路中增加了RC滤波电路。
MPX4115压力传感器检测的范围是10KPA-100KPA输出电压信号0.2V-4.8V。
ADC0808的参考电压VREF+=5WREF-=0V则0V-5V)对应(0-255),(0.2V-4.8V)对应(10-246)。
本课程设计是基于AT89C52的压力测量装置。
有压力传感器测量当前施加在传
感器上的压力,并通过ADC0808芯片将电压信号转换为数字信号传递给单片机,通过单片机将当前的压力值传递给LCD并且正确显示。
本系统可根据需要进行功能扩展。
由于ADC0808支持8路信号采集,可以对
8个压力点参数进行检测。
可以手动设置采集哪一路,或者循环采集。
还可以进行压力上下限报警。
在设计系统的时候,立足于界面友好性、性价比,可以在简单压力检测的时
候使用。
3.
元器件的识别与检测
管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入
输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义。
3.2ADC0808简介
ADC080是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。
其
内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC080是ADC080的简化版本,功能基本相同。
一般在硬件仿真时采用ADC080进行A/D转换,实际使用时采用ADC0809
IN0
ClOCK<
1N1
SWT
IH2
IM3
EOC
IN4
IN5
CXH1
INC
INT
0VT3
A
OOT4
0(JT5
越02
cm
ACOC
0UT7
ALE
WTS
VREF{*}
tRETW
OE
J(二土1「;
进行A/D转换。
ADC080芯片有28条引脚,采用双列直插式封装,如右图所示。
各引脚功能如下:
1〜5和26〜28(IN0〜IN7):
8路模拟量输入端。
8、14、15和17〜21:
8位数字量输出端。
22(ALE:
地址锁存允许信号,输入,高电平有效。
6(START:
A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
7(EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ
12(VREF(+))和16(VREF(-)):
参考电压输入端。
11(Vcc):
主电源输入端。
13(GND:
地。
4.制作与调试
4.1系统软件设计
系统主程序在初始化后只进行按键扫描,转化,即采样周期是5S。
当AD转换完成后进入外部中断INTO服务程序,进行
数据的处理,刷新显示的压力值;当
采用两位量程时,若检测到压力值大于等于
100,提示超过量程“OVER”,需要转换量程。
4.2系统程序整体流程图
系统的整体程序流程图如下所示:
利用定时器T0定时5S启动AD
主程序在完成开机LOGC显示、压力值初始化显示、TO及INTO中断初始化后进入死循环,在循环中进行按键扫描,切换量程。
等待T0中断启动AD转换;
转换完成后进入外部中断INT0进行数据的处理、分析、显示。
按键子程序流程图
按键扫捲程序流程图
按键子程序进入后首先对显示模式进行修改,即在两位整数和三位整数显示之间进行切换。
若是两位整数模式则先判断是否超过量程(压力值是三位数整数),超过量程则显示“OVER”提示转换量程。
若是三位整数模式则直接刷新数据后显示。
4.3TO中断服务程序流程图
TO定时器定时50MS即每50MS进入TO中断,在中断中增加TIME5S_COUNT
计时器,每次进入TO中断后TIME5S_COUN加1,当加到100后表示5S至叽清零同时启动AD转换。
4.4外部中断INT0流程图
外部中断INT0服务程序流程图如下所示:
INTO中断服务程序流程圍
当ADC0808完成AD转换后,EOC变高,经反相器后接单片机INT0口,下降沿启动INT0中断。
在中断中首先读取转换后的数字量,再进行标度换算成压力值,完成数据的刷新。
4.5系统总体框图
以AT89C52为核心,外围电路有信号采集MPX4115AD转换电路ADC0808按键和显示液晶模块。
总体框图如下:
系统
体
桓
压力测量电路压力测量使用摩托罗拉公司的MPX4115传感器,采集电路以此为核心,为了
克服干扰,在MPX4115输出电路中增加了RC滤波电路。
如下图所示:
4.6系统总体仿真电路
压力计检测系统在PROTUES仿真的硬件电路如下所示:
MPX4115的输出的电压信号0.2V-0.5V送至ADC0808的0通道,AD转化后
8位数字信号送给单片机P1口,经单片机分析处理数据后经P0口送液晶显示。
按键控制量程的转换,00.00-10.00KPA和10.0-100.0KPA两个量程,显然
整数是两位时的现实精度高。
红色LED亮表示此时的量程为00.00-10.0KPA黄
色LED亮表示此时的量程为10.0-100.0KPA。
显示界面利用16X1的字符型液晶LM020L进行显示,相比LED显示能显示更多的内容,人机界面更友好,而且节省单片机硬件资源。
4.7软硬件仿真调试及性能分析
1.数字量到压力值的标度变换
MPX4115压力传感器检测的范围是10KPA-100KPA输出电压信号0.2V-4.8V。
ADC0808的参考电压VREF+=5WREF-=0V则(0V-5V)对应(0-255),(0.2V-4.8V)对应(10-246)。
2•系统最小分辨率
△115-15
I
1246-10
检测到。
4.8程序代码
#INCLUDE
#INCLUDE
#DEFINEUCHARUNSIGNEDCHAR
#DEFINEUINTUNSIGNEDINT
#DEFINEDATAPORTP0数据端口
SBITBUSY=P0A7;
SBITADC_CS=P2A0;
SBITLCD_RS=P2A1;
SBITLCD_RW=P2A2;
SBITLCD_E=P2A3;
SBITLED1=P2A4;//两位数,XX.XX,默认两位数
SBITLED2=P2A5;//三位数,XXX.X
SBITKEY=P2A6;//量程转换
SBITADC_OE=P2A7;
BITKEY_COUNT;〃量程表示,0两位,1三位
UCHARTIME5S_COUNT;
UCHARPRESS_BAI;
UCHARPRESS_SHI;
UCHARPRESS_GE;
UCHARPRESS_D0T1十分位
UCHARPRESS_D0T2百分位
UCHARK;〃量程转换的放大倍数,两位10,三位100
UINTTEMP;
FLOATPRESS;
UCHARCODESTRO_O[]="WELCOME!
GOOD开机LOGO(15)
UCHARCODESTR0_1[]="PRESS:
KPA!
";/正常显示检测(14)
UCHARCODESTR1[]="OVER!
";/超过了满量程
VOIDDELAY(UCHARX)
UCHARY,Z;
FOR(丫二X;Y>0;Y--)
FOR(Z=11O;Z>O;Z--);
}
/*======注意:
后8个字符的地址是从80+40开始的======*///检测LCD忙函数
VOIDCHECK_BUSY()
{
DO
{
DATAPORT=0XFF;
LCD_RS=0;
LCD_RW=1;
LCD_E=0;
LCD_E=0;//相当于_NOP_()
LCD_E=1;
}WHILE(BUSY==1);
}
//LCD写命令
VOIDWRITE_COM(UCHARCOM)
{
DATAPORT=COM;
LCD_RS=0;〃命令
LCD_RW=0;/写
LCD_E=0;
CHECK_BUSY();/判断LCD是否忙碌
LCD_E=1;
DELAY
(1);
//LCD_E=0;
}
//LCD写数据
VOIDWRITE_DATA(UCHARDATE)
{
DATAPORT=DATE;
LCD_RS=1;〃数据
LCD_RW=O;/写
LCD_E=0;
CHECK_BUSY();
LCD_E=1;
DELAY
(1);
}
//写显示一个字符函数
VOIDWRITE_NUMBER(UCHARDAT,UCHARA形参〃显示数据,显示地址
WRITE_COM(0X80+ADD)显示数据的地址
WRITE_DATA(0X30+DAT);/送数字ASCII码
}
VOIDDISP_INIT()
{
UCHARI;
ADC_OE=0;
WRITE_COM(0X01);/清屏并光标复位
WRITE_COM(0X30);/设置8位、2行、5*7点阵
//WRITE_COM(0X0F);//显示开,允许闪烁
WRITE_COM(0X0C);光标不显示,不闪烁
WRITE_COM(0X14);/文字不动,光标自动右移
WRITE_COM(0X80);/显示起始地址
FOR(I=0;|V15;I++)//开机LOGO
WRITE_DATA(STR0_0[l]);〃显示"WELCOME!
GOOD!
"
FOR(I=0;I<100;I++)//开机LOGO延时时间
DELAY(100);
WRITE_COM(0X01);/清屏并光标复位
WRITE_COM(0X80);/显示的起始地址
FOR(I=0;I<15;I++)
WRITE_DATA(STR0_1[I]);〃正常显示准备"PRESS:
XXXXXKPA!
"
//默认两位数显示
LED1=0;
LED2=1;
WRITE_NUMBER(PRESS_SHI,6);
WRITE_NUMBER(PRESS_GE,7);
WRITE_COM(0X80+8);
WRITE_DATA('.');
WRITE_NUMBER(PRESS_DOT1,9);
WRITE_NUMBER(PRESS_DOT1,10);
/*****************************************/
//定时器T0初始化,外部中断INT0初始化
//不用设置INT0优先于T0,因为默认是这样
TMOD=0X01;/定时器TO方式1
TH0=(65536-50000)/256;〃定时50MS
TL0=(65536-50000)%256;
IT0=1;//INT0负边沿触发中断
EA=1;〃开总中断
ET0=1;//开T0中断
EX0=1;//开INT0中断
TR0=1;//启T0计数
}
VOIDKEY_SCAN()
UCHARI;
IF(KEY==0)
{
DELAY(5);
IF(KEY==0)
{
WHILE(!
KEY);〃松手检测
KEY_COUNT=~KEY_COUNT;
IF(KEY_COUNT==0)/两位显示模式
{
IF(PRESS>=100)〃超过了满量程,显示OVER!
{
WRITE_COM(0X80+6);/显示的起始地址
FOR(I=0;I<5;I++)
WRITE_DATA(STR1[I]);〃“OVER”
}
ELSE
{
K=100;//转换结果放大倍数,便于求小数
LED1=0;//点亮
LED2=1;//熄灭
TEMP=(UINT)(PRESS*K);〃放大100倍,便于求小数
PRESS_SHI=(UCHAR)(TEMP/1000);/取压力值百位
PRESS_GE=(UCHAR)((TEMP%1000)/100);取压力值十位
PRESS_DOT1=(UCHAR)(((TEMP%1000)%100)/10);取压力值十分位
PRESS_DOT2=(UCHAR)(((TEMP%1000)%100)%10)取压力值百分位WRITE_NUMBER(PRESS_SHI,6)3/力值
WRITE_NUMBER(PRESS_GE,7);
WRITE_COM(0X80+8);
WRITE_DATA('.');
WRITE_NUMBER(PRESS_DOT1,9);
WRITE_NUMBER(PRESS_DOT2,10);
}
}
ELSE//KEY_COUNT=£位
{
K=10;
LED1=1;
LED2=0;〃点亮
TEMP=(UINT)(PRESS*K);〃放大10倍,便于求小数PRESS_BAI=(UCHAR)(TEMP/1000);/取压力值百位PRESS_SHI=(UCHAR)((TEMP%1000)/100);/取压力值十位
PRESS_GE=(UCHAR)(((TEMP%1000)%100)/10);取压力值个位
PRESS_DOT1=(UCHAR)(((TEMP%1000)%100)%1取压力值十分位WRITE_NUMBER(PRESS_BAI,6)压力值
WRITE_NUMBER(PRESS_SHI,7);
WRITE_NUMBER(PRESS_GE,8);
WRITE_COM(0X80+9);
WRITE_DATA('.');
WRITE_NUMBER(PRESS_DOT1,10);
}
}
}
}
VOIDMAIN()
{
DISP_INIT();
WHILE
(1)
{
KEY_SCAN();
}
}
VOIDT0_SEVERCE()INTERRUPT1//T0中断服务子函数
{
TH0=(65536-50000)/256;〃定时50MS
TL0=(65536-50000)%256;
TR0=0;
TIME5S_COUNT++;
IF(TIME5S_COUNT==100)/定时5S到,每5S进行AD转换检测
{
TIME5S_COUNT=0;
ADC_CS=0;〃启动AD转换
ADC_CS=1;
ADC_CS=0;
}
TR0=1;
}
VOIDINT0_SERVICE()INTERRUPT0
{
UCHARAD_DATA,I;
P1=0XFF;〃数据准备,读入的时候先置1
1=0;1=0;1=0;1=0;
ADC_0E=1;/允许输入
I=0;I=0;I=0;I=0;
〃AD_DATA=P3;〃准许转换的结果
AD_DATA=P1;
I=0;I=0;I=0;I=0;
ADC_OE=0;//禁止输入
I=0;I=0;I=0;I=0;
PRESS=(10.0/23.6)*(AD_DATA-10)+15;
IF(KEY_COUNT==0)/两位数模式
{
IF(PRESS>=100)//超过了满量程,显示OVER!
{
WRITE_COM(0X80+6);/显示的起始地址
FOR(I=0;I<5;I++)
WRITE_DATA(STR1[I]);〃“OVER”
}
ELSE
{
TEMP=(UINT)(PRESS*K);〃放大100倍,便于求小数PRESS_SHI=(UCHAR)(TEMP/1000);/取压力值百位PRESS_GE=(UCHAR)((TEMP%1000)/100);取压力值十位PRESS_DOT1=(UCHAR)(((TEMP%1000)%100)/10);取压力值十分位PRESS_DOT2=(UCHAR)(((TEMP%1000)%100)%10)取压力值百分位
//刷新显示的压力数据
WRITE_NUMBER(PRESS_SHI,6)3/力值WRITE_NUMBER(PRESS_GE,7);
WRITE_NUMBER(PRESS_DOT1,9);
WRITE_NUMBER(PRESS_DOT2,10);
}
}
ELSE//KEY_COUNT=5位显示
{
TEMP=(UINT)(PRESS*K);〃放大10倍,便于求小数
PRESS_BAI=(UCHAR)(TEMP/1000);/取压力值百位PRESS_SHI=(UCHAR)((TEMP%1000)/100);/取压力值十位
PRESS_GE=(UCHAR)(((TEMP%1000)%100)/10);取压力值个位
PRESS_DOT1=(UCHAR)(((TEMP%1000)%100)%1取压力值十分位//刷新显示的压力数据
WRITE_NUMBER(PRESS_BAI,6)压力值WRITE_NUMBER(PRESS_SHI,7);
WRITE_NUMBER(PRESS_GE,8);
WRITE_NUMBER(PRESS_DOT1,10);
}
5.设计心得
这次课程设计经历了一周的时间,其中遇到了许多的麻烦和困难,但是都一一解决
了,通过发现问题、分析问题、解决问题,我又学到了许多新的知识,而且这些知识都是在书本中的抽象理论中很难明白的,必须在工程实际应用才能够有切身
的体会。
在确定课题后,设计有要求量程切换,这是在以前书本中都不曾提过的应用,我们根据现实生活中,和在实验室接触的仪表中,将量程切换定义为:
小量程
(XX•Xx)现实到小数点百分位,大量程(XXX.X),虽然整数可以显示到百位,但是只能够显示到小数点十分位,这样就没有小量程显示准确了。
在按键子程序中要达到量程转换的目的,定义一个位变量,key_count,每次按键后,key_count先取反,再判断key_count的值,若是0表示的是两位整数显示模式,1则表示三位整数显示的模式。
显示环节中,我们也犯了很大的错误,小数点一直显示A,显示不正确。
我
们一直在排查,前几天都没有成功。
最后还是发现在写小数点的时候用的是write_number‘.',8),而write_number(uchardat,ucharadd)是用来显示数字的,dat即十进制数字0~9,在函数中,首先将0x30+dat即得数字的ASCII码,我们原先在写小数点的时候用write_number‘.',8)显然得到的是小数点的ASCII码+0x30后的ASCII码,这个码刚好是a的码值。
我们就改成write_com(0x80+8);write_data('.');两条语句,显示正确。
所以
做事还是要细心。
在ad转换后数据怎么读取上我们小组也存在着很大分歧。
我的同学说ad转
换需要100us,那么我们就在启动转换后延时几ms去读就ok了,简单方便;也有同学说用查询法,eoc在转换期间一直是低电平,转换完成后变高,那么我们就在启动转换后用while(!
eoc)等待转换完成,这样也省事;也有的说用外部中断。
最后大家经过讨论,本着节
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 压力 测试仪 设计