压力传感器仿真程序.docx
《压力传感器仿真程序.docx》由会员分享,可在线阅读,更多相关《压力传感器仿真程序.docx(18页珍藏版)》请在冰豆网上搜索。
![压力传感器仿真程序.docx](https://file1.bdocx.com/fileroot1/2022-11/20/6cbd6193-d2ed-4729-953e-83c99351835c/6cbd6193-d2ed-4729-953e-83c99351835c1.gif)
压力传感器仿真程序
#include<>
#include<>
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#defineBUSY0x80kpa"};
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,**********/
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_d