DS18B20溫度顯示

2021-01-21 電氣自動化資料庫

#include <reg52.h>

#include "lcd.h"

#include "delay.h"

#include "commondef.h"

#include "onewire.h"



unsigned char  flag=1;

void Timer0Init(void); //10毫秒@11.0592MHz


void main()

{

unsigned char ack;

int temp;                    //保存接收溫度數據

int intTemp,decTemp;         //分離溫度數據的整數部分和小數部分

unsigned char str[12];        //保存數據轉換成的字符串ASCII

unsigned char len;

  lcdinit();

  Timer0Init();

    start18b20();

    delay(10);

while(1)

if(flag)

{

flag=0;

ack = read18b20(&temp);

if(ack)

{

  intTemp = temp >> 4;    //保留整數部分

  decTemp = temp & 0x0f;   

  len = integertostr(intTemp,str);

  str[len++]='.';

  decTemp = (decTemp*100)/16;  //*0.0625

  str[len++] = decTemp/10+'0';

  str[len++] = decTemp%10+'0';

while(len<6)

{

str[len++]=' ';

}

    str[len] = '\0';

   lcdshowstr(0,0,str);

}

start18b20();

}

}

}


void Timer0Init(void) //10毫秒@11.0592MHz

{


TMOD &= 0xF0; //設置定時器模式

TMOD |= 0x01; //設置定時器模式

TL0 = 0x00; //設置定時初值

TH0 = 0xDC; //設置定時初值

ET0 = 0;

EA = 1;

TF0 = 0; //清除TF0標誌

TR0 = 1; //定時器0開始計時

}



void Timer0_ISR() interrupt 1

{

   static unsigned char timer0Cnt=0;

    TR0=0;

TL0 = 0x00; //設置定時初值

TH0 = 0xDC; //設置定時初值

     timer0Cnt++;

if(timer0Cnt>=100)

{

  timer0Cnt=0;

flag=1;

}

TR0=1;

}












#include <reg52.h>

#include "lcd.h"

#include "delay.h"

#include "commondef.h"

#include "onewire.h"



 #define lcd_mode_pin8  0x38  //8????,??,5*8??

  #define lcd_mode_pin4  0x28  //4????,??,5*8??

  #define lcd_screen_clr  0x01  //???

  #define lcd_cursor_rst  0x02  //????




 #define lcd_dis_cur_blk_on 0x0F  //???,???,????

 #define lcd_dis_cur_on 0x0E  //???,???,?????

 #define lcd_dis_on 0x0C  //???,???,?????

 #define lcd_dis_off 0x08  //???,???,?????

 


 

  # define lcd_cursor_right 0x06   //????,?????

  # define lcd_cursor_left 0x04   //????,?????

  # define lcd_dis_mode_left 0x07   //???,AC??,????,

  # define lcd_dis_mode_right 0x05   //???,AC??,????,



#define lcd_cur_move_left 0x10 //????

#define lcd_cur_move_right 0x14 //????

#define lcd_dis_move_left 0x18 //????

#define lcd_dis_move_right 0x1C //????




void lcdreadbf()

{

unsigned char state;

unsigned char  i;

lcd1602_db=0xff;//i0??1  ??? 

lcd1602_rs=0;

lcd1602_rw=1;

do

{

  lcd1602_en=1;

state=lcd1602_db;

lcd1602_en=0;

  

  i++;

if(i>50)

break;

}

while(state&0x80);


}



void lcdwritecmd(unsigned char cmd)

{

lcdreadbf();//????? ,????? 

  lcd1602_rs=0;  

lcd1602_rw=0;

lcd1602_db=cmd;

lcd1602_en=1;

lcd1602_en=0;

}



void lcdwritedata(unsigned char dat)

{

lcdreadbf();           //????? ,?????

  lcd1602_rs=1;   

lcd1602_rw=0;

lcd1602_db=dat;

lcd1602_en=1;

lcd1602_en=0;

}



void lcdinit()

{

   lcdwritecmd(lcd_mode_pin8); //?????? 2?,5*8??

   lcdwritecmd(lcd_dis_on);     //???  ???

lcdwritecmd(lcd_cursor_right);   //????

   lcdwritecmd(lcd_screen_clr);    //??

}


void lcdsetposition(unsigned char x,unsigned char y)

{

   if(0==y)

{

lcdwritecmd(0x80|x);       //???    0X80   +0X40   =0XC0 

     }  

else

{

lcdwritecmd (0xC0+x);      //???

}

 

}




void lcdshowstr(unsigned char x,unsigned char y, unsigned char *str)

