测控系统课程设计Word文件下载.docx
- 文档编号:18262109
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:18
- 大小:979.36KB
测控系统课程设计Word文件下载.docx
《测控系统课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《测控系统课程设计Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
按键子程序进入后首先对显示模式进行修改,即在两位整数和三位整数显示之间进行切换。
若是两位整数模式则先判断是否超过量程(压力值是三位数整数),超过量程则显示“over!
”提示转换量程。
若是三位整数模式则直接刷新数据后显示。
3、T0中断服务程序流程图
T0中断服务子程序如下图所示:
T0定时器定时50ms,即每50ms进入T0中断,在中断中增加time5s_count计时器,每次进入T0中断后time5s_count加1,当加到100后表示5s到,清零同时启动ad转换。
4、外部中断INT0流程图
外部中断INT0服务程序流程图如下所示:
当adc0808完成ad转换后,eoc变高,经反相器后接单片机int0口,下降沿启动int0中断。
在中断中首先读取转换后的数字量,再进行标度换算成压力值,完成数据的刷新。
四.系统硬件电路设计
1、系统总体框图
以AT89C52为核心,外围电路有信号采集mpx4115,ad转换电路adc0808、按键和显示液晶模块。
总体框图如下:
2、压力测量电路
压力测量使用摩托罗拉公司的mpx4115传感器,采集电路以此为核心,为了克服干扰,在mpx4115输出电路中增加了RC滤波电路。
如下图所示:
3、系统总体仿真电路
压力计检测系统在protues仿真的硬件电路如下所示:
mpx4115的输出的电压信号0.2V-0.5v送至adc0808的0通道,ad转化后的8位数字信号送给单片机P1口,经单片机分析处理数据后经P0口送液晶显示。
按键控制量程的转换,00.00-99.99kpa和100.0-115.0kpa两个量程,显然整数是两位时的现实精度高。
红色LED亮表示此时的量程为00.00-99.99kpa,黄色LED亮表示此时的量程为100.0-115.0kpa。
显示界面利用16x1的字符型液晶LM020L进行显示,相比LED显示能显示更多的内容,人机界面更友好,而且节省单片机硬件资源。
五.系统调试及性能分析
1、数字量到压力值的标度变换
Mpx4115压力传感器检测的范围是15kpa-115kpa,输出电压信号0.2v-4.8v。
adc0808的参考电压Vref+=5v,Vref-=0v。
则(0v-5v)对应(0-255),(0.2v-4.8v)对应(10-246)。
2、系统最小分辨率
即当压力值变换了0.424kpa系统便能检测到。
3、系统protues仿真运行图
开机logo画面,显示“welcome!
Good!
”
两位整数模式压力值正常显示:
两位整数模式超量程显示:
三位整数模式显示1:
三位整数模式显示2:
六.总结
这次课程设计经历了一周的时间,其中遇到了许多的麻烦和困难,但是都一一解决
了,通过发现问题、分析问题、解决问题,我又学到了许多新的知识,而且这些知识都是在书本中的抽象理论中很难明白的,必须在工程实际应用才能够有切身的体会。
在确定课题后,设计有要求量程切换,这是在以前书本中都不曾提过的应用,我们根据现实生活中,和在实验室接触的仪表中,将量程切换定义为:
小量程(xx.Xx)现实到小数点百分位,大量程(xxx.x),虽然整数可以显示到百位,但是只能够显示到小数点十分位,这样就没有小量程显示准确了。
在按键子程序中要达到量程转换的目的,定义一个位变量,key_count,每次按键后,key_count先取反,再判断key_count的值,若是0表示的是两位整数显示模式,1则表示三位整数显示的模式。
显示环节中,我们也犯了很大的错误,小数点一直显示^,显示不正确。
我们一直在排查,前几天都没有成功。
最后还是发现在写小数点的时候用的是write_number(‘.’,8),而write_number(uchardat,ucharadd)是用来显示数字的,dat即十进制数字0~9,在函数中,首先将0x30+dat即得数字的ASCII码,我们原先在写小数点的时候用write_number(‘.’,8)显然得到的是小数点的ASCII码+0x30后的ASCII码,这个码刚好是^的码值。
我们就改成write_com(0x80+8);
write_data('
.'
);
两条语句,显示正确。
所以做事还是要细心。
在ad转换后数据怎么读取上我们小组也存在着很大分歧。
我的同学说ad转换需要100us,那么我们就在启动转换后延时几ms去读就ok了,简单方便;
也有同学说用查询法,eoc在转换期间一直是低电平,转换完成后变高,那么我们就在启动转换后用while(!
eoc)等待转换完成,这样也省事;
也有的说用外部中断。
最后大家经过讨论,本着节省cpu时间资源和学习的目的,决定使用中断法。
通过这次课程设计,我学到了许多知识,这些知识都是在实践中才能够点滴积累的。
通过调试BUG,才能够发现问题、解决问题,并在解决问题中我新的收获。
同时,尤其是做技术性的事情,一定的有团队合作的精神,一个人的力量是有限的,而且许多时候会进入死胡同,或许别人一看就能发现问题的本质。
大家一起学习。
七.参考程序
源程序如下:
基于MPX4115的压力计设计
输入压力信号15—115kpa,输出0.2—4.8v电压信号
ad转换采用adc0808,0—5v对应00h—ffh
0.2—4.8v对应ah(10)—f5h(246)
标度变换pressure=(115-15)/(246-10)*(B-10)+15
version:
0.01
#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;
//量程转换的放大倍数,两位100,三位10
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_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;
//数据
//写显示一个字符函数
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_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);
if(key==0)
{
while(!
key);
//松手检测
key_count=~key_count;
if(key_count==0)//两位显示模式
{
if(press>
=100)//超过了满量程,显示over!
{
write_com(0x80+6);
for(i=0;
5;
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中断服务子函数
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;
i=0;
adc_oe=1;
//允许输入
//ad_data=P3;
//准许转换的结果
ad_data=P1;
//禁止输入
press=(10.0/23.6)*(ad_data-10)+15;
if(key_count==0)//两位数模式
if(press>
write_com(0x80+6);
for(i=0;
write_data(str1[i]);
else
temp=(uint)(press*k);
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_number(press_dot1,9);
write_number(press_dot2,10);
else//key_count=0,三位显示
temp=(uint)(press*k);
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_number(press_dot1,10);
八.参考资料
1、李秦伟.C语言程序设计.重庆大学出版社,2004年
2、林敏等.计算机控制技术及工程应用.国防工业出版社,2009年
3、胡汉才.单片机应用及接口技术.清华大学出版社,2004年
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测控 系统 课程设计