新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DS18B20 1602液晶顯示、DS18B20時序太難調了

        DS18B20 1602液晶顯示、DS18B20時序太難調了

        作者: 時間:2016-11-13 來源:網絡 收藏
        注意:無論寫時隙,還是讀時隙,都以主機驅動數據線(DQ)為低電平開始。數據線的下降沿觸發從機內部的延時電路,使之與主機取得同步!!注意主從機采樣時間!

        復位脈沖

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

        一開始錯誤出現在復位脈沖。

        while(PIND&0x01); //正確!!等待被拉低。。18B20拉低60-240 us


        我寫出這樣子//while((PIND&0x01)==0);

        XXXXXXXXXXX這樣寫是錯誤的XXXXXXXXXXXXXX
        //讀出來的是255(0xff)

        /////////////////
        // 8Mhz晶振
        //////////////////
        #include
        #include "1602.c"

        #define uchar unsigned char
        #define uint unsigned int

        #define DQ_L PORTD&=~(1)
        #define DQ_H PORTD|=(1)

        #define DQ_IN DDRD&=~(1)
        #define DQ_OUT DDRD|=(1)

        void delay_us(uint n)
        {

        uint t;
        for(t=0;t asm("nop");
        }

        void delay_ms(uint n)
        {
        uint i,j;
        for(i=0;i for(j=0;j<1141;j++);
        }

        void reset(void)
        {

        DQ_OUT;
        DQ_H;
        DQ_L;
        delay_us(680); //大約480-960us
        DQ_H;
        DQ_IN;
        delay_us(20); //等待15-60us

        while(PIND&0x01); //等待被拉低。。18B20拉低60-240 us
        //while((PIND&0x01)==0);XXXXXXXXXXX這樣寫是錯誤的XXXXXXXXXXXXXX
        //讀出來的是255(0xff)
        DQ_OUT;
        DQ_H;
        delay_us(300); //等待180-400us

        }

        void write(uchar d) //先發低位
        {
        uchar i;
        DQ_OUT;
        for(i=0;i<8;i++)
        {
        DQ_L;
        asm("nop");
        asm("nop");
        asm("nop");

        if(d&(1< {
        DQ_H;
        delay_us(80);
        }
        else
        {
        DQ_L;
        delay_us(80);
        }

        DQ_H;
        }
        }
        uchar read() //低位在先
        {
        uchar i,d=0;


        for(i=0;i<8;i++)
        {
        DQ_L; //高到低跳變
        asm("nop");
        asm("nop");
        asm("nop");

        DQ_H;
        DQ_IN;

        if(PIND&0x01)
        d|=(1< else
        d&=~(1<
        delay_us(80);

        DQ_OUT;
        DQ_H;
        }

        return d;
        }

        uchar gettemp()
        {
        uchar t1,t2;
        uchar te;

        reset();
        write(0xcc); //跳過rom
        write(0x44); //開始轉換
        delay_ms(800); //延時800ms


        reset();
        write(0xcc); ////跳過rom
        write(0xbe); //發出讀命令
        t1=read(); //低字節
        t2=read();

        te=(t1>>4)+(t2<<4);

        return te;


        }
        int main()
        {
        uchar i,tt;
        uchar temp[4];

        init_1602();

        while(1)
        {
        tt=gettemp();
        //tt=0XFE;
        temp[0]=tt/100+0;
        temp[1]=tt%100/10+0;
        temp[2]=tt%10+0;
        temp[3]=0;


        LCD_write_string(1,1,"temperature");
        LCD_write_string(1,0,temp);
        }

        }

        RESET AND PRESENCE PULSES

        READ/WRITE TIME SLOTS



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 牙克石市| 新巴尔虎左旗| 晋州市| 呼图壁县| 乌鲁木齐县| 贡觉县| 观塘区| 中牟县| 龙陵县| 蒙城县| 景德镇市| 临沧市| 宁城县| 舟山市| 丽水市| 临沭县| 同德县| 图片| 太白县| 米易县| 师宗县| 鹿邑县| 饶阳县| 富锦市| 论坛| 射洪县| 顺昌县| 平安县| 合肥市| 托克逊县| 高州市| 马边| 长乐市| 清新县| 怀安县| 阿拉善盟| 绥化市| 繁昌县| 进贤县| 连平县| 灵宝市|