{

 

lcdsetposition(x,y);

while(*str!='\0')

{

lcdwritedata(*str++);


}

}


unsigned char integertostr(int dat,unsigned char *str)

{

  unsigned char i;

unsigned char len;

unsigned char buf[11];

if(dat<0)

{

dat= -dat;//如果是負數,取絕對值

*str = '-';

str++;

  len++;

}

  do

{

buf[i++]=dat%10+'0';   //dat%10+0x30;buf[0]='8'  buf[1]='7'

dat/=10;

}

while(dat>0);

  len += i;

while(i-- > 0)


{

   *str++=buf[i];

}


*str='\0';

return len;

}




/*

void lcdsetchar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str )

{

  unsigned char i;

for(i=0;i<8;i++);

{

lcdwritecmd(0x40+pos*8+i);

lcdwritedata(*(str+i));

  }

lcdsetposition(x,y);

lcdwritedata(0x00+pos);


}

*/






#include <reg52.h>

#include "lcd.h"

#include "delay.h"

#include "commondef.h"

#include "onewire.h"




bit onewirerest()


{

bit ack;

EA=0;

    ds18b20 = 0;

Delay600us();

ds18b20 = 1;

Delay60us();

ack = ds18b20;

while(!ds18b20);

EA=1;

return ack;

}


void writeonewire(unsigned char dat)

{

  unsigned char temp;

EA=0;

for(temp=0x01; temp!=0; temp << 1)

{

    ds18b20=0;

_nop_();

_nop_();

if((dat & temp)==0)

ds18b20=0;

        else

        ds18b20=1;

    Delay60us();

ds18b20=1;

}

   EA=1;

    }




bit readyonewire()

   {

        unsigned char dat;

    unsigned char temp;

    EA=0;

for(temp=0x01; temp!=0; temp<<1)

{

  ds18b20=0;

_nop_();

_nop_();

  ds18b20=1;

_nop_();

_nop_();

if(!ds18b20)

dat&=~temp;

    else

    dat|=temp;

    Delay60us();

    }

EA=1;

return dat;

}




//////////////////////////////


bit start18b20()


{

    bit ack;

//1 初始化

ack=onewirerest();

if(ack == 0)

{

//2ROM指令

writeonewire(SKIP_ROM);

//3功能指令,啟動溫度轉換

writeonewire(CONVERT_T);

}  

 return ~ack;

}

    bit read18b20(int*temp)

  {  

    bit ack;

    unsigned char msb,lsb;

//1初始化

ack=onewirerest();

    if(ack==0)

  {  

//2ROM指令

    writeonewire(SKIP_ROM); 

    //3功能指令,啟動溫度轉換

writeonewire(READ_REGISTER);

    //4 讀轉換結果 根據功能指令來確實 

    lsb=readyonewire();

    msb=readyonewire();

    *temp =((int)msb<<8)+lsb;   

  }

  

  return ~ack;

}







#ifndef __ONEWIRE_H__

#define __ONEWIRE_H__


//#include "reg52.h"


 sbit ds18b20 =  P2^2;

 bit onewirerest();

 bit read18b20(int*temp);

 bit start18b20();

 bit readyonewire();

void writeonewire(unsigned char dat);






//ROM

#define SEARCH_ROM            0xf0      //搜索ROM指令

#define READ_ROM              0X33      //讀取ROM指令

#define  MATH_ROM             0X55      //匹配ROM指令

#define  SKIP_ROM             0XCC      //跳過ROM指令

#define  ALARM_SEARCH         0XEC      //報警搜索指令



// 暫存器指令


#define   CONVERT_T           0X44   //溫度轉換指令

#define   WRITE_REGISTER      0X4E   //寫暫存器指令

#define   READ_REGISTER       0XBE   //讀取暫存器指令

#define   COPY_REGISTER       0X48   //拷貝暫存器指令

#define   RECALL_E2           0XB8   //召回EEPROM指令

#define   READ_POWER_SUPPLY   0XB4   //讀取電源模式指令








#endif








#include <reg52.h>

#include "lcd.h"

#include "delay.h"

#include "commondef.h"

#include "onewire.h"



void Delay600us() //@11.0592MHz

{


uchar i,j;

_nop_();

i = 2;

j = 15;

do

{

while (--j);

} while (--i);

}




void Delay60us() //@11.0592MHz

{


uchar i;

i = 25;

while (--i);

}



void delay(uint16 x_ms) //延遲  x_ms*1  毫秒


{

uint16 i,j;

for(i=x_ms;i>2;i--)

for(j=1;j>2;j--);


}






/*----

REG52.H


Header file for generic 80C52 and 80C32 microcontroller.

Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

----*/


