久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1708|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

DS18B20 CRC 校驗(yàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
幫我看看這個(gè)CRC校驗(yàn) 寫(xiě)對(duì)沒(méi)有  為什么會(huì)有 150度  感謝大家了
#include"temp.h"
uchar scratbuf[9]; //存從18B20高速緩存中讀取的9B數(shù)據(jù)
uchar code crc_tab[256]={
0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};
/*******************************************************************************
* 函 數(shù) 名         : Delay1ms
* 函數(shù)功能                   : 延時(shí)函數(shù)
* 輸    入         : 無(wú)
* 輸    出         : 無(wú)
*******************************************************************************/

void Delay1ms(uint y)
{
        uint x;
        for( ; y>0; y--)
        {
                for(x=110; x>0; x--);
        }
}
/*******************************************************************************
* 函 數(shù) 名         : Ds18b20Init
* 函數(shù)功能                   : 初始化
* 輸    入         : 無(wú)
* 輸    出         : 初始化成功返回1,失敗返回0
*******************************************************************************/

uchar Ds18b20Init()
{
        uchar i;
        DSPORT = 0;                         //將總線拉低480us~960us
        i = 70;       
        while(i--);         //延時(shí)642us
        DSPORT = 1;                        //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
        i = 0;
        while(DSPORT)        //等待DS18B20拉低總線
        {
                i++;
                if(i>5)//等待>5MS
                {
                        return 0;//初始化失敗
                }
                Delay1ms(1);       
        }
        return 1;//初始化成功
}

/*******************************************************************************
* 函 數(shù) 名         : Ds18b20WriteByte
* 函數(shù)功能                   : 向18B20寫(xiě)入一個(gè)字節(jié)
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/

void Ds18b20WriteByte(uchar dat)
{
        uint i, j;

        for(j=0; j<8; j++)
        {
                DSPORT = 0;                       //每寫(xiě)入一位數(shù)據(jù)之前先把總線拉低1us
                i++;
                DSPORT = dat & 0x01;  //然后寫(xiě)入一個(gè)數(shù)據(jù),從最低位開(kāi)始
                i=6;
                while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
                DSPORT = 1;        //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫(xiě)入第二個(gè)數(shù)值
                dat >>= 1;
        }
}
/*******************************************************************************
* 函 數(shù) 名         : Ds18b20ReadByte
* 函數(shù)功能                   : 讀取一個(gè)字節(jié)
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/


uchar Ds18b20ReadByte()
{
        uchar byte, bi;
        uint i, j;       
        for(j=8; j>0; j--)
        {
                DSPORT = 0;//先將總線拉低1us
                i++;
                DSPORT = 1;//然后釋放總線
                i++;
                i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
                bi = DSPORT;         //讀取數(shù)據(jù),從最低位開(kāi)始讀取
                /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
                byte = (byte >> 1) | (bi << 7);                                                  
                i = 4;                //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
                while(i--);
        }                               
        return byte;
}
/*******************************************************************************
* 函 數(shù) 名         : Ds18b20ChangTemp
* 函數(shù)功能                   : 讓18b20開(kāi)始轉(zhuǎn)換溫度
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/

void  Ds18b20ChangTemp()
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);                //跳過(guò)ROM操作命令                 
        Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令
        Delay1ms(100);        //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了

}
/*******************************************************************************
* 函 數(shù) 名         : Ds18b20ReadTempCom
* 函數(shù)功能                   : 發(fā)送讀取溫度命令
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/

void  Ds18b20ReadTempCom()
{       

        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);         //跳過(guò)ROM操作命令
        Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
}
/*******************************************************************************
* 函 數(shù) 名         : Ds18b20ReadTemp
* 函數(shù)功能                   : 讀取溫度
* 輸    入         : com
* 輸    出         : 無(wú)
*******************************************************************************/
uchar do_crc8(uchar *p,uchar n) //8位CRC校驗(yàn),p指向校驗(yàn)數(shù)據(jù),n為字節(jié)數(shù)
{
        uchar i,crc8=0;
        for(i=0;i<n;i++)
        crc8=crc_tab[crc8^p[i]]; //連續(xù)查表計(jì)算CRC
        return crc8;
}
int Ds18b20ReadTemp()
{
        int temp = 0;
        char i;
        Ds18b20ChangTemp();                                 //先寫(xiě)入轉(zhuǎn)換命令
        Ds18b20ReadTempCom();                        //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
        for(i=0;i<9;i++)
        scratbuf[i]=Ds18b20ReadByte();
        if(!do_crc8(scratbuf,9))
         {
                  temp = scratbuf[1];
                temp <<= 8;
                temp |= scratbuf[0];
                return temp;
         }
}



捕獲.JPG (38.88 KB, 下載次數(shù): 84)

捕獲.JPG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2021-2-15 14:18 | 只看該作者
這個(gè)程序從表面看沒(méi)有什么問(wèn)題,仔細(xì)推敲問(wèn)題出在Ds18b20Init函數(shù)。
由于18b20對(duì)時(shí)序非常敏感。主機(jī)首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖剑⒃陔S后的480微秒時(shí)間內(nèi)對(duì)總線進(jìn)行檢測(cè),如果有低電平出現(xiàn)說(shuō)明總線上有器件已做出應(yīng)答。若無(wú)低電平出現(xiàn)一直都是高電平說(shuō)明總線上無(wú)器件應(yīng)答。
修改如下:
  1. uchar Ds18b20Init()
  2. {
  3.         uchar i;
  4.         DSPORT = 0;        //將總線拉低480us~960us
  5. //        i = 70;
  6.         i = 80;                 //i值極限范圍在79~159之間
  7.         while(i--);        //此延時(shí)時(shí)間=i*6+6us
  8.         DSPORT = 1;        //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
  9.         i = 9;
  10.         while(i--);        //延時(shí)60us,不得超過(guò)480us
  11.         if(!DSPORT)return 1; //初始化成功
  12.         else return 0;         //初始化失敗
  13. //以下等待5ms部分沒(méi)有實(shí)際意義
  14. /*        while(DSPORT)       //等待DS18B20拉低總線
  15.         {
  16.                 i++;
  17.                 if(i>5)//等待>5MS
  18.                 {
  19.                         return 0;//初始化失敗
  20.                 }
  21.                 Delay1ms(1);        
  22.         }
  23.         return 1;//初始化成功
  24.         */
  25. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2021-2-15 14:27 | 只看該作者
以上解釋基于51單片機(jī)12MHz晶振環(huán)境
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一二视频 | 日本高清aⅴ毛片免费 | 欧美日韩在线视频一区 | 中文av字幕 | 国产精品区二区三区日本 | 免费观看av网站 | 中文字幕高清 | 天天草天天干 | 久久久久精 | 欧美精品一区二区在线观看 | 久久国产精品视频 | 国产ts人妖一区二区三区 | 久久精品99久久 | 97天天干 | 久草在线 | 夜夜草| 国产一区视频在线 | 国产成人一区二区 | 日本一区二区在线视频 | 中文字幕亚洲视频 | 91视频在线 | 久久成人免费视频 | 99tv| 国产成视频在线观看 | 99re6在线视频精品免费 | 欧美在线视频一区二区 | 日韩久久精品 | 成人3d动漫一区二区三区91 | 国产精品一区三区 | 久久久久久久国产精品影院 | 亚洲看片网站 | 黑人一级黄色大片 | 午夜免费视频观看 | 国产精品久久久久久吹潮日韩动画 | 狠狠亚洲 | 日韩国产在线观看 | 国产成人99久久亚洲综合精品 | www.日本在线 | 久久av一区二区 | 精品亚洲一区二区三区 | 日韩国产一区二区 |