|
剛寫了一個串口讀取DS18B20序列號的程序,顯示出來的只有******,求指導!謝謝了#include<reg52.h>
#include<intrins.h> //nop函數
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7;
uchar Rom_18B20[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delay(uint z); //延時函數
bit DS18B20_Readbit(void); //讀1位數據函數
uchar DS18B20_ReadByte(void); //讀1個字節數據函數
void DS18B20_WriteByte(uchar dat); //向DS18B20寫一個字節數據函數
void get_ser(void);//讀取序列號
/***************************************************/
/* 延時函數:void delay() */
/* 功能:延時函數 */
/***************************************************/
void delay(uint z)//延時函數
{
uint x,y;
for( x = z; x > 0; x-- )
for(y = 110;y>0;y--);
}
uchar DS18B20_Reset()
{
uchar i;
DQ = 0; //將總線拉低480us~960us
i = 70;
while(i--); //延時642us
DQ= 1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
i = 0;
while(DQ) //等待DS18B20拉低總線
{
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失敗
}
delay(1);
}
return 1;//初始化成功
}
/***************************************************/
/* DS18B20函數:void DS18B20_Readbit() */
/* 功能:讀1個字節數據函數 */
/***************************************************/
bit DS18B20_Readbit(void) //讀1位數據函數
{
uint i;
bit dat;
DQ = 0;
i++; //i++起延時作用
DQ = 1;
i++;
i++;
dat = DQ;
i = 8;
while( i > 0 )i--;
return(dat);
}
/***************************************************/
/* DS18B20函數:void DS18B20_ReadByte() */
/* 功能:讀1個字節數據函數 */
/***************************************************/
uchar DS18B20_ReadByte(void) //讀1個字節數據函數
{
uchar i,j,dat;
dat = 0;
for( i = 1; i <= 8; i++ )
{
j = DS18B20_Readbit();
dat = ( j << 7 ) | ( dat >> 1 );
}
return(dat);
}
/***************************************************/
/* DS18B20函數:void DS18B20_WriteByte() */
/* 功能:向DQ18B20寫一個字節數據函數 */
/***************************************************/
void DS18B20_WriteByte(uchar dat) //向DQ18B20寫一個字節數據函數
{
uint i;
uchar j;
bit testb;
for( j=1; j<=8; j++)
{
testb = dat&0x01;
dat= dat>>1;
if(testb) //寫1
{
DQ = 0;
i++;i++;
DQ = 1;
i = 8;while(i>0)i--;
}
else
{
DQ = 0; //寫0
i = 8;while(i>0)i--;
DQ = 1;
i++;i++;
}
}
}
/*****************************************************
函數:void get_ser(void)
功能:顯示DS18B20的序列號
*******************************************************/
/*void get_ser(void)//讀取溫度
{
uchar i,temp;
while(DS18B20_Reset());
DS18B20_WriteByte(0x33);//讀取光刻ROM中編碼命令
delay(1);
for(i=0;i<8;i++)
{
Rom_18B20=DS18B20_ReadByte();
}
} */
//串口初始化函數 //
//9600,N,8,1 //
//T1做波特率發生器//
void InitUart(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0;
EA=1;
ES=1;
TR1 = 1;
}
void main()
{
uchar i;
InitUart();
while(1)
{
ES=0;
for(i=0;i<8;i++)
{
SBUF=Rom_18B20;
while(!TI);
TI=0;
}
}
}
|
|