#ifndef __DELAY_H__

#define __DELAY_H__


#include "delay.h"

#include "intrins.h"


#define uint16 unsigned int

#define uchar unsigned char



void Delay600us(); //@11.0592MHz

void Delay60us(); //@11.0592MHz

void delay(uint16 x_ms);


#endif









/*----

REG52.H


Header file for generic 80C52 and 80C32 microcontroller.

Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.

All rights reserved.

----*/


#ifndef __LCD_H__

#define __LCD_H__


#include <reg52.h>

#include "lcd.h"

#include "delay.h"

#include "commondef.h"

#include "onewire.h"


#define lcd1602_db P0


sbit lcd1602_en=P2^4;

sbit lcd1602_rs=P2^5;

sbit lcd1602_rw=P2^6;


void lcdshowstr(unsigned char x,unsigned char y, unsigned char *str);

void lcdsetposition(unsigned char x,unsigned char y);

void lcdwritecgram();

void lcdinit();

void lcdwritecgram();

void lcdwritedata(unsigned char dat);

unsigned char integertostr(int dat,unsigned char *str);


#endif












相關焦點

  • 基於DS18B20的家用溫度測量器設計
    一、設計概況本文引用地址:http://www.eepw.com.cn/article/194716.htm  本製作採用USB口作為供電埠,用DS18B20溫度傳感器進行溫度信息採集
  • 基於DS18B20和AT89C2051的家用溫度測量器設計研究
    ,用AT89C2051單片機進行控制,採用四位共陽數碼管顯示,從而實現對溫度的測量顯示(系統框圖如圖1所示)。,且溫度轉換的延時時間由2s減為750ms。其中,低溫度係數晶振的振蕩頻率受溫度影響很小,用於產生固定頻率的脈衝信號送給計數器1。高溫度係數晶振的振蕩頻率隨溫度變化改變明顯,所產生的信號作為計數器2的脈衝輸人。計數器1和溫度寄存器被預置在-55℃所對應的—個基數值。
  • 用18B20做溫度補償的超聲波測距程序
    >sbit en=P1^2;sbit wave=P1^4;uint tvalue;//溫度值用18B20做溫度補償的超聲波測距程序uchar tflag;//溫度正負標誌sbit DQ=P1^3;//ds18b20與單片機連接口char idata disp_buf1[16
  • 如何在樹莓派上使用DS18B20來獲取溫度讀數
    1線溫度傳感器的支持。 從Raspberry開始Pi沒有ADC(模數轉換器),它不能直接使用TMP36之類的模擬溫度傳感器,這使得DS18B20成為溫度傳感的理想選擇。 硬體 DS18B20電晶體外形尺寸(TO-92)部件和防水有線型號的麵包板布局如下所示。我們提供了較舊的20針和現代40針Raspberry Pi連接器的示例。
  • 用單片機實現溫度遠程顯示
    從鍋爐房至2個熱交換站的距離分別約600 m,值班人員要不停地奔波於2個熱交換站與鍋爐房之間進行設備巡視,檢查熱水溫度是否控制在規定的範圍。這樣不僅增加了值班人員的勞動強度,同時也使鍋爐房經常無人(因每班1人值班)。如果能在鍋爐房顯示2個熱交換站內各熱交換器的熱水溫度,則值班人員僅在熱水溫度異常時才需到熱交換站檢查設備,這樣便可解決上述問題。
  • 數字電位器在液晶顯示模塊溫度補償電路中的應用
    液晶顯示器件獨具的低壓、微功耗特性使它可以直接與大規模集成電路結合開發出一系列具有便攜顯示功能的產品,再加之其顯示信息量大和接口方便等優點,現在已被廣泛應用於計算機和數字式儀表等領域,成為測量結果顯示和人機對話的重要工具。
  • 華為申請專利:攝像頭拍人體/物體顯示溫度信息
    2020-11-23 10:23:25 來源: 網易科技報導 舉報   天眼查App顯示
  • 水溫表顯示水箱溫度85° 這算正常嗎?
    當然,水溫的顯示,相對機械儀表簡陋的指針來說,液晶儀表能夠精確到具體數值就顯得高端許多了。(水溫表)單獨顯示。一般的發動機水溫表採用了實體或虛擬錶盤指針顯示。無論是實體還是虛擬水溫表,其指針方位基本相類似。當儀錶盤水溫表顯示溫度過高時,我們首先應該要排除的就是由於儀錶盤損壞導致的「假故障」。
  • 數顯溫度計設計電路圖大全(DS18B20/89S51單片機/液晶)
    ,只需將開關打在2的位置,通過設定控制溫度,並通過3位半數顯表頭所顯示的溫度值,即可精確地控制溫度,使得溫控操作變得十分方便。根據LM35的輸出特性可知,當溫度在0—150℃之間變換時,其輸出端對應的電壓為0—150V,此電壓經電位器W3分壓後送到3位半數字顯示表頭的檢測信號輸入端.在輸入端輸入的電壓為150V時,通過調節電位器使顯示的數值為150.0,經調整後數顯表頭顯示的數值就是實測的溫度值。
  • 華為申請「帶溫度測量及顯示結果圖形用戶界面的手機」專利
    新京報貝殼財經訊 企查查App顯示,11月17日,華為技術有限公司公布一項名為「帶溫度測量及顯示結果圖形用戶界面的手機」的專利,專利類型為外觀專利,申請日為2020年3月31日,公開號為CN306175428S。簡單法律狀態為有效。
  • 海軍「人體溫度計」:儀表顯示溫度正常手摸出異常
    那天,欄目組事先準備好48缸不同溫度的水,主持人和現場嘉賓從中隨機挑選3缸,我連續兩次用手測出的水溫誤差在1℃以內,挑戰成功,嘉賓交口稱讚我是名副其實的「人體溫度計」。節目播出後,很多人打電話來問我是不是有什麼特異功能,我告訴他們,我剛入伍時也只是普通一兵。
  • DS18B20延時函數版
    0xa6;uchar code seg7[]={0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60}; //數碼管整數sbit dec=P0^5;//數碼管小數位sbit Dq=P3^4; //DS18B20讀寫口sbit alarm=P3^3; //喇叭報警位uint warning=0;//報警溫度變量
  • 華為「測溫」手機申請專利 主要用於測量顯示人體、物體溫度
    打開APP 華為「測溫」手機申請專利 主要用於測量顯示人體、物體溫度 朝暉 發表於 2020-11-23 11:14:56 11月23日消息,據天眼查顯示,近日,華為技術有限公司公開了一項名為「帶溫度測量及顯示結果圖形用戶界面的手機」的專利,專利類型為外觀專利。 摘要中顯示,該專利是「通過手機、平板的攝像頭掃描人體或物體後,主視圖界面中部顯示測量的人體或物體的溫度信息」。 該專利於2020年3月31日申請,11月17日正式公開。
  • 華為上架智能保溫杯:三層不鏽鋼 實時溫度顯示
    華為商城眾測上架了一款智能保溫杯,支持實時溫度顯示,秒測水質純淨度,售價129元。這款智能保溫杯採用三層不鏽鋼結構,24小時長效保溫保冷。同時堅固抗摔,隔熱不燙手,表面塗層讓杯身耐磨刮,不易滑手不易變色。
  • 華為申請「帶溫度測量及顯示結果圖形用戶界面的手機」專利,或助力...
    11月23日,資本邦獲悉,天眼查App顯示,華為技術有限公司於11月17日公布一項名為「帶溫度測量及顯示結果圖形用戶界面的手機」的專利,專利類型為外觀專利,摘要中顯示該專利是「通過手機、平板的攝像頭掃描人體或物體後,主視圖界面中部顯示測量的人體或物體的溫度信息」。
  • 華為申請「測溫」手機專利:主要用於測量顯示人體、物體溫度
    11月23日消息,據天眼查顯示,近日,華為技術有限公司公開了一項名為「帶溫度測量及顯示結果圖形用戶界面的手機」的專利,專利類型為外觀專利。摘要中顯示,該專利是「通過手機、平板的攝像頭掃描人體或物體後,主視圖界面中部顯示測量的人體或物體的溫度信息」。
  • 口罩直接顯示溫度,濱州少年發明申報專利
    在濱州市蓮華學園開學典禮上,八年級一班13歲林容可同學展示了它發明的「有溫度」的口罩。林容可說,「這個口罩是四月份設計的,當時疫情比較嚴重,只能在家上網課,我就想每個人測體溫很麻煩,進校之後要挨個排隊挨個量,可不可以搞一個類似於智能手錶、智能手環的智能口罩,每個人不用排隊就可以把體溫量出來,用最快的時間量出準確的數值。
  • 熱水器顯示溫度的地方有水是怎麼回事?這個問題我們不能忽視!
    熱水器顯示溫度的地方有水蒸汽,家居雜壇還真遇到過,雖然出現的機率不是很大,確實有可能發生;可能大家經常能看到的是壓力表或者是溫度計裡面有水蒸汽還有水,熱水器的溫度顯示屏進水卻很少見到,其實它們的形成的原理都是一樣的,都是水蒸氣的侵入凝結成水造成的。