基于单片机的压力测试仪设计Word文件下载.docx
《基于单片机的压力测试仪设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的压力测试仪设计Word文件下载.docx(25页珍藏版)》请在冰点文库上搜索。
由于adc0808支持8路信号采集,可以对8个压力点参数进行检测。
可以手动设置采集哪一路,或者循环采集。
还可以进行压力上下限报警。
在设计系统的时候,立足于界面友好性、性价比,可以在简单压力检测的时候使用。
关键词:
压力测试;
单片机;
ADC;
传感器
目录
1.设计要求5
2.设计方案与设计原理6
2.1系统总体设计6
2.2功能介绍6
3.元器件的识别与检测7
3.1AT89C52简介7
3.2ADC0808简介7
4.制作与调试9
4.1系统软件设计9
4.2系统程序整体流程图9
4.3T0中断服务程序流程图10
4.4外部中断INT0流程图10
4.5系统总体框图11
4.6系统总体仿真电路12
4.7软硬件仿真调试及性能分析13
4.8程序代码13
5.设计心得19
6参考文献20
1.设计要求
本课程设计用MPX4115传感器来检测压力参数,ADC0808进行模数转换后,利用AT89C52进行数据处理后,由键盘设置测量量程,用发光二级管显示当量量程送液晶显示压力值。
数字压力传感器是工业实践中最为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,下面就简单介绍一些常用传感器原理及其应用。
本课程设计的数字压力传感器以单片机为主要部件,利用全桥测量原理,通过对电路输出电压和标准压强的线性关系,建立具体的数学模型,将电压量纲(V)改为压强纲(pa)即成为一台原始电子称。
其中测量电路中最主要的元器件就是电阻应变式传感器。
电阻应变式传感器是传感器中应用最多的一种,本设计采用全桥测量电路,使系统产生的误差更小,输出的数据更精确。
而三运放大电路的作用就是把传感器输出的微弱的模拟信号进行一定倍数的放大,以满足A/D转换器对输入信号电平的要求。
ADC0809的A/D转换作用是把模拟信号转变成数字信号,进行模数转换,然后把数字信号输送到显示电路中去,最后由显示电路显示出测量结果。
并且能实现数字传感器之间的通讯,达到数据共享的目的。
从而更好的满足当今社会的要求。
2.设计方案与设计原理
2.1系统总体设计
压力计以AT89C52为核心,进行数据的处理和显示,并进行显示量程的切换。
压力测量采用MPX4115,利用ADC0808实现A/D转换,由键盘设置量程转换,并
且用发光二极管显示当前的量程。
2.2功能介绍
压力计的测量量程在10KPA~100KPA,精度在0.5级。
利用16X1字符型LCD
显示和提示操作。
利用按键进行量程转换。
具体为XX.XXKPA和XXX.XKPA。
压力测量使用摩托罗拉公司的MPX4115传感器,采集电路以此为核心,为了
克服干扰,在MPX4115输出电路中增加了RC滤波电路。
MPX4115压力传感器检测的范围是10KPA-100KPA,输出电压信号0.2V-4.8V。
ADC0808的参考电压VREF+=5V,VREF-=0V。
则0V-5V)对应(0-255),(0.2V-4.8V)
对应(10-246)。
本课程设计是基于AT89C52的压力测量装置。
有压力传感器测量当前施加在传感器上的压力,并通过ADC0808芯片将电压信号转换为数字信号传递给单片机,通过单片机将当前的压力值传递给LCD并且正确显示。
本系统可根据需要进行功能扩展。
由于ADC0808支持8路信号采集,可以对
8个压力点参数进行检测。
还可以进
行压力上下限报警。
在设计系统的时候,立足于界面友好性、性价比,可以在简单压力检测的时
候使用。
3.元器件的识别与检测
3.1AT89C52简介
AT89C52是51系列单片机的一个型号,它是
ATMEL公司生产的。
AT89C52为40脚双列直插封装的8位通用微
处理器,采用工业标准的C51内核,在内部功能及
管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入
输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容
组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的
正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义。
3.2ADC0808简介
ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。
其
内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模
拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本
相同。
一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809
进行A/D转换。
ADC0808芯片有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系统软件设计
系统主程序在初始化后只进行按键扫描,利用定时器T0定时5S启动AD
转化,即采样周期是5S。
当AD转换完成后进入外部中断INT0服务程序,进行
数据的处理,刷新显示的压力值;
当采用两位量程时,若检测到压力值大于等于
100,提示超过量程“OVER!
”,需要转换量程。
4.2系统程序整体流程图
系统的整体程序流程图如下所示:
主程序在完成开机LOGO显示、压力值初始化显示、TO及INT0中断初始化
后进入死循环,在循环中进行按键扫描,切换量程。
等待T0中断启动AD转换;
转换完成后进入外部中断INT0进行数据的处理、分析、显示。
按键子程序流程图
按键子程序进入后首先对显示模式进行修改,即在两位整数和三位整数显示
之间进行切换。
若是两位整数模式则先判断是否超过量程(压力值是三位数整
数),超过量程则显示“OVER!
”提示转换量程。
若是三位整数模式则直接刷新数据后显示。
4.3T0中断服务程序流程图
T0定时器定时50MS,即每50MS进入T0中断,在中断中增加TIME5S_COUNT
计时器,每次进入T0中断后TIME5S_COUNT加1,当加到100后表示5S到,清
零同时启动AD转换。
4.4外部中断INT0流程图
外部中断INT0服务程序流程图如下所示:
当ADC0808完成AD转换后,EOC变高,经反相器后接单片机INT0口,下降
沿启动INT0中断。
在中断中首先读取转换后的数字量,再进行标度换算成压力
值,完成数据的刷新。
4.5系统总体框图
以AT89C52为核心,外围电路有信号采集MPX4115,AD转换电路ADC0808、
按键和显示液晶模块。
总体框图如下:
压力测量电路
如下图所示:
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.数字量到压力值的标度变换
则(0V-5V)对应(0-255),(0.2V-4.8V)对应(10-246)。
2.系统最小分辨率
即当压力值变换了0.424KPA系统便能检测到。
4.8程序代码
#INCLUDE<
REG52.H>
MATH.H>
#DEFINEUCHARUNSIGNEDCHAR
#DEFINEUINTUNSIGNEDINT
#DEFINEDATAPORTP0//数据端口
SBITBUSY=P0^7;
SBITADC_CS=P2^0;
SBITLCD_RS=P2^1;
SBITLCD_RW=P2^2;
SBITLCD_E=P2^3;
SBITLED1=P2^4;
//两位数,XX.XX,默认两位数
SBITLED2=P2^5;
//三位数,XXX.X
SBITKEY=P2^6;
//量程转换
SBITADC_OE=P2^7;
BITKEY_COUNT;
//量程表示,0两位,1三位
UCHARTIME5S_COUNT;
UCHARPRESS_BAI;
UCHARPRESS_SHI;
UCHARPRESS_GE;
UCHARPRESS_DOT1;
//十分位
UCHARPRESS_DOT2;
//百分位
UCHARK;
//量程转换的放大倍数,两位10,三位100
UINTTEMP;
FLOATPRESS;
UCHARCODESTR0_0[]="
WELCOME!
GOOD!
"
;
//开机LOGO(15)
UCHARCODESTR0_1[]="
PRESS:
KPA!
//正常显示检测(14)
UCHARCODESTR1[]="
OVER!
//超过了满量程
VOIDDELAY(UCHARX)
UCHARY,Z;
FOR(Y=X;
Y>
0;
Y--)
FOR(Z=110;
Z>
Z--);
}
/*======注意:
后8个字符的地址是从80+40开始的======*/
//检测LCD忙函数
VOIDCHECK_BUSY()
{
DO
DATAPORT=0XFF;
LCD_RS=0;
LCD_RW=1;
LCD_E=0;
//相当于_NOP_()
LCD_E=1;
}WHILE(BUSY==1);
//LCD写命令
VOIDWRITE_COM(UCHARCOM)
DATAPORT=COM;
//命令
LCD_RW=0;
//写
CHECK_BUSY();
//判断LCD是否忙碌
DELAY
(1);
//LCD_E=0;
//LCD写数据
VOIDWRITE_DATA(UCHARDATE)
DATAPORT=DATE;
LCD_RS=1;
//数据
//写显示一个字符函数
VOIDWRITE_NUMBER(UCHARDAT,UCHARADD)//形参:
显示数据,显示地址
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;
I<
15;
I++)//开机LOGO
WRITE_DATA(STR0_0[I]);
//显示"
100;
I++)//开机LOGO延时时间
DELAY(100);
//显示的起始地址
I++)
WRITE_DATA(STR0_1[I]);
//正常显示准备"
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;
//定时器T0方式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()
IF(KEY==0)
DELAY(5);
WHILE(!
KEY);
//松手检测
KEY_COUNT=~KEY_COUNT;
IF(KEY_COUNT==0)//两位显示模式
IF(PRESS>
=100)//超过了满量程,显示OVER!
WRITE_COM(0X80+6);
5;
WRITE_DATA(STR1[I]);
//“OVER!
”
ELSE
K=100;
//转换结果放大倍数,便于求小数
//点亮
//熄灭
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_DOT2,10);
ELSE//KEY_COUNT=1,三位
K=10;
LED1=1;
LED2=0;
//放大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)%10);
//取压力值十分位
WRITE_NUMBER(PRESS_BAI,6);
WRITE_NUMBER(PRESS_SHI,7);
WRITE_NUMBER(PRESS_GE,8);
WRITE_COM(0X80+9);
VOIDMAIN()
DISP_INIT();
WHILE
(1)
KEY_SCAN();
VOIDT0_SEVERCE()INTERRUPT1//T0中断服务子函数
TR0=0;
TIME5S_COUNT++;
IF(TIME5S_COUNT==100)//定时5S到,每5S进行AD转换检测
TIME5S_COUNT=0;
ADC_CS=0;
//启动AD转换
ADC_CS=1;
VOIDINT0_SERVICE()INTERRUPT0
UCHARAD_DATA,I;
P1=0XFF;
//数据准备,读入的时候先置1
I=0;
ADC_OE=1;
//允许输入
//AD_DATA=P3;
//准许转换的结果
AD_DATA=P1;
//禁止输入
PRESS=(10.0/23.6)*(AD_DATA-10)+15;
IF(KEY_COUNT==0)//两位数模式
PRESS_DOT1=(UCHAR)(((TEMP%1000)%100)/10);
//刷新显示的压力数据
ELSE//KEY_COUNT=0,三位显示
5.设计心得
这次课程设计经历了一周的时间,其中遇到了许多的麻烦和困难,但是都一一解决
了,通过发现问题、分析问题、解决问题,我又学到了许多新的知识,而且这些知识都是在书本中的抽象理论中很难明白的,必须在工程实际应用才能够有切身的体会。
在确定课题后,设计有要求量程切换,这是在以前书本中都不曾提过的应用,我们根据现实生活中,和在实验室接触的仪表中,将量程切换定义为:
小量程(xx.Xx)现实到小数点百分位,大量程(xxx.x),虽然整数可以显示到百位,但