新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 18B20通訊程序--源代碼介紹

        18B20通訊程序--源代碼介紹

        作者: 時(shí)間:2011-12-05 來源:網(wǎng)絡(luò) 收藏

        這是我在16F877,18F1320,18F1220上通過的主要是延時(shí)問題,這個(gè)解決了,什么都可以通過。

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

        [原作者沒有提供所使用的編譯器,由于是C,所以大同小異,建議使用時(shí),確認(rèn)是否與你的編譯器兼容]

        #include pic18f1220.h>

        #define uch unsigned char

        #define unint unsigned int

        #define DQ RB3 //定義數(shù)據(jù)端口

        #define DQ_DIR TRISB3 //定義18B20D口方向寄存器

        #define W1_INPUT 1

        #define W1_OUTPUT 0

        #define FALSE 0

        #define TRUE !FALSE

        #define DQ_HIGH() DQ_DIR = W1_INPUT

        #define DQ_LOW() DQ = 0; DQ_DIR = W1_OUTPUT

        void delay(unint x)

        {

        unint d;

        d=x;

        while(--d)

        {;}

        }

        bit reset(void) //初始化18B20

        {

        static bit presence; //定義一個(gè)應(yīng)答信號(hào)

        DQ_LOW();

        delay(70); //置總線為低電平并保持至少480us

        DQ_HIGH(); //等電阻拉高總線并保持15-60us

        delay(5);

        presence=DQ; //接受應(yīng)答信號(hào)

        delay(20); //延時(shí)60-240us

        return(presence); //返回應(yīng)答信號(hào)

        }

        //*************** 讀一位函數(shù)******************//

        bit read_bit(void)

        {

        static bit i;

        DQ_LOW();

        DQ_LOW();

        DQ_HIGH();

        asm(nop);

        asm(nop);

        asm(nop);

        i=DQ;

        delay(3);

        return(i);

        }

        //*********************寫一位函數(shù)****************//

        void write_bit(uch bitval)

        {

        DQ_LOW();

        delay(1);

        if (bitval==1)

        {

        DQ_HIGH();

        }

        delay(3);

        DQ_HIGH();

        }

        //************** 從18B20中讀一個(gè)字節(jié)**************//

        uch read_byte(void)

        {

        uch i;

        uch j;

        uch value=0;

        for (i=0;i8;i++)

        {

        j=read_bit(); //調(diào)讀位函數(shù)

        if (j) //如果是 1 置1

        {

        value|=(0x01i); //先讀低位,再讀高位

        asm(nop);

        asm(nop);

        asm(nop);

        }

        } //否則置 0

        return(value);

        }

        //*********************向18B20中 寫一個(gè)字節(jié)**************//

        void write_byte(uch val)

        {

        uch i;

        uch temp;

        for (i=0;i8;i++)

        {

        temp=val>>i;

        temp=0x01;

        write_bit(temp); //調(diào)寫位函數(shù)

        }

        asm(nop);

        asm(nop);

        asm(nop);

        }

        main()

        {

        uch teml,temh;

        GIE=0;

        OSCCON=0X6E; //這是18F1320的頻率選擇寄存器

        ADCON1=0X7F;

        do{

        ;

        }while (reset()) ; //復(fù)位等待從機(jī)應(yīng)答

        write_byte(0XCC); //忽略ROM匹配

        write_byte(0X44); //發(fā)送溫度轉(zhuǎn)化命令

        delay(25000); //延時(shí)100-300us

        do

        {

        ;

        }while( reset()); //再次復(fù)位,等待從機(jī)應(yīng)答

        write_byte(0XCC); //忽略ROM匹配

        write_byte(0XBE); //發(fā)送讀溫度命令

        teml =read_byte(); //讀出溫度低8

        temh=read_byte(); //讀出溫度高8位

        DQ_HIGH(); //釋放總線

        }



        關(guān)鍵詞: 介紹 源代碼 程序 通訊 18B20

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 雅安市| 乐东| 永靖县| 安图县| 宾川县| 大化| 鄂温| 阿尔山市| 新丰县| 新宾| 威信县| 西城区| 新乡县| 大英县| 都安| 吉木萨尔县| 临湘市| 阜宁县| 长春市| 屏东县| 萨迦县| 泰安市| 临汾市| 克拉玛依市| 西平县| 凤城市| 定西市| 宜黄县| 岗巴县| 友谊县| 钦州市| 天镇县| 栾川县| 江北区| 安平县| 敦化市| 蒙阴县| 宝丰县| 上高县| 铜陵市| 来凤县|