久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5450|回復: 9
打印 上一主題 下一主題
收起左側

DS1820的測溫報警程序 溫控程序 求助

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

使用道具 舉報

沙發
ID:67818 發表于 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與單片機連接口 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;//溫度正負標志  /*************************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)//寫指令//  {  delay1ms(1);    RS=0;    RW=0;    EN=0;    P0=com;    delay1ms(1);    EN=1;    delay1ms(1);    EN=0;   }  void wr_dat(unsigned char dat)//寫數據// {  delay1ms(1);;    RS=1;    RW=0;    EN=0;    P0=dat;    delay1ms(1);    EN=1;    delay1ms(1);    EN=0; }   void lcd_init()//初始化設置// {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復位*/  {           uint i;                    //不能用uchar i;因:uchar為1個字節不能表示i=100         DQ=1; _nop_();_nop_();         DQ=0;         i=80;                     //延時約900us 理論延時:480~960us         while(i>0)i--;         DQ=1;         i=10;                       //延時約45us 理論延時:15~60us          while(i>0)i--;         while(DQ);                //等待DQ為低電平//         while(~DQ);               //等待DQ為高電平,檢測到應答脈沖//                      }         uchar ds1820rd()/*讀數據*/   { unsigned char i=0;          unsigned char dat = 0;          for (i=8;i>0;i--)          {   DQ = 0; //給脈沖信號           _nop_();                   dat>>=1;                   DQ = 1; //給脈沖信號           _nop_();           _nop_();                   if(DQ)                   dat|=0x80;                   delay_18B20(30);          }          return(dat);   }    void ds1820wr(uchar wdata)/*寫數據*/   {unsigned char i=0;     for (i=8; i>0; i--)    { DQ = 0;      DQ = wdata&0x01;      delay_18B20(5);      DQ = 1;      wdata>>=1;    }  }         read_temp()/*讀取溫度值并轉換*/  {uchar a,b;   ds1820rst();       ds1820wr(0xcc);//*跳過讀序列號*/   ds1820wr(0x44);//*啟動溫度轉換*/   ds1820rst();       ds1820wr(0xcc);//*跳過讀序列號*/    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);//溫度值擴大10倍,精確到1位小數         return(tvalue);   }  /*******************************************************************/    void ds1820disp()//溫度值顯示         { uchar flagdat;           disdata[0]=tvalue/1000+0x30;//百位數      disdata[1]=tvalue%1000/100+0x30;//十位數      disdata[2]=tvalue%100/10+0x30;//個位數      disdata[3]=tvalue%10+0x30;//小數位           if(tflag==0)             flagdat=0x20;//正溫度不顯示符號      else        flagdat=0x2d;//負溫度顯示負號:-       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);//顯示符號位            wr_com(0xc1);            wr_dat(disdata[0]);//顯示百位            wr_com(0xc2);            wr_dat(disdata[1]);//顯示十位                     wr_com(0xc3);            wr_dat(disdata[2]);//顯示個位                     wr_com(0xc4);            wr_dat(0x2e);//顯示小數點                     wr_com(0xc5);            wr_dat(disdata[3]);//顯示小數位    }    /********************主程序***********************************/  void main()   {        init_play();//初始化顯示       while(1)         {      read_temp();//讀取溫度      ds1820disp();//顯示           }           //if(j<L_temp-20)    //  {ledL=1;    //   buzzer();   //   }        }   
回復

使用道具 舉報

