51单片机压力传感器Word格式文档下载.docx
《51单片机压力传感器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机压力传感器Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
报警功能实现当压力超出设定的压力围(64~176kPa)10S时,发光二极管点亮进行报警。
关键词:
AT89S52单片机、1210—030G—3S型压力传感器、LED显示、报警。
三、主体设计
1、系统设计
考虑到过程控制系统的一般组成及本次设计的任务要求,本设计主要由以下几部分组成:
被控对象(气缸及附带的进气阀和放气阀)、压力传感器FT、A/D转换(ADC0808)、AT89S52单片机、LED显示、报警电路和放气阀驱动电路。
2、系统框图
基于AT89S52的压力测控系统
3、设计思路
压力传感器(1210—030G—3S)测量气缸中的压力(0~207kPa)输出电流信号(75~150mA),经A/D模数转换(结果为00000000~11111111即0~255)后给单片机,单片机进行算法处理将传感器的输出信号和测量的压力对应起来并实时显示在LED上,当所测压力大于176kPa时,放气阀打开进行放气,当所测压力小于64kPa时,放气阀关闭,进气阀给气缸充气。
此过程中若放气或充气10S任没达到正常的压力围则进行1S报警。
当然A/D转换的启停、压力大小的判断、10S延时都由单片机来控制。
4、压力传感器和A/D转换芯片选择
(1)压力传感器1210—030G—3S
网上查找了很多压力传感器,其中较为典型常用的是名动公司生产的MD—PS系列和MD—GA高精度绝压传感器,但是由于二者都不适合本次课程设计的压力围(0~200kPa),最终选择1210—030G—3S压力传感器,它的测压围为30*6.895=207kPa,输出电流围是75~150mA,性能参数如下:
典型应用电路如下:
设计仿真时由于PROTEUS中没有传感器,因此用一个围为75~150分压电路代替传感器的输出电流,使的仿真得以进行。
(2)AD模数转换芯片ADC0809
ADC0809是目前广泛使用的逐位逼近型8位单片A/D转换芯片,片含8路模拟开关,可允许8路模拟量输入。
主要由3部分组成:
模拟输入选择部分、转换器部分、输出部分。
ADC0809芯片为28引脚为双列直插式封装,ADC0809主要信号引脚功能说明如下:
IN7~IN0——八路模拟量输入通道。
ALE——地址锁存允许信号。
START——转换启动信号。
START=1转换启动。
A、B、C——地址线、通道端口选择线。
CLK——时钟信号。
ADC0809要求外接时钟频率为10kHz~1.2MHz。
通常使用频率为500KHz的时钟信号。
EOC——转换结束信号。
EOC=1,转换结束。
D7~D0——数据输出线。
OE——输出允许信号。
OE=1,输出转换得到的数据。
Vcc——+5V电源。
Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。
其典型值为+5V(Vref(+)=+5V,Vref(-)=-5V)。
ADC0809与MCS-51单片机的连接主要涉及两个问题。
一是8路模拟信号通道的选择,二是A/D转换完成后转换数据的传送。
转换数据的传送有定时传送方式、查询方式、中断方式这三种方式。
A、B、C的值与被选择的通道之间的关系如下表1—1所示:
表1—1通道选择表
实际画图时由于PROTEUS中没有ADC0809,因此用ADC0808代替。
ADC0808和ADC0809的使用接发相同,只是ADC0809的转换误差为1位,ADC0808为5位而已。
四、参考文献
1.《51单片机原理及应用—基于KeilC与Proteus》海宴航空航天大学。
2.《单片机原理与接口技术》第二版马淑华等邮电大学。
3.《微型计算机原理与接口技术》第二版冯博琴吴宁清华大学。
五、结束语
本次课程设计历时一周,除键盘电路外基本完成了所要求的设计任务。
设计过程中参考了海宴老师编著的《51单片机原理及应用—基于KeilC与Proteus》一书中数字电压表的设计。
本设计的难点在于:
考虑到现场传感器的气体压力测量与传感器输出是实时进行的,因此ADC0808的模数转换必须时刻进行,至少两次转换之间的时间间隔不能太长。
但是如果一次转换完成后立即进行下一次转换,则对应的转换子程序就是一个死循环,这样的话就不能进行报警,因为无法取出10S之后的转换数据。
考虑到这个问题之后再转换之程序中做一个0.1S的延时,这样每次转换大约耗时0.1S,转换子程序进行多少次转换通过主程序来控制,这样调用转换子程序100次之后就可以得到10S以后的转换结果,将转换结果和压力上下限比较以后就可以决定是否进行报警了。
当然,这样做的局限是使得LED的显示不那么连续了。
因此,进一步想办法解决这个问题是我们以后应该继续做的。
设计过程中老师和同学给了我很多支持和帮助,这里一并致谢!
六、完整程序
#include<
reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]
={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xf6,0xee,
0x3e,0x9c,0x7a,0x9e,0x8e};
//七段共阴数码管编码表
sbitSTART=P3^0;
sbitEOC=P3^1;
sbitOE=P3^2;
sbitONOFF=P3^3;
//控制放气门开或关
sbitALARM=P3^4;
//报警显示
voiddelay(uintm)//LED显示延时子程序
{
while(m--);
}
delay1(uintc)//循环间隔延时C毫秒子程序
uchara,b;
for(;
c>
0;
c--)
for(b=142;
b>
b--)
for(a=2;
a>
a--);
voidfun1(uinti)//AD转换及数据处理子程序
uintP;
externuintPP;
//定义全局变量PP
START=1;
START=0;
while(i>
0)//fun1只执行i次
{
if(i>
0)
{
OE=1;
//转换结束输出使能
P=P0;
//AD转换结果赋给P
P=P*1.0/255*207;
//完成75~150mA到0~207kPa的转换
OE=0;
//停止输出
P2=0xfe;
//个位位选
P1=table[P%10];
//个位段选
delay(500);
//个位显示延时约1ms
P2=0xfd;
//十位位选
P1=table[P/10%10];
//十位段选
//十位显示延时约1ms
P2=0xfb;
//百位位选
P1=table[P/100%10];
//百位段选
//百位显示延时约1ms
if(P>
176)ONOFF=1;
//打开放气阀
if(P<
64)ONOFF=0;
i=i-1;
delay1(100);
//每次转换后延时100ms(0.1s)
//启动下一次转换
}
}
voidmain()//主程序
ONOFF=0;
//初始时放气阀关闭
//初始时不进行AD转换
ALARM=0;
//初始时不报警
while
(1)//死循环
fun1
(1);
//调用一次转换子程序
PP=P;
//转换处理结果(压力值)给PP
if(PP>
176||PP<
64)//判断压力是否超限
fun1(100);
//压力超限则调用转换子程序100次,用时约0.1*100=10s
176)//10s后压力任超出上限则进行报警
{
ALARM=1;
delay1(1000);
//报警显示延时1s
if(PP<
64)//10s后压力任超出下限则进行报警
{
ALARM=1;
if(64<
PP<
176)//10s后压力正常则不进行报警
ALARM=0;
delay1(1000);
elseif(64<
176)ALARM=0;
//10s后压力正常则不报警
七、仿真结果
正常压力围,放气阀关闭
压力超出上限,放气阀打开
压力超出上限10S后仍未恢复正常报警
八、程序流程图