在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > CEPARK 51單片機(jī)DS18B20測試程序

            CEPARK 51單片機(jī)DS18B20測試程序

            作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
            /**********************************************************************
            *文件名稱:CEPARK 51 V2.0開發(fā)板
            *程序版本:V1.0
            *技術(shù)支持:http://bbs.cepark.com

            *CEPARK
            http://bbs.cepark.com/viewthread.php?tid=34&fromuid=6136

            *Cepark暑期51在線免費培訓(xùn)用程序---活動報名地址:
            http://bbs.cepark.com/viewthread.php?tid=14228&fromuid=6136
            **********************************************************************/
            #include"STC89C51RC_RD_PLUS.H"

            #define uchar unsigned char
            #define uint unsignedint

            uchar code C51BOX2[3]_at_ 0x43;//仿真器用三字節(jié)空間

            uchar code DispTab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
            0x88,0x83,0xc6,0xa1,0x86,0x8e};//段碼0-9,a-f
            uchar DispBuf[4];

            uchar TempH,TempL;
            uint Temp;
            bit Presence;

            sfr LedPort=0x80;//P0口接段碼
            sbit Led0=P1^0;//LED控制腳
            sbit Led1=P1^1;
            sbit Led2=P1^2;
            sbit Led3=P1^3;
            sbit DataPort=P1^6;//18B20的數(shù)據(jù)口

            void uDelay(uchar DelayTime)//延時子程序,入口參數(shù)每加1約加2us
            {while(--DelayTime);

            }

            void Hex2Bcd()//HEX轉(zhuǎn)BCD程序
            {
            if(Presence==1)
            { //如果沒有檢測到存在則顯示“no”
            DispBuf[0]=0xab;
            DispBuf[1]=0xa3;
            DispBuf[2]=0xff;
            DispBuf[3]=0xff;
            }
            else
            { //分解后查表得到段碼放入顯示緩存
            Temp=TempH*256+TempL;//數(shù)據(jù)合并成一個雙字節(jié)數(shù)

            if((Temp>>12)==0xf)//右移12位判斷是否為負(fù)溫度
            {Temp=0x10000-Temp;//計算出負(fù)溫度值
            DispBuf[0]=0xbf;}//并將最左邊數(shù)碼管顯示“-”號
            elseDispBuf[0]=0xff;//否則不顯示

            TempH=Temp>>4;//將小數(shù)點4位值移出后,得到整數(shù)部分放在TempH中
            Temp=(Temp&0x0f)*625;//相與取出小數(shù)點四位,乘法得到小數(shù)點值
            DispBuf[3]=DispTab[Temp/1000];//小數(shù)點位只取最高一位,后三位不顯示

            DispBuf[2]=DispTab[TempH%10]&0x7f;//個位處理并點亮小數(shù)點
            TempH=TempH/10;//取出百位、十位

            if(!TempH)DispBuf[1]=0xff;//百位和十位均為0則十位不顯示。
            elseDispBuf[1]=DispTab[TempH%10];

            if(DispBuf[0]==0xff)//正溫度情況下
            {
            if(TempH/10)DispBuf[0]=DispTab[TempH/10];//百位有數(shù)值顯示
            elseDispBuf[0]=0xff;//為0不顯示
            }
            }
            }

            void Display(uchar j)//顯示子程序
            {
            for(;j>0;j--)
            {
            LedPort=DispBuf[0];
            Led0=0;
            uDelay(20);
            Led0=1;
            LedPort=DispBuf[1];
            Led1=0;
            uDelay(20);
            Led1=1;
            LedPort=DispBuf[2];
            Led2=0;
            uDelay(20);
            Led2=1;
            LedPort=DispBuf[3];
            Led3=0;
            uDelay(20);
            Led3=1;
            }
            }

            void Inti()
            {
            DataPort=0;//拉低
            uDelay(180);//延時后拉高
            DataPort=1;
            uDelay(24);//延時后讀狀態(tài),如果存在,由18B20將端口拉低
            Presence=DataPort;//狀態(tài)存入,用于后面顯示判斷
            uDelay(230);//延時完成一周期時間
            }

            void WriteByte(uchar val)//字節(jié)寫入
            {
            uchar i;
            for(i=8;i>0;i--)
            {
            DataPort=0;
            uDelay(4);
            DataPort=val&0x01;
            uDelay(20);
            DataPort=1;
            val=val/2;
            }
            uDelay(50);
            }


            uchar ReadByte()//字節(jié)讀取
            {
            uchar i;
            uchar value=0;
            for(i=0;i<8;i++)//讀入8字節(jié)
            {
            DataPort=0;//拉低后再拉高,產(chǎn)生讀間隙
            DataPort=1;
            uDelay(4);//延時后讀入
            if(DataPort)value|=0x01<uDelay(20);//延時完成一周期時間
            }
            return(value);
            }

            void SetStep(uchar Dat)//入口參數(shù),1F-0.5度步進(jìn),3F-0.25度,5F-0.125度,7F-0.0625度
            {
            Inti();
            WriteByte(0xcc);
            WriteByte(0x4e);
            WriteByte(0x15);//寫地址2—TH
            WriteByte(0x00);//寫地址3—TL
            WriteByte(Dat);//地址4,保留區(qū),用于小數(shù)后分辨率,1F,3F,5F,7F取值,值越大分辨率越高
            Inti();
            WriteByte(0xcc);
            WriteByte(0xbe);
            ReadByte();
            Inti();
            WriteByte(0xcc);
            WriteByte(0x48);//拷貝指令,發(fā)出后等6ms等待18B20將數(shù)據(jù)寫入EEPROM,寫結(jié)束再復(fù)位。
            uDelay(100);
            Inti();
            DataPort=1;
            }

            void GetTemp()//溫度獲得子程序,返回值在TempH,TempL中
            {
            Inti();Display(8);//每執(zhí)行一條指令補(bǔ)充顯示,消除閃動
            WriteByte(0xcc);Display(8);
            WriteByte(0x44);Display(8);
            Inti();Display(8);
            WriteByte(0xcc);Display(8);
            WriteByte(0xbe);Display(8);
            TempL=ReadByte();Display(8);
            TempH=ReadByte();Display(8);
            }

            void main(void)
            {
            uDelay(100);
            Presence=1;
            SetStep(0x7f);
            GetTemp();Display(100);//發(fā)送第一個取溫度指令后,要延時一段時間等待內(nèi)部轉(zhuǎn)換。(解決開機(jī)顯示85度的問題。)
            while(1){GetTemp();Hex2Bcd();Display(50);}

            }


            關(guān)鍵詞: CEPARK51單片機(jī)DS18B2

            評論


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

            關(guān)閉