找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5484|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

DS1820的測(cè)溫報(bào)警程序 溫控程序 求助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:67818 發(fā)表于 2014-10-23 15:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我想寫(xiě)個(gè)DS1820的測(cè)溫報(bào)警程序,現(xiàn)在只把溫度顯示出來(lái)了,但是報(bào)警卻不會(huì)做,報(bào)警范圍就是在室溫大于70度時(shí)就亮一個(gè)LED燈并且發(fā)出警報(bào),室溫小于-20度時(shí)就藍(lán)燈亮同時(shí)發(fā)出警報(bào)。希望熱心人幫幫我,我的QQ860689974
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:67818 發(fā)表于 2014-10-23 15:25 | 只看該作者
這是我的程序#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int  sbit bz=P3^7; sbit ledH=P2^3; sbit ledL=P2^6;         sbit DQ=P3^3;//ds18b20與單片機(jī)連接口 sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2;  unsigned char code str1[]={"temperature:  "}; unsigned char code str2[]={"              "};   uchar data disdata[5]; uint tvalue;//溫度值 uchar tflag;//溫度正負(fù)標(biāo)志  /*************************lcd1602程序**************************/  void delay1ms(unsigned int ms)  {unsigned int i,j;    for(i=0;i<ms;i++)     for(j=0;j<100;j++);  }         //蜂鈴器  void buzzer()   {           while(1)       {           bz=~bz;         }        }           void wr_com(unsigned char com)//寫(xiě)指令//  {  delay1ms(1);    RS=0;    RW=0;    EN=0;    P0=com;    delay1ms(1);    EN=1;    delay1ms(1);    EN=0;   }  void wr_dat(unsigned char dat)//寫(xiě)數(shù)據(jù)// {  delay1ms(1);;    RS=1;    RW=0;    EN=0;    P0=dat;    delay1ms(1);    EN=1;    delay1ms(1);    EN=0; }   void lcd_init()//初始化設(shè)置// {delay1ms(15);  wr_com(0x38);delay1ms(5);  wr_com(0x08);delay1ms(5);  wr_com(0x01);delay1ms(5);  wr_com(0x06);delay1ms(5);  wr_com(0x0c);delay1ms(5);  bz=0;   ledH=0;   ledL=0; }    void display(unsigned char *p)//顯示// { while(*p!='\0') { wr_dat(*p); p++; delay1ms(1); } }    init_play()//初始化顯示   { lcd_init();     wr_com(0x80);          display(str1);          wr_com(0xc0);          display(str2);       wr_com(0xc7);       wr_dat(0xdf);       wr_com(0xc8);       wr_dat(0x43);            }  /******************************ds1820程序***************************************/  delay_18B20(uint t) {         for(t=11;t>0;t--); }  void ds1820rst()/*ds1820復(fù)位*/  {           uint i;                    //不能用uchar i;因:uchar為1個(gè)字節(jié)不能表示i=100         DQ=1; _nop_();_nop_();         DQ=0;         i=80;                     //延時(shí)約900us 理論延時(shí):480~960us         while(i>0)i--;         DQ=1;         i=10;                       //延時(shí)約45us 理論延時(shí):15~60us          while(i>0)i--;         while(DQ);                //等待DQ為低電平//         while(~DQ);               //等待DQ為高電平,檢測(cè)到應(yīng)答脈沖//                      }         uchar ds1820rd()/*讀數(shù)據(jù)*/   { unsigned char i=0;          unsigned char dat = 0;          for (i=8;i>0;i--)          {   DQ = 0; //給脈沖信號(hào)           _nop_();                   dat>>=1;                   DQ = 1; //給脈沖信號(hào)           _nop_();           _nop_();                   if(DQ)                   dat|=0x80;                   delay_18B20(30);          }          return(dat);   }    void ds1820wr(uchar wdata)/*寫(xiě)數(shù)據(jù)*/   {unsigned char i=0;     for (i=8; i>0; i--)    { DQ = 0;      DQ = wdata&0x01;      delay_18B20(5);      DQ = 1;      wdata>>=1;    }  }         read_temp()/*讀取溫度值并轉(zhuǎn)換*/  {uchar a,b;   ds1820rst();       ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/   ds1820wr(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/   ds1820rst();       ds1820wr(0xcc);//*跳過(guò)讀序列號(hào)*/    ds1820wr(0xbe);//*讀取溫度*/    a=ds1820rd();   b=ds1820rd();   tvalue=b;   tvalue<<=8;   tvalue=tvalue|a;     if(tvalue<0x0fff)    tflag=0;     else    {tvalue=~tvalue+1;          tflag=1;    }   tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)         return(tvalue);   }  /*******************************************************************/    void ds1820disp()//溫度值顯示         { uchar flagdat;           disdata[0]=tvalue/1000+0x30;//百位數(shù)      disdata[1]=tvalue%1000/100+0x30;//十位數(shù)      disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)      disdata[3]=tvalue%10+0x30;//小數(shù)位           if(tflag==0)             flagdat=0x20;//正溫度不顯示符號(hào)      else        flagdat=0x2d;//負(fù)溫度顯示負(fù)號(hào):-       if(disdata[0]==0x30)            {disdata[0]=0x20;//如果百位為0,不顯示                  if(disdata[1]==0x30)                   {disdata[1]=0x20;//如果百位為0,十位為0也不顯示                   }          if(disdata[0]==7)            {             ledH=1;             buzzer();            }                 }             wr_com(0xc0);                 wr_dat(flagdat);//顯示符號(hào)位            wr_com(0xc1);            wr_dat(disdata[0]);//顯示百位            wr_com(0xc2);            wr_dat(disdata[1]);//顯示十位                     wr_com(0xc3);            wr_dat(disdata[2]);//顯示個(gè)位                     wr_com(0xc4);            wr_dat(0x2e);//顯示小數(shù)點(diǎn)                     wr_com(0xc5);            wr_dat(disdata[3]);//顯示小數(shù)位    }    /********************主程序***********************************/  void main()   {        init_play();//初始化顯示       while(1)         {      read_temp();//讀取溫度      ds1820disp();//顯示           }           //if(j<L_temp-20)    //  {ledL=1;    //   buzzer();   //   }        }   
回復(fù)

