一、系统方案
1、本设计采用这51单片机作为主控器。
2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。
3、按键设置报警值。
4、蜂鸣器报警。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
/*******************************************************************
液晶初始化
*****************************************************************/
void chushihua()
{
delayxms(20); //给液晶一段时间
en=0;
xiemingling(0x38);//设置162显示,57点阵,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)(press10);
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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。