找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何实现51单片机与DS18B20温度传感器配合在适当温度时蜂鸣器报警

[复制链接]
楼主
ID:112267 发表于 2016-4-5 08:58 | 显示全部楼层
自己根据源程序修改的代码,实现了在高于设定温度时滴滴的蜂鸣器报警
// File name :**.c
//
// Descriptions :实时采集当前环境温度值,并显示于数码管上。
//    同时,当温度高于某一值时(此处设为31摄氏度),蜂鸣器便会发出报警。
//    而当低于该值时,蜂鸣器自动停止报警。
//    试验时,可用手触摸DS18B20,使其温度升高到31度,观察现象。
//
//**************************************************************************************

//**************************************************************************************
//Revision History
//------------------
//
//01 ****-**-**   10:07  Park
//      Create the file.
//**************************************************************************************

#include
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2;           //define interface
uint temp;             // variable of temperature
uint tempBaoJing;
uchar flag1;            // sign of the result positive or negative
sbit dula=P2^6;
sbit wela=P2^7;
//sbit beep=P3^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
                        0x87,0xff,0xef};

void delay(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}

uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

void displayBaoJing(uint temp)   //显示程序
{
uchar A1,A2,A2t;
A1=temp/100;
A2t=temp0;
A2=A2t/10;

dula=0;
P0=table[A1];  //显示百位
dula=1;
dula=0;

wela=0;
P0=numPos[4];
wela=1;
wela=0;
delay(1);

dula=0;
P0=table1[A2];  //显示十位
dula=1;
dula=0;

wela=0;
P0=numPos[5];
wela=1;
wela=0;
delay(1);


}

void display(uint temp)   //显示程序
{
   uchar A1,A2,A2t,A3;
   A1=temp/100;
   A2t=temp0;
   A2=A2t/10;
   A3=A2t;
   dula=0;
   P0=table[A1];  //显示百位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay(1);

   dula=0;
   P0=table1[A2];  //显示十位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay(1);

   P0=table[A3];  //显示个位
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay(1);
}

void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0x0DC;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 0;
}

void main()
{
uchar a;
InitTimer0();

tempBaoJing=250;//250为报警温度乘以10之后得到的数值
do
{
    tmpchange();//先调用tmpchange,此函数发送44H,启动温度转换,然后再调用tmp()读取温度值
for(a=10;a>0;a--)
   {  
    display(tmp());
  displayBaoJing(tempBaoJing);
   }

if (buttonS1==BUTTON_DOWN)
{
  delayMsWYL(10);
  if (buttonS1==BUTTON_DOWN)
  {
   tempBaoJing=tempBaoJing+10;
  }
}

if (buttonS2==BUTTON_DOWN)
{
  delayMsWYL(10);
  if (buttonS2==BUTTON_DOWN)
  {
   tempBaoJing=450;
  }
}

if (buttonS3==BUTTON_DOWN)
{
  delayMsWYL(10);
  if (buttonS3==BUTTON_DOWN)
  {
   tempBaoJing=350;
  }
}


if(temp>=tempBaoJing)  //当温度超过31度(仅作试验用,实际可设为其他更高的值),蜂鸣器便会报警。
  {
//    P1=0xf1;
//    beep=BEEP_ON;
  TR0=1;
  }
  else
  {
//    beep=BEEP_OFF;
//    P1=0x00;
   TR0=0;
  }


  
  } while(1);
}


void Timer0(void) interrupt 1
{
static int temp=0;
    TH0 = 0x0DC;
    TL0 = 0x00;
    //add your code here!
temp++;
if (temp>250&&temp<300)
{
  //temp=0;
  beep=BEEP_ON;
}
else if (temp>300)
{
  beep=BEEP_OFF;
  temp=0;
}

}

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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