標籤:
DS18B20,單片機,11.0592MHZ
</pre><pre name="code" class="cpp">#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------ uS延時函數,含有輸入參數 unsigned char t,無傳回值 unsigned char 是定義無符號字元變數,其值的範圍是 0~255 這裡使用晶振12M,精確延時請使用彙編,大致延時 長度如下 T=tx2+5 uS ------------------------------------------------*/void delay(unsigned int i);#endif
DS18B20_H
#ifndef __DS18B20_H__#define __DS18B20_H__#include<reg52.h> //包含標頭檔,一般情況不需要改動,標頭檔包含特殊功能寄存器的定義#include<intrins.h>#define uchar unsigned char#define uint unsigned int;/*------------------------------------------------ 連接埠定義------------------------------------------------*//*------------------------------------------------ 函式宣告------------------------------------------------*/unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);#endif
delay.c
#include "delay.h"/*------------------------------------------------ uS延時函數,含有輸入參數 unsigned char t,無傳回值 unsigned char 是定義無符號字元變數,其值的範圍是 0~255 這裡使用晶振12M,精確延時請使用彙編,大致延時 長度如下 T=tx2+5 uS ------------------------------------------------*//******************************************************************//* 延時函數 *//******************************************************************/void delay(unsigned int i)//延時函數{ while(i--);}
/*---------<span style="font-family: Arial, Helvetica, sans-serif;">--</span><span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span><span style="font-family: Arial, Helvetica, sans-serif;">-</span>------------------------------------- 名稱:18B20溫度感應器 網站:<span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span> 內容:18B20單線溫度檢測的應用範例程式------------------------------------------------*/#include"delay.h"#include"18b20.h"sbit DQ=P1^3;//ds18b20 連接埠/******************************************************************//* 初始化 *//******************************************************************/void Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ複位 delay(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay(300); //精確延時 大於 480us DQ = 1; //拉高匯流排 delay(10); x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗 delay(5);}/******************************************************************//* 讀一個位元組 *//******************************************************************/unsigned char ReadOneChar(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(5); } return(dat);}/******************************************************************//* 寫一個位元組 *//******************************************************************/void WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; }delay(5);}/******************************************************************//* 讀取溫度 *//******************************************************************/unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳過讀序號列號的操作WriteOneChar(0x44); // 啟動溫度轉換delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8;t=a+b;return(t);}
/*-----------<span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span>--------------------- 名稱:DS18b20數位管顯示 編寫:blog.csdn.net/liuzongming1988 內容:顯示格式 符號 xxx.x C 可以顯示負溫度------------------------------------------------*/#include<reg52.h> //包含標頭檔,一般情況不需要改動,標頭檔包含特殊功能寄存器的定義#include<math.h>#include<INTRINS.H>#include "18b20.h"#include "delay.h"#define uchar unsigned char#define uint unsigned int;/******************************************************************//* 定義連接埠 *//******************************************************************/sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sfr dataled=0x80;//顯示資料連接埠/******************************************************************//* 全域變數 *//******************************************************************/uint temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //7段數位管段碼錶 共陰極 顯示段碼值0~ 9//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//uchar str[6];void Init_Timer0(void);/*------------------------------------------------ 主函數------------------------------------------------*/void main (void){ unsigned char TempH,TempL,j;Init_Timer0();P2=0x00; count=0;temp=ReadTemperature();temp=ReadTemperature();while(1){ str[5]=0x39; //顯示C符號 str[1]=tab[TempH/100]; //百位溫度 str[2]=tab[(TempH%100)/10]; //十位溫度 str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點 str[4]=tab[TempL]; if(flag_get==1) //定時讀取當前溫度 { temp=ReadTemperature(); if(temp&0x8000) { str[0]=0x40;//負號標誌 temp=~temp; // 取反加1 temp +=1; } else str[0]=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小數近似處理 flag_get=0; } }}/*------------------------------------------------ 定時器初始化子程式------------------------------------------------*/void Init_Timer0(void){TMOD|=0x01;//定時器設定TH0=0xef;TL0=0xf0;//IE=0x82;EA=1; //總中斷開啟ET0=1; //定時器中斷開啟TR0=1; //定時器開關開啟}/*------------------------------------------------ 定時器中斷子程式------------------------------------------------*/void Timer0_isr(void) interrupt 1 using 1{TH0=0xef;//定時器重裝值TL0=0xf0;num++;if (num==50) {num=0; flag_get=1;//標誌位有效 }count++;if(count==1) {P2=0; dataled=str[0];}//數位管掃描if(count==2) {P2=1; dataled=str[1];}if(count==3) { P2=2; dataled=str[2]; }if(count==4) { P2=3; dataled=str[3]; }if(count==5) { P2=4; dataled=str[4]; }if(count==6) { P2=5; dataled=str[5]; count=0;}}
DS18B20-Onewire Bus-單匯流排 單片機讀取溫度