使用道具 舉報(bào)

板凳
ID:262 發(fā)表于 2014-10-23 15:26 | 只看該作者
/******************************************************************
本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
程序結(jié)構(gòu)參考 安徽師范大學(xué)  Lyzhangxiang的EasyHW OS結(jié)構(gòu)設(shè)計(jì)
Main.C  file
作者:bg8wj
建立日期: 2011.12.23
版本:V1.0
Copyright(C) bg8wj
/*******************************************************************/
#include "ioconfig.h"
#include "includes.h"
#include "datacomm.h"
/************************************************
              PID函數(shù)
*************************************************/
void PIDInit (struct PID *pp)
{
  memset ( pp,0,sizeof(struct PID));
}
/************************************************
              增量控制PID函數(shù)體
51單片機(jī)最不擅長(zhǎng)浮點(diǎn)數(shù)計(jì)算,轉(zhuǎn)換成int型計(jì)算
*************************************************/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
  unsigned int dError,Error,pError;
  //增量法計(jì)算公式:
  //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  Error = set_temper - NextPoint;       // 偏差E(t)
  pError=Error-pp->LastError;         //E(t)-E(t-1)
  dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  pp->PrevError = pp->LastError;
  pp->LastError = Error;
  return (
            pp->Proportion * pError        //比例
            + pp->Integral *Error  //積分項(xiàng)
            + pp->Derivative * dError          // 微分項(xiàng)
                        );  
}

