新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ATmega16L學習板18B20測試程序

        ATmega16L學習板18B20測試程序

        作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
        ATmega16L學習板18B20測試程序

        晶振頻率: 8MHz
        編譯: ICCAVR 6.31

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

        #include
        #include
        #include "../include/board.h"

        /*===================================================================
        // 函數(shù)功能: DS18B20數(shù)據(jù)校驗函數(shù)
        // 形參: void
        // 返回: unsigned char 校驗結(jié)果
        // 編寫: 2004/8/25
        // 備注: CRC公式為:CRC = X^8 + X^5 + X^4 + 1
        ===================================================================*/
        unsigned char crccheck(unsigned char *p,unsigned char len)
        {
        unsigned char bit0,cbit,r,temp,i,j,byte;
        temp = 0;
        for(j = 0; j < len; j++)
        {
        byte = p[j];
        for(i = 0; i < 8; i++)
        {
        cbit = temp & 0x01;
        bit0 = byte&0x01;
        temp >>= 1;
        r = cbit ^ bit0;
        if(r == 1)
        temp ^= 0x8c;
        byte >>= 1;
        }
        }
        return temp;
        }

        /*===================================================================
        // 函數(shù)功能: us延時函數(shù)
        // 形參: void
        // 返回: void
        // 編寫: 2004/8/25
        ===================================================================*/
        void delay_us(unsigned int time)
        {
        do
        {
        time--;
        }
        while (time>1);
        }

        /*===================================================================
        // 函數(shù)功能: 判斷總線應答
        // 形參: void
        // 返回: unsigned char true為應答
        // 編寫: 2004/8/25
        ===================================================================*/
        unsigned char ds1820_ack(void)
        {
        unsigned char ack;
        DDRC |= DQ;
        PORTC &= ~DQ;
        delay_us(500); // reset
        PORTC |= DQ;
        DDRC &= ~DQ;
        delay_us(45);
        ack = DQ & PINC;
        delay_us(500); // host receive
        if(ack)
        return true;
        else
        return false;
        }

        /*===================================================================
        // 函數(shù)功能: 從 1-wire 總線上讀取一個字節(jié)
        // 形參: void
        // 返回: unsigned char 讀到的值
        // 編寫: 2004/8/25
        ===================================================================*/
        unsigned char read_byte(void)
        {
        unsigned char i;
        unsigned char value = 0;
        for(i = 8; i > 0; i--)
        {
        value >>= 1; // low bit first
        DDRC |= DQ;
        PORTC &= ~DQ; // pull DQ low to start timeslot
        delay_us(3);
        PORTC |= DQ;
        DDRC &= ~DQ; // release bus
        delay_us(10);
        if(DQ & PINC)
        value|=0x80;
        delay_us(100);
        DDRC |= DQ;
        delay_us(5); // time interval
        }
        return(value);
        }

        /*===================================================================
        // 函數(shù)功能: 向 1-WIRE 總線上寫一個字節(jié)
        // 形參: value 寫到總線上的值
        // 返回: void
        // 編寫: 2004/8/25
        ===================================================================*/
        void write_byte(unsigned char value)
        {
        unsigned char i;
        DDRC |= DQ;
        for(i = 8; i > 0; i--)
        {
        if(value & 0x01)
        {
        PORTC &= ~DQ; // pull DQ low to start timeslot
        delay_us(10);
        PORTC |= DQ;
        delay_us(100);
        }
        else
        {
        PORTC &= ~DQ; // pull DQ low to start timeslot
        delay_us(100);
        PORTC |= DQ;
        delay_us(10);
        }
        value >>= 1;
        }
        }

        /*===================================================================
        // 函數(shù)功能: 讀取溫度
        // 形參: *temperature 溫度存儲空間
        // 返回: unsigned char true為有效
        // 編寫: 2004/8/25
        ===================================================================*/
        unsigned char Read_Temperature(unsigned int *temperature)
        {
        unsigned char i;
        union{
        unsigned char c[2];
        unsigned int x;
        }temp;
        unsigned char temporary[9];

        ds1820_ack();
        write_byte(0xCC); // Skip ROM
        write_byte(0x44); // Start Conversion
        for(i = 0; i < 16; i++)
        delay_us(50000);
        ds1820_ack();
        write_byte(0xCC); // Skip ROM
        write_byte(0xBE); // Read Scratch Pad
        for(i = 0; i < 9; i++)
        temporary[i] = read_byte();
        temp.c[0] = temporary[0];
        temp.c[1] = temporary[1];

        if(crccheck(temporary,9))
        return false;
        else
        {
        *temperature = temp.x;
        return true;
        }
        }

        /*===================================================================
        // 函數(shù)功能: 讀取Rom Code
        // 形參: *temp DS18B20的Rom Code存儲空間
        // 返回: unsigned char true為有效
        // 編寫: 2004/8/25
        ===================================================================*/
        unsigned char Read_RomCode(unsigned char *temp)
        {
        ds1820_ack();
        write_byte(0x33);
        temp[0] = read_byte();
        temp[1] = read_byte();
        temp[2] = read_byte();
        temp[3] = read_byte();
        temp[4] = read_byte();
        temp[5] = read_byte();
        temp[6] = read_byte();
        temp[7] = read_byte();
        if(crccheck(temp,8))
        return false;
        else
        return true;
        }

        /*===================================================================
        // 函數(shù)功能: 匹配DS18B20
        // 形參: *p DS18B20的Rom Code
        // 返回: void
        // 編寫: 2004/8/25
        ===================================================================*/
        void ds1820_match(unsigned char *p)
        {
        unsigned char i;
        ds1820_ack();
        write_byte(0x55);
        for(i=0;i<8;i++)
        write_byte(p[i]);
        }



        評論


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

        關閉
        主站蜘蛛池模板: 贡嘎县| 鹤壁市| 高青县| 乡宁县| 乌拉特前旗| 会东县| 霞浦县| 东莞市| 泉州市| 云南省| 灵丘县| 新蔡县| 黔东| 淮北市| 新化县| 玛纳斯县| 天水市| 如东县| 临桂县| 金华市| 静宁县| 和平县| 集贤县| 宁陵县| 奉新县| 吉木乃县| 农安县| 白玉县| 河曲县| 井陉县| 锦屏县| 金湖县| 紫金县| 太保市| 监利县| 大关县| 拜城县| 来凤县| 金昌市| 巴青县| 册亨县|