當前位置:編程學習大全網 - 源碼下載 - 有誰知道DS18B20 溫度采集程序,用C 語言編程, 用KeilC51 編譯。

有誰知道DS18B20 溫度采集程序,用C 語言編程, 用KeilC51 編譯。

#include <reg52.h>

#include <math.h> //Keil library

#include <stdio.h> //Keil library

#include <INTRINS.H>

#define uchar unsigned char

#define uint unsigned int

#define display1 0xfe //數碼管1從左至右

#define display2 0xfd //數碼管2從左至右

#define display3 0xfb //數碼管3從左至右

#define display4 0xf7 //數碼管4從左至右

#define display5 0xef //數碼管5從左至右

#define display6 0xdf //數碼管6從左至右

#define display7 0xbf //數碼管7從左至右

#define display8 0x7f //數碼管8從左至右

sbit led=P1^5;

sbit DQ=P3^6; //根據實實際情況設定

sbit setth=P1^0;//設定 th

sbit up=P1^1;//加

sbit down=P3^2;//減

sbit beep= P3^3;

uchar tempint,f,bb,tempth,temptl,th,tl,beepflag; //溫度整數部分和小數部分

int tempdf,c;

code unsigned char ledmap[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xbf};

code unsigned char ledmap1[]={0x40,0x79,0x24,0x30,

0x19,0x12,0x02,0x78,0x00,0x10};

//7段數碼管0~9數字的***陽顯示代碼和負號位代碼(最後壹位)

void set_ds18b20(); //初始化DS18B20子程序

void get_temperature(); //獲得溫度子程序

void read_ds18b20(); //讀DS18B20子程序

void write_ds18b20(uchar command); //向DS18B20寫1字節子程序

void delayms(uchar count); //延時count毫秒子程序

void disp_temp(tempint,tempdf); //顯示溫度子程序

//***********************初始化DS18B20子程序**********************************

//****************************************************************************

void set_ds18b20()

{

while(1)

{

uchar delay,flag;

flag=0;

DQ=1;

delay=1;

while(--delay);

DQ=0; //數據線置低電平

delay=250;

while(--delay); //低電平保持500us

DQ=1; //數據線置高電平

delay=30;

while(--delay); //高電平保持60us

while(DQ==0) //判斷DS18B20是否發出低電平信號

{

delay=210; //DS18B20響應,延時420us

while(--delay);

if(DQ) //DS18B20發出高電平初始化成功,返回

{

flag=1; //DS18B20初始化成功標誌

//初始化成功LED標誌

break;

}

}

if(flag) //初始化成功,再延時480us,時序要求

{

delay=240;

while(--delay);

break;

}

}

}

//***********************獲得溫度子程序***************************************

//****************************************************************************

void get_temperature() //溫度轉換、獲得溫度子程序

{

set_ds18b20(); //初始化DS18B20

write_ds18b20(0xcc); //發跳過ROM匹配命令

write_ds18b20(0x44); //發溫度轉換命令

// delayms(750);

disp_temp(tempint,tempdf); //顯示溫度,等待AD轉換

set_ds18b20();

write_ds18b20(0xcc); //發跳過ROM匹配命令

write_ds18b20(0xbe); //發出讀溫度命令

read_ds18b20(); //將讀出的溫度數據保存到tempint和tempdf處

}

//***********************讀DS18B20子程序***************************************

//****************************************************************************

void read_ds18b20()

{

uchar delay,i,j,k,temp,temph,templ;

j=4; //讀2位字節數據

do

{

for(i=8;i>0;i--) //壹個字節分8位讀取

{

temp>>=1; //讀取1位右移1位

DQ=0; //數據線置低電平

delay=1;

while(--delay);

DQ=1; //數據線置高電平

delay=4;

while(--delay); //延時8us

if(DQ) //讀取1位數據

temp|=0x80;

delay=25; //讀取1位數據後延時50us

while(--delay);

}

if(j==4)

templ=temp;//讀取的第壹字節存templ

if(j==3)

temph=temp; //讀取的第二字節存temph

if(j==2)

tempth=temp; //讀取的第3字節存tempth TH的值

if(j==1)

temptl=temp; //讀取的第4字節存tempth TL的值

}while(--j);

f=0;

if((temph & 0xf8)!=0x00) //若溫度為負的處理,對二進制補碼的處理

{

f=1; //為負溫度f置1

temph=~temph;

templ=~templ;

k=templ+1;

templ=k;

if(k>255)

{

temph++;

}

}

tempdf=templ & 0x0f; //將讀取的數據轉換成溫度值,整數部分存tempint,小數部分存tempdf

c=(tempdf*625);

tempdf=c;

templ>>=4; //

temph<<=4; //轉化成字節溫度

tempint=temph|templ;//兩字節合並為壹個字節

if (tempint>th|tempint==th|tempint<tl|tempint==tl)

beepflag=1;

else

beepflag=0;

}

//***********************寫DS18B20子程序***************************************

//****************************************************************************

void write_ds18b20(uchar command)

