测控系统课程设计02.docx

上传人:b****8 文档编号:10154701 上传时间:2023-02-08 格式:DOCX 页数:24 大小:992.24KB
下载 相关 举报
测控系统课程设计02.docx_第1页
第1页 / 共24页
测控系统课程设计02.docx_第2页
第2页 / 共24页
测控系统课程设计02.docx_第3页
第3页 / 共24页
测控系统课程设计02.docx_第4页
第4页 / 共24页
测控系统课程设计02.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

测控系统课程设计02.docx

《测控系统课程设计02.docx》由会员分享,可在线阅读,更多相关《测控系统课程设计02.docx(24页珍藏版)》请在冰豆网上搜索。

测控系统课程设计02.docx

测控系统课程设计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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1