找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9553|回复: 9
收起左侧

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

[复制链接]
ID:111909 发表于 2016-4-2 14:09 | 显示全部楼层 |阅读模式
3黑币
希望大神能够有给个具体方法,还有相应程序,谢谢

回复

使用道具 举报

ID:79544 发表于 2016-4-2 20:02 | 显示全部楼层
读出温度,设定在多少度报警就在多少度报警

评分

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

查看全部评分

回复

使用道具 举报

ID:111909 发表于 2016-4-4 13:03 | 显示全部楼层
腾飞的龙 发表于 2016-4-2 20:02
读出温度,设定在多少度报警就在多少度报警

这个我知道,但是要怎么写到程序里是个问题,要是能有个具体程序就好了,新手,写程序很有困难,望指导

评分

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

查看全部评分

回复

使用道具 举报

ID:104472 发表于 2016-4-4 15:54 | 显示全部楼层
网上百度,程序比较多,多读多修改,最好,自己慢慢写,就会有体会了。

评分

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

查看全部评分

回复

使用道具 举报

ID:79544 发表于 2016-4-4 18:28 | 显示全部楼层
论坛里51单片机控制DS18B20的程序很多啊,你怎么不看论坛吗?
回复

使用道具 举报

ID:79544 发表于 2016-4-4 18:29 | 显示全部楼层
51单片机数码管显示DS18B20温度测量报警控制板,这不就是现成的嘛

评分

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

查看全部评分

回复

使用道具 举报

ID:111947 发表于 2016-4-4 21:25 | 显示全部楼层
分模块进行,网上有代码和原理图

评分

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

查看全部评分

回复

