新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)DS18B20溫度計(jì)C語(yǔ)言程序

單片機(jī)DS18B20溫度計(jì)C語(yǔ)言程序

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏

  1. //功能:有負(fù)溫度顯示,高精度格度可以顯示-9.99C到99.99C
    //帶有報(bào)警裝置
    //當(dāng)溫度為正時(shí),顯示十位 個(gè)位 十分位 百分位
    //當(dāng)溫度為負(fù)時(shí),顯示負(fù)號(hào) 十位 個(gè)位 十分位
    //缺點(diǎn)是上下限報(bào)警數(shù)值不能改變
    //注明:數(shù)碼管是CC—共陰型
    //讀取溫度
  2. sbit DQ = P3^0;//定義通信端口
    bit fg=1;
    //晶振12MHz
    void delay_18B20(unsigned int i)
    {
    while(i--);
    }
    //初始化函數(shù)
    bit Init_DS18B20(void)
    {
    unsigned char x=0;
    DQ = 1;//DQ復(fù)位
    delay_18B20(8);//稍做延時(shí)
    DQ = 0;//單片機(jī)將DQ拉低
    delay_18B20(80); //精確延時(shí) 大于 480us
    DQ = 1;//拉高總線
    delay_18B20(14);
    x=DQ;//稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
    return(x); //Init_DS18B20(void) 被定義為bit則要有返回值
    delay_18B20(20);
    }
    //while(DQ);
    //while(~DQ);//檢測(cè)到應(yīng)答脈沖
    //
    //讀一個(gè)字節(jié)
    ReadOneChar(void)
    {
    unsigned char i=0;
    unsigned char dat = 0;
    for (i=8;i>0;i--)
    {
    DQ = 0; // 給脈沖信號(hào)
    dat>>=1;
    DQ = 1; // 給脈沖信號(hào)
    if(DQ)
    dat|=0x80;
    delay_18B20(4);
    }
    return(dat);
    }
    //寫一個(gè)字節(jié)
    WriteOneChar(unsigned char dat)
    {
    unsigned char i=0;
    for (i=8; i>0; i--)
    {
    DQ = 0;
    DQ = dat&0x01;
    delay_18B20(5);
    DQ = 1;
    dat>>=1;
    }
    }
    ReadTemperature(void)
    {
    unsigned char a=0;
    unsigned char b=0;
    unsigned intt=0;

    Init_DS18B20();
    WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
    WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
    delay_18B20(100);//至少750ms
  3. Init_DS18B20();
    WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
    WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
    a=ReadOneChar();
    b=ReadOneChar();
    if((b&0xf8)==0xf8) //位為1 時(shí)溫度是負(fù)
    {
    b=~b;
    a=~a+1; //補(bǔ)碼轉(zhuǎn)換,取反加一
    (a==0)b++;
    fg=0; //讀取溫度為負(fù)時(shí)fg=0
    }
    //傳感器返回值除16得實(shí)際溫度值
    //技巧處理后先乘25,再除4,除4用右移實(shí)現(xiàn)
    t=((b*256+a)*25)>>2;
    //t=t+(t>0?0.5:-0.5); //四佘五入大于0加0.5, 小于0減0.5前面要把t定義為float型才可以
    return(t);
    }
  4. 顯示頭文件:display()

  5. char disp[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//數(shù)字0-9和‘-’的共陰段碼
    char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
    void display(int tmp)
    {
    if(fg==0)
    {
    P2 = 0xff;
    P1 = 0x40;//"-"
    P2 = 0xEF;
    delay_18B20(2000);
    }
    P2 = 0xff;
    P1 = 0x39;//"C"//若先位選再段選, 由于IO口默認(rèn)輸出高電平, 所以當(dāng)先位選會(huì)使數(shù)碼管出現(xiàn)亂碼
    P2 = 0xFE;
    delay_18B20(200);
  6. P2 = 0xff;
    P1 = disp[tmp/10];
    P2 = 0xFD;
    delay_18B20(200);
  7. P2 = 0xff;
    P1 =disp_dot[tmp/10];
    P2 = 0xFB;
    delay_18B20(200);
  8. if(fg==1)
  9. {
  10. P2 = 0xff;
    P1 = disp[tmp/100];
    P2 = 0xF7;
    delay_18B20(200);
    }
    }


關(guān)鍵詞: 單片機(jī)DS18B20溫度

評(píng)論


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

關(guān)閉