#include
#include
#define uchar unsigned char
#define uint unsigned char
#define K 2000 //K为转换增益常数,K取值2000
uint Pa; //定义气压值Pa
uchar T0count;
bit flag;//定义1s标志位
unsigned long x;
***it LCD_RS=P2^0;
***it LCD_E=P2^1;
***it LCD_RW=P2^2;
#define LCD_DATA P0//定义单片机P0口作为LCD液晶显示位选码 uchar code LcdBuf1[]={"welcome to use!"};
uchar code LcdBuf2[]={"Pressure test!"};//LCD显示内容,定义到代码段
uchar temp[8];
uchar dispbuf[8]={0,0,0,0,0,0,10,10};
//函数声明
void lcd_init(void);
void displa_string(uchar x,uchar*);
void disp_selec(unsigned char bit_sdelec,unsigned char seg);
void delay(uint z)//延时 1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*************************************
**函数名称:dellay
**入口函数:h(unsigned int 型)
**出口参数:无
**功能描述:短暂延时,使用11.0592晶体,约0.01MS
**************************************/
void dellay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
/*************************************
**函数名称:WritedataLcd
**入口参数:wdata (unsigned char 型)
**出口参数:无
**功能描述:写数据到LCD
void WriteDataLcd(unsigned char wdata)
{
LCD_RS=1;
LCD_DATA=wdata;
dellay(10);//短暂延时,代替检测忙状态
LCD_E=1;
dellay(10); //短暂延时,代替检测忙状态
LCD_E=0;
}
**函数名称:WriteCommandLcd
**入口函数:wdata(unsigned char 型)
**出口参数:无
**功能描述:写命令到LCD
void WriteCommandLcd(unsigned char wdata)
{
LCD_RS=0;
LCD_DATA=wdata;
dellay(10);//短暂延时,代替检测忙状态
LCD_E=1;
dellay(10);//短暂延时,代替检测忙状态
LCD_E=0;
}
void lcd_init()
{
LCD_E=0;
WriteCommandLcd(0x38);
WriteCommandLcd(0x38);//显示模式设置
WriteCommandLcd(0x08);//关闭显示
WriteCommandLcd(0x0c);//显示开及光标设置
WriteCommandLcd(0x06);//显示光标移动设置
WriteCommandLcd(0x01);//显示清屏
WriteCommandLcd(0x90);//显示开及光标移动设置
}
**函数名称:display_xy
**入口参数:x(unsigned char 型),y(unsigned char 型)
**出口参数:无
**功能描述:设置光标位置,x是列号,y是行号
void display_xy(unsigned char x,unsigned char y)
{
if(y==1)
x+=0x40;
x+=0x80;
WriteCommandLcd(x);
}
**函数名称:display_char
**入口参数:x(unsigned char 型),y(unsigned char 型),dat(unsigned char型)
**出口参数:无
**功能描述:在具体位置显示显示单个字符,x是列号,y是行号
void display_char(unsigned char x,unsigned char y ,unsigned char dat)
{
display_xy(x,y);
WriteDataLcd(dat);
}
// While(*s)
/**************************************************************************
**函数名称:display_string
**入口参数:x(unsigned char 型),y(unsigned char 型),s(指针型)
**出口参数:无
**功能描述:在具体位置显示显示字符串,以/0结束,x是列号,y是行号
***************************************************************************/
void display_string(unsigned char x,unsigned char y,unsigned char*s)
{
display_xy(x,y);
while(*s)
{
WriteDataLcd(*s);
s++;
}
}
void main(void)
{
unsigned char i;
LCD_RW=0;
delay(10);
lcd_init();
display_string(0,0,LcdBuf1);//显示第一行,从第三个位置开始
display_string(0,1,LcdBuf2);//显示第二行,从第0个位置开始
delay(300);
TMOD=0X15;//初始化定时器工作方式,T1为定时器,时基为50MS,T0为计时器,T0、T1均工作于方式1
TH0=0;
TL0=0;//初始化定时器0值
TH1=(65525-50000)/256;//初始化定时器1值
TL1=(65535-50000)%256;
TR1=1;//启动定时器1
TR0=1;//启动定时器0
ET0=1;//定时器0使能
ET1=1;//定时器1使能
EA=1;//总中断允许
WriteCommandLcd(0x01);//显示清屏
while(1)
{
if(flag==1)//1S标志到
{
flag=0;//清1S标志
x=T0count*65536+TH0*256+TL0;//计算频率值
Pa=(20*(float)(x)/K+9)*10; //计算气压值,并将气压值乘以10;
for(i=0;i<8;i++) //循环八次
{
temp=0; //降八个显示缓冲区清零
{
i=0;
while(x/10)//计算每一位数值缓冲区
{
temp=x%10;
x=x/10;
i++;
}
temp=x;
for(i=0;i<6;i++)//循环六次
{
dispbuf=temp;//将数值缓冲区中的数存入显示缓冲区
}
for(i=0;i<6;i++) //循环六次
display_char(i+5,0,dispbuf[5-i]+'0');
display_string(12,0,"HZ");
for(i=0;i<8;i++)//循环八次
{
temp=0;//将八个显示缓冲区清零
}
i=0;
while(Pa/10)//计算每一位数值缓冲区
{
temp=Pa%10;
Pa=Pa/10;
i++;
}
temp=Pa;
for(i=0;i<6;i++);//循环六次
}
dispbuf=temp;//将数值缓冲区中的数存入显示缓冲区
}
display_string(9,1,"PA");
display_char(6,1,dispbuf[3]+'0');
display_char(7,1,dispbuf[2]+'0');
display_char(8,1,dispbuf[1]+'0');
display_char(9,1,'.');
display_char(10,1,dispbuf[0]+'0');
Timecount=0;//20次计数值清零
T0count=0;//脉冲计数值清零
TH0=0;//T0计数值清零
TL0=0;//T0计数值清零
TR0=1;//再次启动下一次的计数
}
}
}
void t0(void) interrupt 1 using 0
{
T0count++;//定时器0中断,满65536个脉冲,则T0count++;
}
void t1(void)interrupt 3 using 1
{
TH1=-50000/256;//重新规定TH计数初值为50ms
TL1=-50000%256;
Timecount++;
if(Timecount==20)
{
TR0=0; //定时器0停止
Timecount=0;//时间标志位清零
flag=1; //1S标志位置1
}
}