找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 984|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机压力传感器MPX4115检测-报警系统proteus仿真+源程序

[复制链接]
跳转到指定楼层
楼主
一、系统方案
1、本设计采用这51单片机作为主控器。
2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。
3、按键设置报警值。
4、蜂鸣器报警。


二、硬件设计
原理图如下:

三、单片机软件设计
1、首先是系统初始化
/*******************************************************************
                  液晶初始化
************************************************************************/
void chushihua()
{
  delayxms(20); //给液晶一段时间
  en=0;
  xiemingling(0x38);//设置16*2显示,5*7点阵,8位数据接口
  delayxms(20);
  xiemingling(0x38);//
  delayxms(20);
  xiemingling(0x0c);//设置开显示,不显示光标
  delayxms(20);
  xiemingling(0x06);//写一个字符后地址指针加1
  delayxms(20);
  xiemingling(0x01);//显示清零,数据指针清零
  delayxms(20);
  xiemingling(0x80);//指定字符显示的实际地址,,,显示位置的确定方法规定为"80H+地址码x"
  delayxms(20);
}
2、液晶显示程序
//**************毫秒*******************
void delayxms(uint ms)                                           //延时 x  ms
{
    uint a,j;
    for(a=0;a<ms;a++)
          for(j=0;j<110;j++);
}
/*******************************************************************
                  写命令
************************************************************************/
void xiemingling(unsigned char mingling)
{
  en=0;
  rs=0;
  rw=0;
  P0=mingling;
  delayxms(5);
  en=1;
  delayxms(10);
  en=0;
}
/*******************************************************************
                  写数据
************************************************************************/
void xieshuju(unsigned char shuju)
{   
  en=0;
  rs=1;
  rw=0;
  P0=shuju;
  delayxms(5);
  en=1;
  delayxms(10);
  en=0;
}
3、按键程序
/*********************************************************/
// 按键扫描
/*********************************************************/
void key()
{
        if(key5==0)
        {
                delay(10);
                if(key5==0)
                {
                        while(!key5);
                        c1=c;
                        temp1=temp;
           
    }
        }      
                if(key6==0)
        {
                delay(10);
                if(key6==0)
                {
                        while(!key6);
            mode=!mode;
                        chushihua(); //LCD1602初始化
    }
        }      
      
      
        if(key1==0)
        {
                delay(10);
                if(key1==0)
                {
                        while(!key1);
              h++;
                          if(h>1000) h=1000;
    }
        }      
      
        if(key2==0)
        {
                delay(10);
                if(key2==0)
                {
                        while(!key2);
                        if(h>=1) h--;
               
    }
        }      
        if(key3==0)
        {
                delay(10);
                if(key3==0)
                {
                        while(!key3);
              l++;
                          if(l>1000) l=1000;
    }
        }      
      
        if(key4==0)
        {
                delay(10);
                if(key4==0)
                {
                        while(!key4);
                        if(l>=1) l--;
               
    }
        }      
      
}
4、核心算法程序
void main(void)
{
         
          chushihua(); //LCD1602初始化
               
  while(1)
  {         
             key();         
          getdata=Adc0832(0);
                check_wendu();
          if(0<getdata<243)                                 
                {                           
                  int vary=getdata;                                                      
                        press=((10.0/23.0)*vary)+9.3;                                                                                                                          
                        temp=(int)(press*10);               
                                                                                 
                        dispbuf[3]=temp/1000;                                     //取压力值百位
                        dispbuf[2]=(temp%1000)/100;                            //取压力值十位
                        dispbuf[1]=((temp%1000)%100)/10;                    //取压力值个位
                        dispbuf[0]=((temp%1000)%100)%10;                        //取压力值十分位
                        if(temp/10<l){ led1=0;led2=1;beep=0;}
                        else  if(temp/10>h){led1=1;led2=0;beep=0;}
       else  {led1=1;led2=1;beep=1;}
           }
                if(mode==0)
                {
                xiemingling(0x80+0);
                xieshuju('Q');
               
                xieshuju(':');
                xieshuju(dispbuf[3]+0x30);      
                xieshuju(dispbuf[2]+0x30);      
                xieshuju(dispbuf[1]+0x30);
                xieshuju('.');               
                xieshuju(dispbuf[0]+0x30);      
                xieshuju(' ');
               
                xieshuju('T');
                xieshuju(':');
                xieshuju(c/1000+0x30);      
                xieshuju(c%1000/100+0x30);      
                xieshuju(c%1000%100/10+0x30);
                xieshuju('.');               
                xieshuju(c%10+0x30);      
      
               
               
                xiemingling(0x80+0x40);
                        xieshuju('H');
                xieshuju(':');
                xieshuju(h/100+0x30);      
                xieshuju(h%100/10+0x30);      
                xieshuju(h%10+0x30);
      
     xieshuju(' ');
    xieshuju('L');
                xieshuju(':');
                xieshuju(l/100+0x30);      
                xieshuju(l%100/10+0x30);      
                xieshuju(l%10+0x30);      
        }
        else
                {
                        xiemingling(0x80+0);
                xieshuju('R');
               
                       
                       
                                xiemingling(0xC0+0);
                xieshuju('Q');
               
                xieshuju(':');
                xieshuju(temp1/1000+0x30);      
                xieshuju(temp1%1000/100+0x30);      
                xieshuju(temp1%1000%100/10+0x30);
                xieshuju('.');               
                xieshuju(temp1%10+0x30);      
                xieshuju(' ');
                       
                        xiemingling(0xC0+0);
                xieshuju('Q');
               
                xieshuju(':');
                xieshuju(temp1/1000+0x30);      
                xieshuju(temp1%1000/100+0x30);      
                xieshuju(temp1%1000%100/10+0x30);
                xieshuju('.');               
                xieshuju(temp1%10+0x30);      
                xieshuju(' ');
               
                xieshuju('T');
                xieshuju(':');
                xieshuju(c1/1000+0x30);      
                xieshuju(c1%1000/100+0x30);      
                xieshuju(c1%1000%100/10+0x30);
                xieshuju('.');               
                xieshuju(c1%10+0x30);      
      
               
               
               
        }
               
  }
}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表