電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1787|回復(fù): 0
收起左側(cè)

單片機(jī)C語(yǔ)言實(shí)例-194-溫度采集DS18B20

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-17 10:07:13 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)C語(yǔ)言實(shí)例-194-溫度采集DS18B20

/********************************************************************
* 文件名  : 溫度采集DS18B20.c
* 描述    :  該文件實(shí)現(xiàn)了用溫度傳感器件DS18B20對(duì)溫度的采集,并在數(shù)碼管上顯示出來(lái)。
* 創(chuàng)建人  : 東流,2009年4月10日
* 版本號(hào)  : 2.0
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

#define jump_ROM 0xCC
#define start 0x44
#define read_EEROM 0xBE

sbit DQ = P2^3;            //DS18B20數(shù)據(jù)口

unsigned char TMPH,TMPL;

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
* 名稱 : delay()
* 功能 : 延時(shí),延時(shí)時(shí)間大概為140US。
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/

void delay_1()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++)
;
}

/********************************************************************
* 名稱 : delay()
* 功能 : 延時(shí)函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void delay(uint N)
{
        int i;
        for(i=0; i<N; i++)
        ;
}

/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
* 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
* 輸出 : 無(wú)
***********************************************************************/
void Delay_1ms(uint i)//1ms延時(shí)
{
        uchar x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=148;x++);       
}
/********************************************************************
* 名稱 : Reset()
* 功能 : 復(fù)位DS18B20
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
uchar Reset(void)
{
        uchar deceive_ready;
        DQ = 0;
        delay(29);
        DQ = 1;
        delay(3);
        deceive_ready = DQ;
        delay(25);
        return(deceive_ready);
}

/********************************************************************
* 名稱 : read_bit()
* 功能 : 從DS18B20讀一個(gè)位值
* 輸入 : 無(wú)
* 輸出 : 從DS18B20讀出的一個(gè)位值
***********************************************************************/
uchar read_bit(void)
{
        uchar i;
        DQ = 0;
        DQ = 1;
        for(i=0; i<3; i++);
        return(DQ);
}

/********************************************************************
* 名稱 : write_bit()
* 功能 : 向DS18B20寫一位
* 輸入 : bitval(要對(duì)DS18B20寫入的位值)
* 輸出 : 無(wú)
***********************************************************************/
void write_bit(uchar bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}

/********************************************************************
* 名稱 : read_byte()
* 功能 : 從DS18B20讀一個(gè)字節(jié)
* 輸入 : 無(wú)
* 輸出 : 從DS18B20讀到的值
***********************************************************************/
uchar read_byte(void)
{
        uchar i,m,receive_data;
        m = 1;
        receive_data = 0;
        for(i=0; i<8; i++)
        {
                if(read_bit())
                {
                        receive_data = receive_data + (m << i);
                }
                delay(6);
        }
        return(receive_data);
}

/********************************************************************
* 名稱 : write_byte()
* 功能 : 向DS18B20寫一個(gè)字節(jié)
* 輸入 : val(要對(duì)DS18B20寫入的命令值)
* 輸出 : 無(wú)
***********************************************************************/
void write_byte(uchar val)
{
        uchar i,temp;
        for(i=0; i<8; i++)
        {
                temp = val >> i;
                temp = temp & 0x01;
                write_bit(temp);
                delay(5);
        }
}


/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void main()
{
        float tt;
        uint temp;
        P2 = 0x00;
        while(1)
        {
                Reset();
                write_byte(jump_ROM);
                write_byte(start);
                Reset();
                write_byte(jump_ROM);
                write_byte(read_EEROM);
                TMPL = read_byte();
                TMPH = read_byte();
                temp = TMPL / 16 + TMPH * 16;
                P0 = table[temp/10%10]&0xef;
                P2 = 6;
                Delay_1ms(5);
                P0 = table[temp%10];
                P2 = 7;
                Delay_1ms(5);
                P1=B11111111;
        }
}


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請(qǐng)回復(fù)


發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表