压力传感器仿真程序.docx

上传人:b****8 文档编号:10980792 上传时间:2023-02-24 格式:DOCX 页数:13 大小:17KB
下载 相关 举报
压力传感器仿真程序.docx_第1页
第1页 / 共13页
压力传感器仿真程序.docx_第2页
第2页 / 共13页
压力传感器仿真程序.docx_第3页
第3页 / 共13页
压力传感器仿真程序.docx_第4页
第4页 / 共13页
压力传感器仿真程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

压力传感器仿真程序.docx

《压力传感器仿真程序.docx》由会员分享,可在线阅读,更多相关《压力传感器仿真程序.docx(13页珍藏版)》请在冰豆网上搜索。

压力传感器仿真程序.docx

压力传感器仿真程序

 

#

i

n

c

l

u

d

e

<

r

e

g

5

1

.

h

>

#include

#include

#include

#defineucharunsignedchar

#defineuint

unsignedint

#defineBUSY

0x80

//

常量定义

#defineDATAPORTP0

 

//ADC0832的引脚sbitADCS=P3^5;sbitADDI=P3^7;sbitADDO=P3^7;sbitADCLK=P3^6;

sbitLCM_RS=P2^0;sbitLCM_RW=P2^1;sbitLCM_EN=P2^2;

 

//ADC0832chipseclect

//ADC0832kin

//ADC0832kout

//ADC0832clocksignal

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;

X|=0x80;

//假设y为1〔显示第二行〕,地址码

//指令码为地址码+0X80

+0X40

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;//测试时补偿值为

 

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;}

//那么启动报警

else

{

Alarm_led_red=1;}

//关闭报警

}

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

当前位置:首页 > 人文社科 > 视频讲堂

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

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