使用道具 举报

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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:450207 发表于 2018-12-20 07:39 | 显示全部楼层
#include <reg51.h>
#define unit unsigned int
#define uchar unsigned char
sbit SET=P3^1;
sbit DEC=P3^2;
sbit ADD=P3^3;
sbit BEEP=P3^6;
sbit ALAM=P1^7;
sbit ALAM1=P1^4;
sbit DQ=P3^7;
bit shanshuo_st;
bit beep_st;
sbit DIAN=P0^5;
uchar x=0;
signed char m;
uchar n;
uchar set_st=0;
signed char shangxian=45;
signed char xiaxian=40;
LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
uchar code
LEDdata[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};
void Delay_DS18B20(int num)
{
while(num--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;
Delay_DS18B20(8);
DQ=0;
Delay_DS18B20(80);
DQ=1;
Delay_DS18B20(14);
x=DQ;
Delay_DS18B20(20);
}
unsigned char Read One Char(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
void Write One Char(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}}
unsigned int Read Temperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
Write One Char(0xCC);
Write One Char(0x44);
Init_DS18B20();
Write One Char(0xCC);
Write One Char(0xBE);
a=Read One Char();
b=Read One Char();
t=b;e
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
void Delay(unit num)
{
while(--num);
}
void InitTimer(void)
{TMOD=0x1;
TH0=0x3c;
TL0=0xb0;
}
void cheek_wendu(void)
{
unit a,b,c;
c=Read Temperture()-5;
a=c/100;
b=c/10-a*10;
m=c/10;
n=c-a*100-b*10;
if(m<0){m=0;n=0;}
if(m>99){m=99;n=9;}
}
void Disp_init(void)
{
P0=~0x80;
P2=0x7F;
Delay(200);
P2=0xDF;
Delay(200);
P2=0xF7;
Delay(200);
P2=0xFD;
Delay(200);
P2=0xFF;
}
void Disp_temperture(void)
{
P0=~0x98;
P2=0x7F;
Delay(400);
P2=0xff;
P0=~LEDData[n];
P2=0xDF;
Delay(400);
P2=0xff;
P0=~LEDData[m%10];
DIAN=0;
P2=0xF7;
Delay(400);
P2=0xff;
P0=~LEDData[m/10];
P2=0xFD;
Delay(400);
P2=0xff;
void Disp_alarm(uchar baojing)
{
P0=~0x98;
P2=0x7F;
Delay(200);
P2=0xff;
P0=~LEDData[baojing%10];
P2=0xDF;
Delay(200)
P2=0xff;
P0=~LEDData[baojing/10];
P2=0xF7;
Delay(200);
P2=0xff;
if(set_st==1)P0=~0xCE;
else if(set_st==2)P0=~0x1A;
P2=0xFD;
Delay(200)P2=0xff;
}
void Alarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if(m>=shangxian)
{
ALAM=0;
ALAM1=1;
if(beep_st==1)
BEEP=0;
else
BEEP=1;
}
else if(m<xiaxian)
{
ALAM1=0;
ALAM=1;
BEEP=1;
}
else
{
BEEP=1;
ALAM=1;
ALAM1=1;
}
}
void main(void)
{
unit z;
Init Timer();
EA=1;
TR0=1;
ET0=1;
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;<300;z++);
{
Disp_init();
}
while(1)
{
if(SET==0)
{
Delay(2000);
do{}while(SET==0);
set_st++;x=0;shanshuo_st=1;
if(set_st>2)set_st=0;
}
if(set_st==0)
{
EX0=0;
EX1=0;
check_wendu();
Disp_Temperature();
Alarm();
}
else if(set_st==1)
{
BEEP=1;
ALAM=1;
ALAM1=1;
EX0=1;
EX1=1;
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st){Disp_alarm(shangxian);}
}
else if(set_st==2)
{
BEEP=1;
ALAM=1;
ALAM1=1;
EX0=1;
EX1=1;
if(x>10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st{Disp_alarm(xiaxian);}
}
}
}
void timer0(void) interrupt 1
{
TH0=0x3c
TL0=0xb0;
x++;
}
void int0(void) interrupt 0
{
EX0=0;
if(DEC==0&&set_st==1)
{
do
{
Disp_alarm(shangxian);
}
while(DEC==0);
shangxian--;
if(shangxian<=xiaxian)shangxian=xiaxian+1;
}
else if(DEC==0&&set_st==2)
{
do
{
Disp_alarm(xiaxian);
}
while(DEC==0);
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
void int1(void) interrupt 2
{
EX1=0;
if(ADD==0&&set_st==1)
{
do
{
Disp_alarm(shangxian);
}
while(ADD==0);
shangxian++;
if(shangxian>99)shangxian=99;
}
else if(ADD==0&&set_st==2)
{
do
{
Disp_alarm(xiaxian);
}
while(ADD==0);
xiaxian++;
if(xiaxian>=shangxian)xiaxian=shangxian-1;
}
}

控温报警

控温报警
回复

使用道具 举报

ID:481641 发表于 2019-4-6 08:25 | 显示全部楼层
#在这#include <reg52.H> #include <intrins.H> #include <math.H>  #define uchar unsigned char   #define uint unsigned int  sbit dula = P2^6;  sbit wela = P2^7;  sbit rw = P3^6;   sbit RS = P3^5;       sbit LCDEN = P3^4;   void delayUs() {     _nop_(); }   void delayMs(uint a) {     uint i, j;     for(i = a; i > 0; i--)         for(j = 100; j > 0; j--);  }   void writeComm(uchar comm) {      RS = 0;         P0 = comm;     LCDEN = 1;      delayUs();     LCDEN = 0;     delayMs(1); }  //写数据:RS=1, RW=0; void writeData(uchar dat) {      RS = 1;      P0 = dat;      LCDEN = 1;     delayUs();     LCDEN = 0;     delayMs(1);  }    void init()  {      rw = 0;       dula = wela = 0;     writeComm(0x38);    writeComm(0x0c);      writeComm(0x06);     writeComm(0x01);  }  void writeString(uchar * str, uchar length) {      uchar i;     for(i = 0; i < length; i++)     {          writeData(str[i]);      }  }   /**//*****************************DS18B20*******************************/  sbit ds = P2^2; void dsInit()  {          unsigned int i;       ds = 0;     i = 100;        while(i>0) i--;     ds = 1;        i = 4;      while(i>0) i--;  }   void dsWait()  {       unsigned int i;       while(ds);         while(~ds);       i = 4;       while(i > 0) i--; }   bit readBit() {     unsigned int i;     bit b;     ds = 0;     i++;        ds = 1;     i++; i++;       b = ds;     i = 8;      while(i>0) i--;     return b; }  unsigned char readByte() {     unsigned int i;     unsigned char j, dat;    dat = 0;     for(i=0; i<8; i++)     {         j = readBit();                dat = (j << 7) | (dat >> 1);     }     return dat; }   void writeByte(unsigned char dat) {     unsigned int i;     unsigned char j;     bit b;     for(j = 0; j < 8; j++)     {         b = dat & 0x01;         dat >>= 1;              if(b)            {            ds = 0;          i++; i++;               ds = 1;                 i = 8; while(i>0) i--;           }         else           {             ds = 0;           i = 8; while(i>0) i--;               ds = 1;            i++; i++;         }    } }   void sendChangeCmd() {     dsInit();         dsWait();        delayMs(1);         writeByte(0xcc);     writeByte(0x44); }  void sendReadCmd() {     dsInit();     dsWait();     delayMs(1);     writeByte(0xcc);      writeByte(0xbe);  }   int getTmpValue() {     unsigned int tmpvalue;     int value;      float t;     unsigned char low, high;     sendReadCmd();          low = readByte();      high = readByte();         tmpvalue = high;     tmpvalue <<= 8;     tmpvalue |= low;     value = tmpvalue;        \     t = value * 0.0625;     \     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5     return value; }  void display(int v)  {     unsigned char count;     unsigned char datas[] = {0, 0, 0, 0, 0};     unsigned int tmp = abs(v);     datas[0] = tmp / 10000;     datas[1] = tmp % 10000 / 1000;     datas[2] = tmp % 1000 / 100;     datas[3] = tmp % 100 / 10;     datas[4] = tmp % 10;     writeComm(0xc0+3);     if(v < 0)     {         writeString("- ", 2);    }     else     {        writeString("+ ", 2);     }     if(datas[0] != 0)     {         writeData('0'+datas[0]);     }     for(count = 1; count != 5; count++)     {         writeData('0'+datas[count]);         if(count == 2)         {             writeData('.');         }     } } /**//*****************************DS18B20*******************************/  void main() {     uchar table[] = "  xianzaiwendu: ";     sendChangeCmd();     init();     writeComm(0x80);     writeString(table, 16);     while(1)     {         delayMs(1000); //温度转换时间需要750ms以上         writeComm(0xc0);         display(getTmpValue());         sendChangeCmd();     } }里快速回复#
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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