/************************************************
                                PID函數(shù)初始化
*************************************************/
void PIDBEGIN()
{
  PIDInit(&spid); // Initialize Structure
  spid.Proportion = 10; // Set PID Coefficients
  spid.Integral = 5;
  spid.Derivative =4;
}
/************************************************
                         實(shí)時(shí)溫度讀取函數(shù)
從DS18b20中讀取實(shí)時(shí)溫度
返回值放大10倍便于PID計(jì)算
*************************************************/
int ReadTemperature(void)
{
        unsigned char TPL=0;
        unsigned char TPH=0;
        unsigned int temperture=0;

        //EA = 0;                 
        Init_DS18B20();
        WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
        TPL=ReadOneChar();        //讀溫度低字節(jié)
        TPH=ReadOneChar();        //讀溫度高字節(jié)

        //啟動(dòng)下一次溫度轉(zhuǎn)換
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
         //temperture=(TPH*256+TPL)*0.0625   //真實(shí)溫度值 范圍(+125,-55)
        if(TPH&0xfc)
         {
           tp_flag=1;    //負(fù)溫度標(biāo)記
           temperture=((TPH<<8)|TPL);
           temperture=((~temperture)+1);
           temperture*=0.625+0.5;
         }
        else
         {
           tp_flag=0;
           //temperture=((TPH<<8)|TPL)*0.0625 //溫度輸出值范圍(125.00,-55.00)
           temperture=((TPH<<8)|TPL)*0.625+0.5;//溫度值放大10倍 范圍(+1250.00,-550.00)
         }                                                                        //         +0.5四舍五入 精度只到小數(shù)后一位
        return(temperture);         
}
/************************************************
                                  lcd1602顯示函數(shù)
*************************************************/
void xianshi(void)
{
    LCD_Write_String(0,0,"NOW TMP:");
        LCD_Write_String(0,1,"SET TMP:");
}
/************************************************
                        lcd1602顯示實(shí)時(shí)溫度
*************************************************/
void view(unsigned int tmp)
{
        LCD_Write_Char(15,0,'C');
        LCD_Write_Char(14,0,0xdf);//攝氏溫度符號(hào)
        LCD_Write_Char(13,0,zhi[tmp%10]);//小數(shù)點(diǎn)后第1位
        LCD_Write_Char(12,0,'.');                 
        LCD_Write_Char(11,0,zhi[tmp%100/10]);//        個(gè)位
        LCD_Write_Char(10,0,zhi[tmp/100]);         //十位
        if(0==tmp/1000)LCD_Write_Char(9,0,' ');//百位 如果為零顯示空格
        else
         LCD_Write_Char(9,0,zhi[tmp/1000]);
        if(1==tp_flag)LCD_Write_Char(8,0,'-');//正負(fù)溫度符號(hào)顯示 負(fù)溫度顯示- 0上顯示空格
         else
         LCD_Write_Char(8,0,' ');
}
/***********************************************************
             PID溫度控制做動(dòng)函數(shù)
***********************************************************/
void compare_temper()                 //PID溫度控制輸出函數(shù)
{
  unsigned char i;

  if(set_temper>temper)
   {
    if(set_temper-temper>50)//如果控制目標(biāo)溫度溫與實(shí)時(shí)溫度差大于5度,(放大10倍)是50
     {

           PWM0_set(10); //PWM 輸出高電平占空比最大。即全速加溫
           PWM1_set(10);
     }
        else
    {
     for(i=0;i<10;i++) //5度范圍內(nèi)PID增量控制,10次周期 即PID積分式中T=10
     {
      rin=ReadTemperature();//PID輸入實(shí)時(shí)溫度采樣值
      rout = PIDCalc ( &spid,rin ); // PID增量輸出
     }//PID增量輸出范圍(0-255)配合pwm取值范圍
     send_string_com("pid out:"); //串口輸出監(jiān)視數(shù)據(jù)
         send_char_com(rin); //實(shí)時(shí)溫度值
         send_char_com(rout);//PID增量輸出值
         send_char_com(0x0d);//輸出回車(chē),換行間隔控制字符
         send_char_com(0x0a);//
         
         if(rout>=240)rout=240;        //保障PWM輸入值10-240 防止pwm出現(xiàn)失調(diào)。stc單片機(jī)特性。
         if(rout<=20)rout=20;
         
         PWM0_set(255-rout);
         PWM1_set(255-rout);
          
    }
   }
  else if(set_temper<=temper) //目標(biāo)溫度小于實(shí)時(shí)溫度pwm輸出低電平最高占空比,關(guān)閉加熱。
   {
     PWM0_set(250);
         PWM1_set(250);
   }
}
/************************************************
                        系統(tǒng)初始化函數(shù)
*************************************************/
void Sys_Init()                                                               
{
PWM_init();
PIDBEGIN();
LCD_Init();
Init_DS18B20();
LCD_Clear();
InitUart1();
}
/*************************************************
                  主函數(shù)
**************************************************/
void main(void)
{        
Sys_Init();                //系統(tǒng)初始化
xianshi();                        //顯示字符
PWM0_set(250);                //初始化PWM兩路輸出最高低電平占空比,不要加熱
PWM1_set(250);
delay500ms();                //延時(shí)稍等芯片初始化
while(1)
  {  
           EA=0;
          k=KeyPro();            //鍵盤(pán)掃描
          if(k!=0xff)
           {
           if(k==15){i=0;shu[0]=0;shu[1]=0;shu[2]=0;shu[3]=0;}
           else{shu[i]=k;i++;if(i>3)i=0;}//鍵值15對(duì)應(yīng)清除設(shè)定溫度顯示及數(shù)組為0
         }
         if(k==14)//鍵值14鍵 置入設(shè)定溫度并確定 輸入格式xxx+確定鍵 第一位是百度 為0需要輸入0
         {
          EA=1;
          set_temper=1000*(shu[0])+100*shu[1]+10*shu[2];
          compare_temper();        //啟動(dòng)PID溫度控制作動(dòng)函數(shù)
         }
        LCD_Write_Char(15,1,'C');        //顯示設(shè)定溫度值百位為0時(shí) 顯示空格 但是輸入必須輸入0
           LCD_Write_Char(14,1,0xdf); //溫標(biāo)符號(hào)
        LCD_Write_Char(13,1,zhi[0]);
        LCD_Write_Char(12,1,'.');
        LCD_Write_Char(11,1,zhi[shu[2]]);
        LCD_Write_Char(10,1,zhi[shu[1]]);
       
        if(shu[0]==0)LCD_Write_Char(9,1,' ');
        else LCD_Write_Char(9,1,zhi[shu[0]]);   
       
        if(counter-- == 0) //溫度聯(lián)系讀5次
         {
          temper=ReadTemperature();                        
          counter =5;
         }
        view(temper);    //溫度顯示;
        if(!set_temper==0)compare_temper();//只有設(shè)置目標(biāo)溫度后才啟動(dòng)PID溫控作動(dòng)函數(shù)       
}
}


