新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 溫度傳感器18B20的驅(qū)動(dòng)程序

        溫度傳感器18B20的驅(qū)動(dòng)程序

        作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        以下綠色文字都是18B20驅(qū)動(dòng)程序的驅(qū)動(dòng)程序,學(xué)習(xí)時(shí)不必每句都看懂,只需要知道每個(gè)函數(shù)的作用已利于以后調(diào)用!調(diào)用的方法在最后黑體字那里加以體會(huì)即可!

        學(xué)習(xí)方法:

        本文引用地址:http://www.104case.com/article/201611/321641.htm

        越是看似高級、復(fù)雜的器件,都會(huì)有自己的驅(qū)動(dòng)程序往往由生產(chǎn)廠家提供!所以在后期提高階段要聯(lián)系如何使用這些驅(qū)動(dòng)函數(shù)!就像是以后學(xué)習(xí)高一級的ARM系統(tǒng)時(shí),那都是有自己的庫函數(shù)的,使用時(shí)改變參數(shù)而已(當(dāng)然從表面來講)!后期價(jià)已熟練即可

        bitflag;
        unsigned intidata Temperature;
        unsigned char idata temp_buff[9]; //存儲(chǔ)讀取的字節(jié),read scratchpad為9字節(jié),read rom ID為8字節(jié)
        unsigned char idata id_buff[8];
        unsigned char idata *p,TIM;
        unsigned char idata crc_data;


        unsigned char code CrcTable [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
        };
        //

        void TempDelay (unsigned char idata us)
        {
        while(us--);
        }


        void Init18b20 (void)
        {
        D18B20=1;
        _nop_();
        D18B20=0;
        TempDelay(80);//delay 530 uS//80
        _nop_();
        D18B20=1;
        TempDelay(14);//delay 100 uS//14
        _nop_();
        _nop_();
        _nop_();

        if(D18B20==0)
        flag = 1;//detect 1820 success!
        else
        flag = 0;//detect 1820 fail!
        TempDelay(20);//20
        _nop_();
        _nop_();
        D18B20 = 1;
        }


        void WriteByte (unsigned char idata wr)//單字節(jié)寫入
        {
        unsigned char idata i;
        for (i=0;i<8;i++)
        {
        D18B20 = 0;
        _nop_();
        D18B20=wr&0x01;
        TempDelay(3);//delay 45 uS //5
        _nop_();
        _nop_();
        D18B20=1;
        wr >>= 1;
        }
        }


        unsigned char ReadByte (void)//讀取單字節(jié)
        {
        unsigned char idata i,u=0;
        for(i=0;i<8;i++)
        {
        D18B20 = 0;
        u >>= 1;
        D18B20 = 1;
        if(D18B20==1)
        u |= 0x80;
        TempDelay (2);
        _nop_();
        }
        return(u);
        }


        void read_bytes (unsigned char idata j)
        {
        unsigned char idata i;
        for(i=0;i{
        *p = ReadByte();
        p++;
        }
        }


        unsigned char CRC (unsigned char j)
        {
        unsigned char idata i,crc_data=0;
        for(i=0;i//查表校驗(yàn)
        crc_data = CrcTable[crc_data^temp_buff[i]];
        return (crc_data);
        }


        void GemTemp (void)
        {
        read_bytes (9);
        if (CRC(9)==0) //校驗(yàn)正確
        {
        Temperature = temp_buff[1]*0x100 + temp_buff[0];
        //Temperature *= 0.625;
        Temperature /= 16;
        TempDelay(1);
        }
        }


        void Config18b20 (void)//重新配置報(bào)警限定值和分辨率
        {
        Init18b20();
        WriteByte(0xcc);//skip rom
        WriteByte(0x4e);//write scratchpad
        WriteByte(0x19);//上限
        WriteByte(0x1a);//下限
        WriteByte(0x7f);//set 11 bit (0.125)
        Init18b20();
        WriteByte(0xcc);//skip rom
        WriteByte(0x48);//保存設(shè)定值
        Init18b20();
        WriteByte(0xcc);//skip rom
        WriteByte(0xb8);//回調(diào)設(shè)定值
        }


        void ReadID (void)//讀取器件 id
        {
        Init18b20();
        WriteByte(0x33);//read rom
        read_bytes(8);
        }


        void TemperatuerResult(void)
        {
        p = id_buff;
        ReadID();
        Config18b20();
        Init18b20 ();
        WriteByte(0xcc);//skip rom
        WriteByte(0x44);//Temperature convert

        Init18b20 ();
        WriteByte(0xcc);//skip rom
        WriteByte(0xbe);//read Temperature
        p = temp_buff;
        GemTemp();
        }

        void GetTemp()
        {
        if(TIM==100) //每隔 1000ms 讀取溫度
        {TIM=0;
        TemperatuerResult();
        }

        }


        void T1zd(void) interrupt 3
        {
        TH1 = 0xD8;//10
        TL1 = 0xF0;
        TIM++;

        }
        #include
        #include "tem.H"
        extern GetTemp();//聲明引用外部函數(shù)
        extern unsigned intidata Temperature;// 聲明引用外部變量
        void delay(unsigned int i);

        //else IO
        sbitLS138A=P2^2;//管腳定義
        sbitLS138B=P2^3;
        sbitLS138C=P2^4;


        //此表為 LED 的字模, 共陰數(shù)碼管 0-9-
        unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
        unsigned longLedOut[5],LedNumVal;


        void system_Ini()
        {
        TMOD|= 0x11;
        TH1 = 0xD8;//10
        TL1 = 0xF0;
        IE = 0x8A;
        TR1= 1;

        }

        main()
        { unsigned char i;
        system_Ini();
        while(1)
        {
        GetTemp();


        LedNumVal=Temperature;//把實(shí)際溫度送到LedNumVal變量中
        LedOut[0]=Disp_Tab[LedNumVal000/1000];
        LedOut[1]=Disp_Tab[LedNumVal00/100];
        LedOut[2]=Disp_Tab[LedNumVal0/10];//十位
        LedOut[3]=Disp_Tab[LedNumVal];//個(gè)位

        for(i=0; i<4; i++)
        {
        P0 = LedOut[i] ;

        switch(i)
        {//138譯碼
        case 0:LS138A=0; LS138B=0; LS138C=0; break;
        case 1:LS138A=1; LS138B=0; LS138C=0; break;
        case 2:LS138A=0; LS138B=1; LS138C=0; break;
        case 3:LS138A=1; LS138B=1; LS138C=0; break;
        }

        delay(100);
        }

        P0 = 0;

        }
        }

        //延時(shí)程序
        void delay(unsigned int i)
        {
        char j;
        for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
        }



        評論


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

        關(guān)閉
        主站蜘蛛池模板: 景谷| 彭泽县| 阳谷县| 务川| 保山市| 集贤县| 盐亭县| 西青区| 青铜峡市| 平安县| 山东省| 宜兰市| 中阳县| 峨眉山市| 阳曲县| 海城市| 曲松县| 葵青区| 江孜县| 布尔津县| 正蓝旗| 图木舒克市| 阳信县| 枞阳县| 托克托县| 灵石县| 潞西市| 仙游县| 怀安县| 中方县| 稷山县| 桂阳县| 都兰县| 伊川县| 谢通门县| 平遥县| 丹阳市| 来宾市| 黄龙县| 卢龙县| 江城|