板凳
ID:262 發表于 2014-10-23 15:26 | 只看該作者
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
程序結構參考 安徽師范大學  Lyzhangxiang的EasyHW OS結構設計
Main.C  file
作者:bg8wj
建立日期: 2011.12.23
版本:V1.0
Copyright(C) bg8wj
/*******************************************************************/
#include "ioconfig.h"
#include "includes.h"
#include "datacomm.h"
/************************************************
              PID函數
*************************************************/
void PIDInit (struct PID *pp)
{
  memset ( pp,0,sizeof(struct PID));
}
/************************************************
              增量控制PID函數體
51單片機最不擅長浮點數計算,轉換成int型計算
*************************************************/
unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
{
  unsigned int dError,Error,pError;
  //增量法計算公式:
  //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  //積分項
            + pp->Derivative * dError          // 微分項
                        );  
}

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

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

        //啟動下一次溫度轉換
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳過讀序號列號的操作
        WriteOneChar(0x44); // 啟動溫度轉換
         //temperture=(TPH*256+TPL)*0.0625   //真實溫度值 范圍(+125,-55)
        if(TPH&0xfc)
         {
           tp_flag=1;    //負溫度標記
           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四舍五入 精度只到小數后一位
        return(temperture);         
}
/************************************************
                                  lcd1602顯示函數
*************************************************/
void xianshi(void)
{
    LCD_Write_String(0,0,"NOW TMP:");
        LCD_Write_String(0,1,"SET TMP:");
}
/************************************************
                        lcd1602顯示實時溫度
*************************************************/
void view(unsigned int tmp)
{
        LCD_Write_Char(15,0,'C');
        LCD_Write_Char(14,0,0xdf);//攝氏溫度符號
        LCD_Write_Char(13,0,zhi[tmp%10]);//小數點后第1位
        LCD_Write_Char(12,0,'.');                 
        LCD_Write_Char(11,0,zhi[tmp%100/10]);//        個位
        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,'-');//正負溫度符號顯示 負溫度顯示- 0上顯示空格
         else
         LCD_Write_Char(8,0,' ');
}
/***********************************************************
             PID溫度控制做動函數
***********************************************************/
void compare_temper()                 //PID溫度控制輸出函數
{
  unsigned char i;

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

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


回復

使用道具 舉報

地板
ID:262 發表于 2014-10-23 15:27 | 只看該作者
/********************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
程序結構參考 安徽師范大學  Lyzhangxiang的EasyHW OS結構設計
datacomm.h
作者:bg8wj
建立日期: 2012.12.23
版本:V1.0

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


/************************************************
PID函數
*************************************************/
/*************PID**********************************/
struct PID {
unsigned int Proportion; // 比例常數 Proportional Const
unsigned int Integral; // 積分常數 Integral Const
unsigned int Derivative; // 微分常數 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
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

7#
ID:74571 發表于 2015-3-13 21:00 | 只看該作者
現在還需要不
回復

使用道具 舉報

8#
ID:86621 發表于 2015-8-7 17:57 | 只看該作者
你會寫1602嗎  我有個會報警但是不顯示啊
回復

使用道具 舉報

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

使用道具 舉報

10#
ID:44267 發表于 2015-9-28 16:53 | 只看該作者
先頂一個再說
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91高清免费| 精品av| 欧美一区二区三区在线看 | 成人区精品一区二区婷婷 | 久久精品一级 | 9999在线视频 | 午夜影院在线观看版 | 久久成人人人人精品欧 | 97精品国产97久久久久久免费 | 日韩av一区二区在线观看 | 午夜丁香视频在线观看 | 国精久久| 综合久久99 | 国产一区三区在线 | 欧美日韩电影免费观看 | 久久精品国产99国产精品 | 欧美寡妇偷汉性猛交 | 激情网五月天 | 一级毛片中国 | 精品日韩一区二区 | 国产婷婷精品 | 精品亚洲永久免费精品 | 天天爽综合网 | 国产一区二区久久久 | 色婷婷av一区二区三区软件 | 狠狠干夜夜草 | 美女啪啪国产 | aaaa日韩 | 国产视频中文字幕 | 色性av| 日本在线看片 | 欧美aaaaaaaaaa | 最新av在线播放 | 国产探花在线精品一区二区 | 武道仙尊动漫在线观看 | 久久不卡 | 国产ts人妖系列高潮 | 精品一区二区三区四区视频 | 一区二区三区久久久 | 日韩精品一区二区三区视频播放 | 精品国产欧美一区二区 |