电信121313069周煜.docx
- 文档编号:9660263
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:17
- 大小:104.44KB
电信121313069周煜.docx
《电信121313069周煜.docx》由会员分享,可在线阅读,更多相关《电信121313069周煜.docx(17页珍藏版)》请在冰豆网上搜索。
电信121313069周煜
宁波理工学院
题目力敏传感器应用实例
姓名周煜
学号3120403069
目录
第1章系统总体设计4
1.1数字气压计的设计思路4
1.2系统总体结构4
1.3数字气压计的硬件设计5
1.3.1气压传感器MPX41155
1.3.2ADC08325
1.3.3系统硬件电路7
第2章应用实例7
2.1系统总电路仿真7
2.2程序(分模块)7
2.2.1main.c7
2.2.2lcd.h11
2.2.3temp.h13
2.2.4lcd.c13
2.2.5temp.c16
参考文献19
第1章系统总体设计
1.1数字气压计的设计思路
采用集成的单片机主控,通过压力传感器将气压信号送入带A/D转换的单片机中,以及在相关模拟分立元件的辅助下进行A/D转换以及其它的数据处理,将处理的结果送显示部分进行显示。
原理原理框图如下:
图1
1.2系统总体结构
本系统的总体结构框图如图2所示。
图2单片机数字气压计系统结构框图
由图2可知,整个系统的工作流程如下。
测量时被测气压由气压传感器转换为模拟的电压输出,此输出信号不能直接交由单片机处理。
因此,需要经过AD转换模块把气压传感器输出的模拟电压信号转换为数字脉冲(其频率随输入电压呈线性变化)。
通过单片机接收该脉冲信号,得到单位时间内获得的脉冲数,依据电压与频率的线性关系式计算出所对应的实际气压值,最后通过显示电路显示给用户。
1.3数字气压计的硬件设计
1.3.1气压传感器MPX4115
气压传感器对于数字气压计设计的实现至关重要,需要综合实际的需求和各类气压传感器的性能参数加以选择。
气压传感器的主要性能参数如下。
·测量范围
即所能测量的大气压力范围,单位为kPa。
·测量精度
测量结果(电流或电压)的精度。
·温度补偿范围
一般要选用具有温度补偿能力的气压传感器,因为温度补偿特性可以克服半导体压力敏感器件存在的温度漂移问题。
·测量的是否是绝对气压值
绝对气压值对应的即是实际的气压值,显然要实现数字气压计需要测量绝对气压值的气压传感器。
数字气压计显示的是绝对气压值,同时为了简化电路,提高稳定性和抗干扰能力,要求使用具有温度补偿能力的气压传感器[7]。
经过综合考虑,我们选用美国摩托罗拉公司的集成压力传感器芯片MPX4105作为气压传感器。
MPX4105可以产生于所加气压呈线性关系的高精度模拟输出电压,它具有以下特点:
·供电范围:
4.85~5.35V,典型值为5.1V。
·测量范围:
15~105kPa。
·工作温度范围:
0~85℃。
·温度补偿范围:
-40~+125℃。
·测量精度为±1.7%VFSS。
·最低气压对应的输出电压VOFF为0.184~0.428V,典型值为0.306V;最高气压对应的输出电压VOFF为4.804~4.988V,典型值为4.896V;满刻度输出电压间距VFSS的典型值为4.590V。
·理想的微处理器接口。
1.3.2ADC0832
ADC0832是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
芯片接口说明:
·CS_ 片选使能,低电平芯片使能。
·CH0模拟输入通道0,或作为IN+/-使用。
·CH1模拟输入通道1,或作为IN+/-使用。
·GND芯片参考0电位(地)。
·DI数据信号输入,选择通道控制。
·DO数据信号输出,转换数据输出。
·CLK芯片时钟输入。
·Vcc/REF电源输入及参考电压输入(复用)。
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
图3
1.3.3系统硬件电路
气体传感器MPX4115将气压值转换成电压值输出,经ADC0832转换成数字量,并送单片机处理,然后在LCD1602上显示。
其电路图如图4所示:
图4
1.4数字气压计的软件设计
源程序:
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineBUSY0x80//常量定义
#defineDATAPORTP0
//ADC0832的引脚
sbitADCS=P3^5;//ADC0832chipseclect
sbitADDI=P3^7;//ADC0832kin
sbitADDO=P3^7;//ADC0832kout
sbitADCLK=P3^6;//ADC0832clocksignal
sbitLCM_RS=P2^0;
sbitLCM_RW=P2^1;
sbitLCM_EN=P2^2;
ucharad_data;//采样值存储
sbitAlarm_led_red=P1^5;//超过压力表量程最大值红色led报警定义
sbitAlarm_led_green=P1^6;//低于压力表量程最小值绿色led报警定义
//adc采样值存储单元
charpress_data;//标度变换存储单元
unsignedcharad_alarm;//报警值存储单元
unsignedcharpress_bai=0;//显示值百位
unsignedcharpress_shi=0;//显示值十位
unsignedcharpress_ge=0;//显示值个位
unsignedcharpress_dot=0;//显示值十分位
ucharcodestr0[]={"Press:
.kpa"};
ucharcodestr1[]={"CheckBYJack"};
voiddelay(uint);
voidlcd_wait(void);
voiddelay_LCM(uint);//LCD延时子程序
voidinitLCM(void);//LCD初始化子程序
voidlcd_wait(void);//LCD检测忙子程序
voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数
voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数
voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数
voiddisplay(void);//系统显示子函数
ucharAdc0832(unsignedcharchannel);
voidalarm(void);
voiddata_pro(void);
/**********mainfuncation************/
voidmain(void)
{
delay(500);//系统延时500ms启动
//ad_data=0;//采样值存储单元初始化为0
initLCM();
WriteCommandLCM(0x01,1);//清显示屏
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
while
(1)
{
ad_data=Adc0832(0);//采样值存储单元初始化为0
alarm();
data_pro();
display();
}
}
/*********延时K*1ms,12.000mhz**********/
voiddelay(uintk)
{
uinti,j;
for(i=0;i { for(j=0;j<60;j++) {;} } } /**********写指令到ICM子函数************/ voidWriteCommandLCM(ucharWCLCM,ucharBusyC) { if(BusyC)lcd_wait(); DATAPORT=WCLCM; LCM_RS=0;//选中指令寄存器 LCM_RW=0;//写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /**********写数据到LCM子函数************/ voidWriteDataLCM(ucharWDLCM) { lcd_wait();//检测忙信号 DATAPORT=WDLCM; LCM_RS=1;//选中数据寄存器 LCM_RW=0;//写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /***********lcm内部等待函数*************/ voidlcd_wait(void) { DATAPORT=0xff;//读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色 LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); while(DATAPORT&BUSY) {LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); } LCM_EN=0; } /**********LCM初始化子函数***********/ voidinitLCM() { DATAPORT=0; delay(15); WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号 delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1);//关闭显示,检测忙信号 WriteCommandLCM(0x01,1);//清屏,检测忙信号 WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号 } /****显示指定坐标的一个字符子函数****/ voidDisplayOneChar(ucharX,ucharY,ucharDData) { Y&=1; X&=15; if(Y)X|=0x40;//若y为1(显示第二行),地址码+0X40 X|=0x80;//指令码为地址码+0X80 WriteCommandLCM(X,0); WriteDataLCM(DData); } /*******显示指定坐标的一串字符子函数*****/ voidDisplayListChar(ucharX,ucharY,ucharcode*DData) { ucharListLength=0; Y&=0x01; X&=0x0f; while(X<16) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } /*****************系统显示子函数*****************/ voiddisplay(void) { WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); DisplayOneChar(7,0,press_bai+0x30); DisplayOneChar(8,0,press_shi+0x30); DisplayOneChar(9,0,press_ge+0x30); DisplayOneChar(11,0,press_dot+0x30); delay(1000);//稳定显示 } /************ 读ADC0832函数 ************/ //采集并返回 ucharAdc0832(unsignedcharchannel)//AD转换,返回结果 { uchari=0; ucharj; uintdat=0; ucharndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat);//returnadk } voiddata_pro(void) { unsignedinttemp; floatpress; if(14 { intvary=ad_data;//y=(115-15)/(243-13)*X+15kpa press=((10.0/23.0)*vary)+9.3;//测试时补偿值为9.3 temp=(int)(press*10);//放大10倍,便于后面的计算 press_bai=temp/1000;//取压力值百位 press_shi=(temp%1000)/100;//取压力值十位 press_ge=((temp%1000)%100)/10;//取压力值个位 press_dot=((temp%1000)%100)%10;//取压力值十分位 } } /*****************报警子函数*******************/ voidalarm(void) { if(ad_data>=243)//如果当前压力值大于115kpa, {Alarm_led_red=0;}//则启动redled报警 else {Alarm_led_red=1;}//关闭redled报警 if(ad_data<=14)//如果当前压力值小于16kpa {Alarm_led_green=0;}//则启动greenled报警 else {Alarm_led_green=1;}//关闭greenled报警 } 参考文献 [1]李林功.传感器技术与应用[J].北京: 科学出版社.2015. [2]陈杰,黄鸿.传感器与检测技术[J].北京: 高等教育出版社.2003.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电信 121313069 周煜