压力传感器程序.docx

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

压力传感器程序.docx

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

压力传感器程序.docx

压力传感器程序

压力传感器程序

#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);

voidmain(void)

{

delay(500);//系统延时500ms启动

initLCM();

WriteCommandLCM(0x01,1);//清显示屏

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

while

(1)

{

ad_data=Adc0832(0);//采样值存储单元初始化为0

alarm();

data_pro();

display();

}

}

voiddelay(uintk)

{

uinti,j;

for(i=0;i

{

for(j=0;j<60;j++)

{;}

}

}

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)

{

if(BusyC)lcd_wait();

DATAPORT=WCLCM;

LCM_RS=0;//选中指令寄存器

LCM_RW=0;//写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

voidWriteDataLCM(ucharWDLCM)

{

lcd_wait();//检测忙信号

DATAPORT=WDLCM;

LCM_RS=1;//选中数据寄存器

LCM_RW=0;//写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

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;

}

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);//稳定显示

}

//采集并返回

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=(temp00)/100;//取压力值十位

press_ge=((temp00)0)/10;//取压力值个位

press_dot=((temp00)0);//取压力值十分位

}

}

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报警

}

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

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

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

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