/*;//国内网站上读取DS1820的C51源程序不多,基本上都是那几篇,我试过都不行
;//后来我买了本书,按照上面照抄,连编译都通不过,后来经过多次测试,终于可以顺利读取了
;//若有问题可与我联系[email protected]
// 前面是单个DS1820温度读取程序,后面是四个DS1820温度读取程序。
//推荐用11.0592Mhz晶振,经试验用12M到24M都可以,6M就不行了。
*/
#include <reg51.h>
#define uchar unsigned char
sbit TMDAT = P1^0;/* //根据实实际情况设定*/
uchar TMP; /* //读取后温度值存于TMP中,将其除以2即可得出实际温度;*/
uchar f; /* //结果是否为负温,“0”为正温,“1”为负温。 */
/*////////////////////////////////////////延时部分/////////////////////////*/
void dmsec (unsigned int count)
{
unsigned int i;
while (count)
{
i = 115;
while (i>0) i--;
count--;
}
}
/*/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 发送复位/////////////////////////*/
void tmreset (void)
{
unsigned int i;
TMDAT = 0;
i = 103;
while (i>0) i--; /*/ 延时 900 uS(11.0592Mhz时) /*/
TMDAT = 1;
i = 4;
while (i>0) i--;
}
/*/判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环
////////////////////////////////////// 等待存在脉冲//////////////////////*/
void tmpre (void) /*/判断器件是否存在 /*/
{
unsigned int i;
while (TMDAT);
while (~TMDAT);
i = 4; while (i>0) i--;
}
/*////////////////////////////////////////////////////////////////////////*/
/*//////////////////////////////////// 读一位/////////////////////////////*/
bit tmrbit (void)
{
unsigned int i;
bit dat;
TMDAT = 0; i++;
TMDAT = 1; i++; i++; /*/微量延时 /*/
dat = TMDAT;
i = 8; while (i>0) i--; /*/ 延时 /*/
return (dat);
}
/*/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// 读一个字节//////////////////////*/
unsigned char tmrbyte (void)
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmrbit ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}
/*/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 写一个字节///////////////////////*/
void tmwbyte (unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
TMDAT = 0; /*/ 写0 /*/
i++; i++;
TMDAT = 1;
i = 8; while (i>0) i--;
}
else
{
TMDAT = 0; /*/ 写0 /*/
i = 8; while (i>0) i--;
TMDAT = 1;
i++; i++;
}
}
}
/*///////////////////////////////////////////////////////////////////////*/
/*///////////////////////////////发送ds1820 开始转换/////////////////////*/
void tmstart (void)
{
tmreset (); /*//复位 */
/*/tmpre (); //等待存在脉冲 */
dmsec (1); /* //延时 */
tmwbyte (0xcc); /*//跳过序列号命令*/
tmwbyte (0x44); /* //发转换命令 44H, */
}
/*////////////////////////////////////////////////////////////////////////*/
/*////////////////////////////////// 读取温度/////////////////////////////*/
void tmrtemp (void)
{
unsigned char a,b;
tmreset (); /*//复位*/
//tmpre (); /*//等待存在脉冲*/
dmsec (1); /*//延时*/
tmwbyte (0xcc); /*//跳过序列号命令 */
tmwbyte (0xbe); /*//发送读取命令 */
a = tmrbyte (); /* //读取低位温度 */
b = tmrbyte (); /*//读取高位温度 */
f=b; /*//若b为1则为负温*/
if(f)
{
TMP=~a+1; /*//如果为负温则去除其补码*/
}
else
{
TMP=a;
}
}
/*////////////////////////////////////////////////////////////////////////*/
/*////////////////////////////////////////////////////////////////////////*/
main()
{
do{
tmstart();
dmsec(100); /*/如果是不断地读取的话可以不延时 /*/
tmrtemp(); /*/读取温度,执行完毕温度将存于TMP中 /*/
}while(1);
}
/*////////////////////////////////////////////////////////////////////////*/
/*
//以下是四个DS1820温度读取程序
//使用时先调用"rom()"子程序读出每个器件的序列号
//再将各个序列号填入SN数组中才能读出各个温度
#include <reg51.h>
#define uchar unsigned char
sbit TMDAT = P3^4; //根据实实际情况设定
uchar TMP[4]; //读取后的4个温度值,将其除以2即可得出实际温度;
uchar SN[4][8]; //4个器件的序列号,先读出单个序列号后填上才可以读取温度
uchar f[4]; //结果是否为负温,“0”为正温,“1”为负温。
////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count) //
{ //
unsigned int i; //
while (count) //
{ //
i = 115; //
while (i>0) i--; //
count--; //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void) //
{ //
unsigned int i; //
TMDAT = 0; //
i = 103; //
while (i>0) i--; // 延时 900 uS(11.0592Mhz时) //
TMDAT = 1; //
i = 4; //
while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环
////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void) //判断器件是否存在 //
{ //
unsigned int i; //
while (TMDAT); //
while (~TMDAT); //
i = 4; while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void) //
{ //
unsigned int i; //
bit dat; //
TMDAT = 0; i++; //
TMDAT = 1; i++; i++; //微量延时 //
dat = TMDAT; //
i = 8; while (i>0) i--; // 延时 //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void) //
{ //
unsigned char i,j,dat; //
dat = 0; //
for (i=1;i<=8;i++) //
{ //
j = tmrbit (); //
dat = (j << 7) | (dat >> 1); //
} //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat) //
{ //
unsigned int i; //
unsigned char j; //
bit testb; //
for (j=1;j<=8;j++) //
{ //
testb = dat & 0x01; //
dat = dat >> 1; //
if (testb) //
{ //
TMDAT = 0; // 写0 //
i++; i++; //
TMDAT = 1; //
i = 8; while (i>0) i--; //
} //
else //
{ //
TMDAT = 0; // �