新人报道区
直播中

不死鸟phoenix

6年用户 3经验值
私信 关注

求基于51单片机的气压计设计仿真文件,自己做不了仿真

#include
#include
#define uchar unsigned char  
#define uint unsigned char          
#define K 2000 //K为转换增益常数,K取值2000
uint Pa; //定义气压值Pa
uchar T0count;
uchar timecount;
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
        }
}

更多回帖

×
20
完善资料,
赚取积分