{

uchar delay,i;

for(i=8;i>0;i--) //將壹字節數據壹位壹位寫入

{

DQ=0; //數據線置低電平

delay=6; //延時12us

while(--delay);

DQ=command&0x01; //將數據放置在數據線上

delay=25; //延時50us

while(--delay);

command=command>>1; //準備發送下壹位數據

DQ=1; //發送完壹位數據,數據線置高電平

}

}

//***********************顯示子程序***************************************

//****************************************************************************

void disp_temp( tempint,tempdf)

{

uchar tempinth,tempintl,tempinbai,shifen,baifen,gefen,qianfen;

if (bb==1)

{

tempinbai=th/100;

tempinth=(th%100)/10;

tempintl=th%10; //整數取模

gefen=0/1000;

shifen=0%1000/100;

baifen =0%100/10;

qianfen=0%10; //小數取模

}

else if(bb==2)

{ tempinbai=tl/100;

tempinth=(tl%100)/10;

tempintl=tl%10; //整數取模

gefen=0/1000;

shifen=0%1000/100;

baifen =0%100/10;

qianfen=0%10; //小數取模

}

else

{

tempinbai=tempint/100;

tempinth=(tempint%100)/10;

tempintl=tempint%10; //整數取模

gefen=tempdf/1000;

shifen=tempdf%1000/100;

baifen =tempdf%100/10;

qianfen=tempdf%10; //小數取模

}

if (f==0)

{

P0=display1; //符號位

P2=ledmap[0];

}

else

{

P0=display1; //符號位

P2=ledmap[10];

}

delayms(2);

P0=display2;

P2=ledmap[tempinbai]; //開百位

delayms(2);

P0=display3;

P2=ledmap[tempinth];//開十位

delayms(2);

P0=display4;

P2=ledmap1[tempintl];//開個位

delayms(2);

P0=display5;

P2=ledmap[gefen];//開個分位

delayms(2);

P0=display6;

P2=ledmap[shifen]; //開十分位

delayms(2);

P0=display7;

P2=ledmap[baifen]; //開百分位

delayms(2);

P0=display8;

P2=ledmap[qianfen];//開千分位

}

//*******************************************************************/

//* 蜂鳴器響壹聲 */

//*******************************************************************/

void beep_st()

{

if (beepflag==1)

{ beep=0;

delayms(1000) ;

beep=1;

}

else

beep=1;

}

//***********************延時count ms子程序***************************************

//****************************************************************************

void delayms(uchar count) //延時count ms子程序

{

uchar i,j;

do

{

for(i=5;i>0;i--)

for(j=98;j>0;j--);

}while(--count);

}

//****************************************************************************

void keyscan() //鍵盤掃描

{

if(setth==0)

{

delayms(1);

}

if(setth==0)

{

bb++;

while(!setth); //循環在此 非0=1

}

if(bb==1)

{

if(up==0)

{

delayms(1);

}

if(up==0)

{

disp_temp(th,tempdf);

if(th<125)

{th++;}

while(!up)//非0=1

{

disp_temp(th,tempdf);

}

}

if(down==0)

{

delayms(1);

}

if(down==0)

{

disp_temp(th,tempdf);

if(th!=0) //不等於0為真執行

{

th--;

while(!down) // down為(非0=1)循環執行

{

disp_temp(th,tempdf);

}

}

}

}

if(bb==2)

{

if(up==0)

{

delayms(1);

}

if(up==0)

{

disp_temp(tl,tempdf);

if(tl<125)

{tl++;}

while(!up)//非0=1

{

disp_temp(th,tempdf);

}

}

if(down==0)

{

delayms(1);

}

if(down==0)

{

disp_temp(th,tempdf);

if(tl!=0) //不等於0為真執行

{

tl--;

while(!down) // down為(非0=1)循環執行

{

disp_temp(tl,tempdf);

}

}

}

}

if(bb==3)

{bb=0;

set_ds18b20(); //初始化DS18B20

write_ds18b20(0xcc); //發跳過ROM匹配命令

write_ds18b20(0x4e); //發溫度轉換命令

write_ds18b20(th); //寫TH 3

write_ds18b20(tl);

// write_ds18b20(0x7f);

set_ds18b20(); //初始化DS18B20

write_ds18b20(0xcc); //發跳過ROM匹配命令

write_ds18b20(0x48);

}

}

void main()

{ set_ds18b20();

write_ds18b20(0xcc); //發跳過ROM匹配命令

write_ds18b20(0xbe); //發出讀溫度命令

read_ds18b20(); //將讀出的數據

th=tempth; //將TH讀到單片機

tl=temptl;

SP=0x60; //設置堆棧指針

bb=0;

beepflag=0;

while(1)

{

keyscan();

get_temperature(); //獲得溫度

disp_temp(tempint,tempdf); //顯示溫度

beep_st();

}

}

  • 上一篇:2010給計算機老師的新年祝福短信!!!急求!!!
  • 下一篇:主力進出指標公式(最準確主力進出指標公式)
  • copyright 2024編程學習大全網