回復(fù)

使用道具 舉報(bào)

地板
ID:262 發(fā)表于 2014-10-23 15:27 | 只看該作者
/********************************************************************
本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
程序結(jié)構(gòu)參考 安徽師范大學(xué)  Lyzhangxiang的EasyHW OS結(jié)構(gòu)設(shè)計(jì)
datacomm.h
作者:bg8wj
建立日期: 2012.12.23
版本:V1.0

Copyright(C) bg8wj
/********************************************************************/
#ifndef  __DATACOMM_H__
#define  __DATACOMM_H__


/************************************************
PID函數(shù)
*************************************************/
/*************PID**********************************/
struct PID {
unsigned int Proportion; // 比例常數(shù) Proportional Const
unsigned int Integral; // 積分常數(shù) Integral Const
unsigned int Derivative; // 微分常數(shù) Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
};
xdata struct PID spid; // PID Control Structure

unsigned int rout; // PID Response (Output)
unsigned int rin; // PID Feedback (Input)

unsigned char key1,i,k;
unsigned int temper;
unsigned char shu[3]={0,0,0};
unsigned char counter;
unsigned char set_temper;
bit tp_flag;


#endif
回復(fù)

使用道具 舉報(bào)

5#
ID:262 發(fā)表于 2014-10-23 15:27 | 只看該作者
回復(fù)

使用道具 舉報(bào)

6#
ID:67818 發(fā)表于 2014-10-23 20:22 | 只看該作者
嘿嘿謝謝嘍
回復(fù)

使用道具 舉報(bào)

7#
ID:74571 發(fā)表于 2015-3-13 21:00 | 只看該作者
現(xiàn)在還需要不
回復(fù)

使用道具 舉報(bào)

8#
ID:86621 發(fā)表于 2015-8-7 17:57 | 只看該作者
你會(huì)寫(xiě)1602嗎  我有個(gè)會(huì)報(bào)警但是不顯示啊
回復(fù)

使用道具 舉報(bào)

9#
ID:86621 發(fā)表于 2015-8-7 17:57 | 只看該作者
是1602的  我不怎么會(huì)
回復(fù)

使用道具 舉報(bào)

10#
ID:44267 發(fā)表于 2015-9-28 16:53 | 只看該作者
先頂一個(gè)再說(shuō)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表