新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機中使用DS18B20溫度傳感器C語言程序(參考8)

單片機中使用DS18B20溫度傳感器C語言程序(參考8)

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
#include "reg51.h"

#include "INTRINS.H"
#include "LCD.h"
#define CLR_RI (RI=0)
#define CLR_TI (TI=0)

unsigned char code ID[2][8]={ 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80,
0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32};
unsigned char currSensorNo=0;

本文引用地址:http://butianyuan.cn/article/201611/315674.htm

sbit TMDAT = P1^7;
sbit RUN_LED = P1^6;

/*------------------------------------------------
*
*------------------------------------------------*/
void serial_initial()
{
TMOD=0X20;
SCON=0X50;
PCON=0X00;
TL1=TH1=0XE8;
TR1=1;
}

/*------------------------------------------------
*
*------------------------------------------------*/
void send(unsigned char count,unsigned char SEND_Buf[])
{
unsigned char i;
for(i=0;i{
SBUF=SEND_Buf[i];
while(!TI);
CLR_TI;
}
}

/*----------------------------------------------------
* delay N ms
*----------------------------------------------------*/
void Delay_ms (unsigned int Nms )
{
unsigned char i;
while(Nms--)
for(i=0; i<125; i++) ;
}

/*----------------------------------------------------
* delay N count
*----------------------------------------------------*/
void Delay_Count (unsigned char Count )
{
while(Count>0) Count--;
}

/*----------------------------------------------------
* start Reset Pulse
----------------------------------------------------*/
void tmreset(void)
{
TMDAT=0;
Delay_Count(103);

TMDAT=1;
Delay_Count(4);
}

/*----------------------------------------------------
* ACK
*----------------------------------------------------*/
void tmpre(void)
{
while(TMDAT);
while(~TMDAT);
Delay_Count(4);
}

/*----------------------------------------------------
* Read a bit from 1820
*----------------------------------------------------*/
bit tmrbit(void)
{
int i=0;
bit dat;
TMDAT=0;i++;
TMDAT=1;i++;i++;
dat = TMDAT;
Delay_Count(8);
return dat;
}

/*----------------------------------------------------
* Read a byte from 1820
*----------------------------------------------------*/
unsigned char tmrbyte(void)
{
unsigned char i,j,dat=0;

for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}

/*----------------------------------------------------
* Read a byte from 1820
*----------------------------------------------------*/
void tmwbyte(unsigned char dat)
{
signed char i=0;
unsigned char j;
bit testb;

for(j=1;j<=8;j++)
{
testb=dat & 0x01;
dat = dat>>1;
if(testb)
{
TMDAT=0;
i++;i++;
TMDAT=1;
Delay_Count(8);
}
else
{
TMDAT=0;
Delay_Count(8);
TMDAT=1;
i++;i++;
}
}
}

/*----------------------------------------------------
* send convert command to 1820
*----------------------------------------------------*/
void tmstart(void)
{
unsigned char i;
tmreset();
tmpre();
Delay_ms(1);
/* tmwbyte(0xcc);*/
tmwbyte(0x55);
for(i=0;i<8;i++)
tmwbyte(ID[currSensorNo][i]);
tmwbyte(0x44);
}


/*----------------------------------------------------
* Read tempreature from 1820
*----------------------------------------------------*/
unsigned int tmrtemp_all(void)
{
unsigned char a,b;
unsigned int y3;
unsigned char i;

tmreset();
tmpre();
Delay_ms(1);
/*tmwbyte(0xcc);*/
tmwbyte(0x55);
for(i=0;i<8;i++)
tmwbyte(ID[currSensorNo][i]);

tmwbyte(0xbe);
a = tmrbyte();
b = tmrbyte();
y3 = ((unsigned int)b) << 8;

return ((y3+a) & 0x7ff) ;
}

/*----------------------------------------------------
* Start Test tempreature, All
*
*----------------------------------------------------*/
void Display_AllTemp(void )
{
unsigned int last;
unsigned char i,Dot;

RUN_LED=0;
Part=0;
LED_DISPLAY();
Delay_ms(1);

tmstart();

Delay_ms(800);
last=tmrtemp_all();
RUN_LED=1;

Dot= (last & 0x0f)*6.25 ;
Digit[0]= Dot%10;
Digit[1]=Dot/10;

last=(last>>4) & 0x7f ;
if( (last == 0x7f) ) // erro
{
for(i=0;i<5;i++) Digit[i]=16;
}
else
{
for(i=2;i<5;i++)
{
Digit[i] = last %10;
last = last/10;
}
if(Digit[4]==0)Digit[4]=17;
Part=1;
}
Digit[5]=currSensorNo;


LED_DISPLAY();

}

/*----------------------------------------------------
*
*----------------------------------------------------*/
/* void Read_Id()
{
unsigned char i,id[8];
tmreset();
tmpre();
Delay_ms(1);
tmwbyte(0x33);

for(i=0;i<8;i++)
id[i]=tmrbyte();
send(8,id);
}*/

/*----------------------------------------------------
*
* Main
*----------------------------------------------------*/
void main(void)
{
unsigned char id[8]={1,2,3,4,5,6,7,8};

serial_initial();
send(8,id);
for(;;)
{
RUN_LED=!RUN_LED;
/* Read_Id();*/
TX_C =!TX_C ;
currSensorNo=(currSensorNo==1)?0:1;
Display_AllTemp();
/*Change();*/
send(6,Digit);
Delay_ms(1000);
_nop_();
}
}



關(guān)鍵詞: 單片機DS18B20溫度傳感

評論


技術(shù)專區(qū)

關(guān)閉