新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機中使用DS18B20溫度傳感器C語言程序(參考8)

        單片機中使用DS18B20溫度傳感器C語言程序(參考8)

        作者: 時間:2016-11-18 來源:網絡 收藏
        #include "reg51.h"

        #include "INTRINS.H"
        #include "LCD.h"
        #define CLR_RI (RI=0)
        #define CLR_TI (TI=0)

        unsigned char code ID[2][8]={ 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80,
        0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32};
        unsigned char currSensorNo=0;

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

        sbit TMDAT = P1^7;
        sbit RUN_LED = P1^6;

        /*------------------------------------------------
        *
        *------------------------------------------------*/
        void serial_initial()
        {
        TMOD=0X20;
        SCON=0X50;
        PCON=0X00;
        TL1=TH1=0XE8;
        TR1=1;
        }

        /*------------------------------------------------
        *
        *------------------------------------------------*/
        void send(unsigned char count,unsigned char SEND_Buf[])
        {
        unsigned char i;
        for(i=0;i{
        SBUF=SEND_Buf[i];
        while(!TI);
        CLR_TI;
        }
        }

        /*----------------------------------------------------
        * delay N ms
        *----------------------------------------------------*/
        void Delay_ms (unsigned int Nms )
        {
        unsigned char i;
        while(Nms--)
        for(i=0; i<125; i++) ;
        }

        /*----------------------------------------------------
        * delay N count
        *----------------------------------------------------*/
        void Delay_Count (unsigned char Count )
        {
        while(Count>0) Count--;
        }

        /*----------------------------------------------------
        * start Reset Pulse
        ----------------------------------------------------*/
        void tmreset(void)
        {
        TMDAT=0;
        Delay_Count(103);

        TMDAT=1;
        Delay_Count(4);
        }

        /*----------------------------------------------------
        * ACK
        *----------------------------------------------------*/
        void tmpre(void)
        {
        while(TMDAT);
        while(~TMDAT);
        Delay_Count(4);
        }

        /*----------------------------------------------------
        * Read a bit from 1820
        *----------------------------------------------------*/
        bit tmrbit(void)
        {
        int i=0;
        bit dat;
        TMDAT=0;i++;
        TMDAT=1;i++;i++;
        dat = TMDAT;
        Delay_Count(8);
        return dat;
        }

        /*----------------------------------------------------
        * Read a byte from 1820
        *----------------------------------------------------*/
        unsigned char tmrbyte(void)
        {
        unsigned char i,j,dat=0;

        for(i=1;i<=8;i++)
        {
        j=tmrbit();
        dat=(j<<7)|(dat>>1);
        }
        return dat;
        }

        /*----------------------------------------------------
        * Read a byte from 1820
        *----------------------------------------------------*/
        void tmwbyte(unsigned char dat)
        {
        signed char i=0;
        unsigned char j;
        bit testb;

        for(j=1;j<=8;j++)
        {
        testb=dat & 0x01;
        dat = dat>>1;
        if(testb)
        {
        TMDAT=0;
        i++;i++;
        TMDAT=1;
        Delay_Count(8);
        }
        else
        {
        TMDAT=0;
        Delay_Count(8);
        TMDAT=1;
        i++;i++;
        }
        }
        }

        /*----------------------------------------------------
        * send convert command to 1820
        *----------------------------------------------------*/
        void tmstart(void)
        {
        unsigned char i;
        tmreset();
        tmpre();
        Delay_ms(1);
        /* tmwbyte(0xcc);*/
        tmwbyte(0x55);
        for(i=0;i<8;i++)
        tmwbyte(ID[currSensorNo][i]);
        tmwbyte(0x44);
        }


        /*----------------------------------------------------
        * Read tempreature from 1820
        *----------------------------------------------------*/
        unsigned int tmrtemp_all(void)
        {
        unsigned char a,b;
        unsigned int y3;
        unsigned char i;

        tmreset();
        tmpre();
        Delay_ms(1);
        /*tmwbyte(0xcc);*/
        tmwbyte(0x55);
        for(i=0;i<8;i++)
        tmwbyte(ID[currSensorNo][i]);

        tmwbyte(0xbe);
        a = tmrbyte();
        b = tmrbyte();
        y3 = ((unsigned int)b) << 8;

        return ((y3+a) & 0x7ff) ;
        }

        /*----------------------------------------------------
        * Start Test tempreature, All
        *
        *----------------------------------------------------*/
        void Display_AllTemp(void )
        {
        unsigned int last;
        unsigned char i,Dot;

        RUN_LED=0;
        Part=0;
        LED_DISPLAY();
        Delay_ms(1);

        tmstart();

        Delay_ms(800);
        last=tmrtemp_all();
        RUN_LED=1;

        Dot= (last & 0x0f)*6.25 ;
        Digit[0]= Dot%10;
        Digit[1]=Dot/10;

        last=(last>>4) & 0x7f ;
        if( (last == 0x7f) ) // erro
        {
        for(i=0;i<5;i++) Digit[i]=16;
        }
        else
        {
        for(i=2;i<5;i++)
        {
        Digit[i] = last %10;
        last = last/10;
        }
        if(Digit[4]==0)Digit[4]=17;
        Part=1;
        }
        Digit[5]=currSensorNo;


        LED_DISPLAY();

        }

        /*----------------------------------------------------
        *
        *----------------------------------------------------*/
        /* void Read_Id()
        {
        unsigned char i,id[8];
        tmreset();
        tmpre();
        Delay_ms(1);
        tmwbyte(0x33);

        for(i=0;i<8;i++)
        id[i]=tmrbyte();
        send(8,id);
        }*/

        /*----------------------------------------------------
        *
        * Main
        *----------------------------------------------------*/
        void main(void)
        {
        unsigned char id[8]={1,2,3,4,5,6,7,8};

        serial_initial();
        send(8,id);
        for(;;)
        {
        RUN_LED=!RUN_LED;
        /* Read_Id();*/
        TX_C =!TX_C ;
        currSensorNo=(currSensorNo==1)?0:1;
        Display_AllTemp();
        /*Change();*/
        send(6,Digit);
        Delay_ms(1000);
        _nop_();
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 华亭县| 淮阳县| 天长市| 永善县| 荆门市| 清原| 马鞍山市| 兴文县| 乌恰县| 黔西| 西丰县| 十堰市| 英山县| 贵定县| 武鸣县| 深圳市| 茌平县| 呼伦贝尔市| 连城县| 青浦区| 栾城县| 阿合奇县| 孝义市| 错那县| 莱州市| 邳州市| 个旧市| 南康市| 水城县| 瓦房店市| 大悟县| 聂拉木县| 建瓯市| 博白县| 西畴县| 抚宁县| 视频| 淮安市| 上栗县| 平度市| 阜南县|