/*****ζȴ«¸ÐÆ÷³ÌÐò******/
void delay(uint i) //delay
{
while(i--);
}
/************************************************/
/* ³õʼ»¯ds18b2×Óº¯Êý* */
/************************************************/
Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ¸´Î»
delay(8); //ÉÔ×öÑÓʱ
DQ = 0; //µ¥Æ¬»ú½«DQÀµÍ
delay(80); //¾«È·ÑÓʱ ´óÓÚ 480us
DQ = 1; //À¸ß×ÜÏß
delay(14);
x=DQ; //ÉÔ×öÑÓʱºó Èç¹ûx=0Ôò³õʼ»¯³É¹¦ x=1Ôò³õʼ»¯Ê§°Ü
delay(20);
}
/*************************************************/
/* ¶Á×Ö½Ú×Óº¯Êý */
/*************************************************/
ReadOneChar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // ¸øÂö³åÐźÅ
dat>>=1; // Êý¾ÝÓÒÒÆһλ
DQ = 1; // ¸øÂö³åÐźÅ
if(DQ) // DQΪ1
dat|=0x80; // ¶Á³öÊý¾Ý
delay(4); // ÑÓʱ
}
return(dat);
}
/*************************************************/
/* д×Ö½Ú×Óº¯Êý */
/*************************************************/
WriteOneChar(unsigned char dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01; //дÈëһλÊý¾Ý
delay(5);
DQ = 1;
dat>>=1; //ÓÒÒÆһλÊý¾Ý
}
}
/*************************************************/
/* DS18B20дÃüÁÊý */
/*************************************************/
void tmpwritebyte(uchar dat) // write a byte to ds18b20
{ // ¸øζȴ«¸ÐÆ÷дһ¸ö×Ö½Ú
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 //дÈë 0
{
DQ=0;
i=8;while(i>0)i--; // Êʵ±ÑÓʱ
DQ=1;
i++;i++;
}
}
}
/******************************************/
/* ·¢ËÍζÈת»»ÃüÁî */
/******************************************/
void tmpchange(void) // DS18B20 begin change
{
Init_DS18B20(); // ³õʼ»¯DS18B20
delay(200); // ÑÓʱ
WriteOneChar(0xcc); // Ìø¹ýÐòÁкÅÃüÁî
WriteOneChar(0x44); // ·¢ËÍζÈת»»ÃüÁî
}
/******************************************/
/* ¶Á³öζȺ¯Êý */
/******************************************/
void tmp() //get the temperature
{
float tt;
Init_DS18B20(); // ³õʼ»¯ds18b2×Óº¯Êý
delay(1);
WriteOneChar(0xcc); // Ìø¹ýROMÃüÁî
_nop_();
_nop_();
WriteOneChar(0xbe); // ·¢ËͶÁÈ¡Êý¾ÝÃüÁî
temp_data[0]=ReadOneChar(); // Á¬Ðø¶ÁÁ½¸ö×Ö½ÚÊý¾Ý
_nop_();
_nop_();
temp_data[1]=ReadOneChar();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // Á½×ֽںϳÉÒ»¸öÕûÐͱäÁ¿¡£
tt=temp*0.0625; // µÃµ½Õæʵʮ½øÖÆζÈÖµ£¬ÒòΪDS18B20
// ¿ÉÒÔ¾«È·µ½0.0625¶È£¬ËùÒÔ¶Á»ØÊý¾ÝµÄ×îµÍλ´ú±íµÄÊÇ
// 0.0625¶È¡£
temp=tt*10+0.5; // ·Å´óÊ®±¶£¬ÕâÑù×öµÄÄ¿µÄ½«Ð¡ÊýµãºóµÚһλ
// Ҳת»»Îª¿ÉÏÔʾÊý×Ö£¬Í¬Ê±½øÐÐÒ»¸öËÄÉáÎåÈë²Ù×÷¡£
temp_buffer[0]=temp/1000+48;
temp_buffer[1]=temp%1000/100+48;
temp_buffer[2]=temp%100/10+48;
temp_buffer[3]=temp%10+48;
// ·µ»ØζÈÖµ
}
/*Ö÷¿ØÖƳÌÐò*/
void main()
{
init();//³õʼ»¯´®¿ÚºÍ¶¨Ê±Æ÷
while(1)//ËÀÑ»·
{
if(rec_flag==1)//½ÓÊÕ±ê¼ÇΪ1,ÔòÖ´ÐÐÏÂÃæµÄµÄ³ÌÐò,Ö÷Ìâ˼Ïë¾ÍÊÇ Èç¹û½ÓÊÕµ½×Ö·û,¾Í»á·¢ËÍÒ»´®×Ö·û¸øµçÄÔ,ÀàËÆÓÚÎÊѯ·½Ê½(ÄãÎÊÒ»¾ä,ÎÒ´ðÒ»¾ä)
{
delay(10);
tmpchange();
_nop_();
_nop_();
tmp();
_nop_();
_nop_();
send_all(temp_buffer);
}
}
}
我贴出了一部分代码,我用的是18B20采集温度然后通过串口上传到电脑,但是串口调试工具显示的温度一直不变.用手摸也不变
|