测控系统课程设计02.docx
《测控系统课程设计02.docx》由会员分享,可在线阅读,更多相关《测控系统课程设计02.docx(24页珍藏版)》请在冰豆网上搜索。
测控系统课程设计02
摘要
在工业生产控制过程中,压力是一个很重要的参数。
比如利用测量大气压力来间接测量海拔高度,在工业生产中测量压力参数来判断反应的过程,在气象预测中,也需要测量大气压力来判断阴雨天气等等。
所有这些都需要掌握测量压力,所以压力表的设计拥有广阔的市场前景。
本课题就是基于此原因设计的一个简单压力计。
本课程设计用mpx4115传感器来检测压力参数,adc0808进行模数转换后,利用AT89C52进行数据处理后,由键盘设置测量量程,用发光二级管显示当前测量量程送液晶显示压力值。
本系统可根据需要进行功能扩展。
由于adc0808支持8路信号采集,可以对8个压力点参数进行检测。
可以手动设置采集哪一路,或者循环采集。
还可以进行压力上下限报警。
在设计系统的时候,立足于界面友好性、性价比,可以在简单压力检测的时候使用。
关键词:
AT89C52单片机、MPX4115压力传感器、液晶显示器、adC0808转换器
1系统总体介绍..................................................3
1.1系统功能介绍.............................................3
1.2功能介绍.................................................3
1.3AT98C52简介.............................................3
1.4ADC0808简介.............................................3
2系统软件设计..................................................5
2.1系统程序整体流程图.......................................5
2.2按键子程序流程图.........................................5
2.3T0中断服务程序流程图....................................5
2.4外部中断INT0流程图......................................6
3系统硬件设计..................................................7
3.1系统总体框图.............................................7
3.2压力测量电路.............................................7
3.3系统总体仿真电路.........................................7
4软硬件仿真调试及性能分析......................................9
4.1数字量到压力值的标度变换.................................9
4.2系统protues仿真运行图...................................9
4.2.1开机显示画面........................................9
4.2.2两位数正常显示.....................................10
4.2.3两位数超量程显示...................................11
4.2.4三位数正常显示1...................................11
4.2.5三位数正常显示2...................................11
5总结.........................................................13
6参考资料.....................................................13
7参考程序.....................................................14
1系统功能要求介绍
1.1系统总体设计
压力计以AT89C52为核心,进行数据的处理和显示,并进行显示量程的切换。
压力测量采用mpx4115,利用adc0808实现A/D转换,由键盘设置量程转换,并且用发光二极管显示当前的量程。
1.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)。
1.3AT89C52简介
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脚,其功能用途由软件定义。
1.4ADC0808简介
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):
地。
2系统软件设计
系统主程序在初始化后只进行按键扫描,利用定时器T0定时5s启动ad转化,即采样周期是5s。
当ad转换完成后进入外部中断INT0服务程序,进行数据的处理,刷新显示的压力值;当采用两位量程时,若检测到压力值大于等于100,提示超过量程“over!
”,需要转换量程。
2.1系统程序整体流程图
系统的整体程序流程图如下所示:
主程序在完成开机logo显示、压力值初始化显示、TO及INT0中断初始化后进入死循环,在循环中进行按键扫描,切换量程。
等待T0中断启动ad转换;转换完成后进入外部中断INT0进行数据的处理、分析、显示。
2.2按键子程序流程图
按键子程序进入后首先对显示模式进行修改,即在两位整数和三位整数显示之间进行切换。
若是两位整数模式则先判断是否超过量程(压力值是三位数整数),超过量程则显示“over!
”提示转换量程。
若是三位整数模式则直接刷新数据后显示。
2.3T0中断服务程序流程图
T0中断服务子程序如下图所示:
T0定时器定时50ms,即每50ms进入T0中断,在中断中增加time5s_count计时器,每次进入T0中断后time5s_count加1,当加到100后表示5s到,清零同时启动ad转换。
2.4外部中断INT0流程图
外部中断INT0服务程序流程图如下所示:
当adc0808完成ad转换后,eoc变高,经反相器后接单片机int0口,下降沿启动int0中断。
在中断中首先读取转换后的数字量,再进行标度换算成压力值,完成数据的刷新。
3系统硬件电路设计
3.1系统总体框图
以AT89C52为核心,外围电路有信号采集mpx4115,ad转换电路adc0808、按键和显示液晶模块。
总体框图如下:
3.2压力测量电路
压力测量使用摩托罗拉公司的mpx4115传感器,采集电路以此为核心,为了克服干扰,在mpx4115输出电路中增加了RC滤波电路。
如下图所示:
3.3系统总体仿真电路
压力计检测系统在protues仿真的硬件电路如下所示:
图3.1系统总体仿真图
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软硬件仿真调试及性能分析
4.1数字量到压力值的标度变换
Mpx4115压力传感器检测的范围是10kpa-100kpa,输出电压信号0.2v-4.8v。
adc0808的参考电压Vref+=5v,Vref-=0v。
则(0v-5v)对应(0-255),(0.2v-4.8v)对应(10-246)。
如下图所示:
4.1.1系统最小分辨率
即当压力值变换了0.424kpa系统便能检测到。
4.2系统protues仿真运行图
4.2.1开机logo画面,显示“welcome!
Good!
”
图4.1开机显示图
4.2.2两位整数模式压力值正常显示:
图4.2两位数正常显示
4.2.3两位整数模式超量程显示:
图4.3两位数超量程显示
4.2.4三位整数模式显示1:
图4.4三位数显示1
4.3.4三位整数模式显示2:
图4.5三位数显示2
5总结
通过这次测控系统课程设计,我不仅加深了对测控系统理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新能力,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为自己的东西。
在确定课题后,设计有要求量程切换,这是在以前书本中都不曾提过的应用,我们根据现实生活中,和在实验室接触的仪表中,将量程切换定义为:
小量程(xx.Xx)现实到小数点百分位,大量程(xxx.x),虽然整数可以显示到百位,但是只能够显示到小数点十分位,这样就没有小量程显示准确了。
在按键子程序中要达到量程转换的目的,定义一个位变量,key_count,每次按键后,key_count先取反,再判断key_count的值,若是0表示的是两位整数显示模式,1则表示三位整数显示的模式。
通过这次课程设计,我学到了许多知识,这些知识都是在实践中才能够点滴积累的。
在做该课程设计过程中遇到困难的时候,不要忘记学习除了一个人独自琢磨外还应多与同学切磋,一个人学习容易走进死胡同,而且进入死胡同后会大大的打击做设计的积极性,这时候应与同学多交流,从一个新的角度去看待问题、分析问题、解决问题,会有耳目一新的感觉。
再做起设计来事倍功半,最主要的是,从课程设计中学会了把课本上的理论知识实践化。
.
6参考资料
1.王福瑞等.《单片微机测控系统设计大全》.北京航空航天大学出版社,1999
2.《现代测控技术与系统》韩九强清华大学出版社2007.9
3.《智能仪器》程德福,林君主编机械工业出版社2005年2月
4.《测控仪器设计》浦昭邦,王宝光主编机械工业出版社2001
5.KeilC51帮助文档
7参考程序
源程序如下:
/*******************************************************/
/***基于MPX4115的压力计设计***/
/***输入压力信号10—100kpa,输出0.2—4.8v电压信号***/
/***ad转换采用adc0808,0—5v对应00h—ffh***/
/***0.2—4.8v对应ah(10)—f5h(246)***/
/***标度变换pressure=(100-10)/(246-10)*(B-10)+10***/
/***version:
0.01***/
/*******************************************************/
#include
#include
#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>0;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=0;//写
lcd_e=0;
check_busy();
lcd_e=1;
delay
(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]);//显示"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;//定时器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()
{
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);//压力值
write_number(press_ge,7);
write_com(0x80+8);
write_data('.');
write_number(press_dot1,9);
write_number(press_dot2,10);
}
}
else//key_count=1,三位
{
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)%10);//取压力值十分位
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
i=0;i=0;i=0;i=0;
adc_oe=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!
{
writ