• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

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

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

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

    [原作者沒有提供所使用的編譯器,由于是C,所以大同小異,建議使用時,確認(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; //定義一個應(yīng)答信號

    DQ_LOW();

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

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

    delay(5);

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

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

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

    }

    //*************** 讀一位函數(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中讀一個字節(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中 寫一個字節(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); //延時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

    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 莆田市| 甘肃省| 宝应县| 扎鲁特旗| 开原市| 郯城县| 宁波市| 巴楚县| 从化市| 西安市| 蓝山县| 襄垣县| 资中县| 道孚县| 富宁县| 桃源县| 什邡市| 上杭县| 永福县| 宝清县| 达拉特旗| 保山市| 鹿泉市| 拉萨市| 金溪县| 卢龙县| 锦州市| 永春县| 隆子县| 谢通门县| 吉木萨尔县| 宣恩县| 榆林市| 新丰县| 电白县| 舞阳县| 琼中| 武义县| 长垣县| 澜沧| 双鸭山市|