新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATmega128(DS18B20)

        ATmega128(DS18B20)

        作者: 時間:2016-11-10 來源:網絡 收藏
        //ATmega28的溫度傳感器DS18B20控制程序,顯示環境溫度,編譯優化等級-01

        //DS18b20的C語言驅動程序,三位數碼管顯示,讀取當前環境溫度,精度達0.1度,溫度范圍0-99度
        //DS18B20 詳細引腳功能描述1、GND 地信號;2、DQ數據輸入出引腳。開漏單總線接口引腳。當被用在寄生電源
        //也可以向器件提供電源;3、VDD可選擇的VDD 引腳。當工作于寄生電源時,此引腳必須接地。
        //DS18B20 的使用方法。DS18B20 采用的是1-Wire 總線協議方式
        //即在一根數據線實現數據的雙向傳輸
        //編譯環境 AVR Studio 4.17/AVR GCC
        //系統時鐘7.3728MHZ,設置熔絲位為外部高頻石英晶體振蕩,啟動時間4.1ms

        //***********************************************************************
        //包含文件
        //***********************************************************************

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

        #include
        #include
        #define F_CPU7372800/* 單片機主頻為7.3728MHz,用于延時子程序 */
        #include
        #include <avr/io.h>
        #include

        //***********************************************************************
        //定義變量區
        //***********************************************************************

        #define delay_us(x) _delay_us(x) //AVR GCC延時函數 x(us)
        #define delay_ms(x) _delay_ms(x) //AVR GCC延時函數 x(ms)

        #define uchar unsigned char
        #define uint unsigned int

        #define Data_IO PORTA //數碼管數據口
        #define Data_DDR DDRA //數碼管數據口方向寄存器
        #define D_LE0 PORTD &= ~(1 << PD4) //數碼管段控制位為0,鎖存端口數據
        #define D_LE1 PORTD |= (1 << PD4) //數碼管段控制位為1,鎖存器輸出與端口一致
        #define W_LE0 PORTD &= ~(1 << PD5) //數碼管位控制位為0
        #define W_LE1 PORTD |= (1 << PD5) //數碼管位控制位為1

        #define DQ_IN DDRE &= ~(1 << PE4)//設置輸入,DS18B20接單片機PE4口
        #define DQ_OUT DDRE |= (1 << PE4)//設置輸出
        #define DQ_CLR PORTE &= ~(1 << PE4)//置低電平
        #define DQ_SET PORTE |= (1 << PE4)//置高電平
        #define DQ_R PINE & (1 << PE4)//讀電平

        uchar key;
        uint temp_value;
        uint temp,A1,A2,A3; //定義的變量,顯示數據處理
        uchar flag1;

        //***********************************************************************
        //共陰數碼管顯示的斷碼表0~F
        //***********************************************************************

        uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

        //***********************************************************************
        //IO端口初始化
        //***********************************************************************

        void system_init()
        {
        Data_IO=0xFF; //數據口為輸出
        Data_DDR=0xFF;

        PORTD=0xFF; //74HC573的控制口,設置為輸出
        DDRD=0xFF;
        }

        //*************************************************************************
        //74HC573控制數碼管動態掃描顯示函數,顯示采集到的溫度
        //*************************************************************************

        void Display_DS18B20(uint data_b,uint data_s,uint data_g)
        {
        uchar i,j;
        system_init();
        j=0x01; //此數據用來控制位選
        for(i=0;i<5;i++) //用后3位數碼管來顯示
        {
        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=0x00;
        D_LE0;
        delay_ms(1);
        }
        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A1];
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A2]|0x80; //顯示小數點
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A3];
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=0xff;
        W_LE0;

        }


        //*************************************************************************
        //DS18B20初始化
        //*************************************************************************

        unsigned char DS18B20_Reset(void) //初始化和復位

        {
        unsigned char i;
        DQ_OUT;
        DQ_CLR;
        delay_us(500);//延時500uS(480-960)
        DQ_SET;
        DQ_IN;
        delay_us(80);//延時80uS
        i = DQ_R;
        delay_us(500);//延時500uS(保持>480uS)

        if (i)
        {
        return 0x00;

        }
        else
        {
        return 0x01;

        }

        }


        //*************************************************************************
        //DS18B20讀一個字節函數
        //*************************************************************************

        unsigned char ds1820_read_byte(void)
        {

        unsigned char i;
        unsigned char value = 0;
        for (i = 8; i != 0; i--)
        {
        value >>= 1;
        DQ_OUT;
        DQ_CLR;
        delay_us(4);//*延時4uS

        DQ_SET;
        DQ_IN;
        delay_us(10);//*延時10uS

        if (DQ_R)
        {
        value|=0x80;

        }
        delay_us(60); //*延時60uS

        }

        return(value);
        }

        //*************************************************************************
        //向18B20寫一個字節函數
        //*************************************************************************

        /*DS18B20字節寫入函數*/
        void ds1820_write_byte(unsigned char value)
        {

        unsigned char i;
        for (i = 8; i != 0; i--)
        {
        DQ_OUT;
        DQ_CLR;
        delay_us(4);//延時4uS
        if (value & 0x01)
        {
        DQ_SET;

        }
        delay_us(80);//延時80uS
        DQ_SET; //位結束
        value >>= 1;

        }

        }
        //*************************************************************************
        //發送溫度轉換命令
        //*************************************************************************

        /*啟動ds1820轉換*/
        void ds1820_start(void) {

        DS18B20_Reset();
        ds1820_write_byte(0xCC);//勿略地址
        ds1820_write_byte(0x44);//啟動轉換
        }

        //*************************************************************************
        //DS8B20讀取溫度信息
        //*************************************************************************

        unsigned int ds1820_read_temp(void)
        {

        unsigned int i;
        unsigned char buf[9];

        DS18B20_Reset();
        ds1820_write_byte(0xCC);//勿略地址
        ds1820_write_byte(0xBE);//讀取溫度
        for (i = 0; i < 9; i++)
        {
        buf[i] = ds1820_read_byte();
        }
        i = buf[1];
        i <<= 8;
        i |= buf[0];
        temp_value=i;
        temp_value=temp_value*0.625; //不是乘以0.0625的原因是為了把小數點后一位數據也轉化為可以顯示的數據
        //比如溫度本身為27.5度,為了在后續的數據處理程序中得到BCD碼,我們先放大到275
        //然后在顯示的時候確定小數點的位置即可,就能顯示出27.5度了
        return i;
        }

        //*************************************************************************
        //溫度數據處理函數
        //*************************************************************************
        void data_do(uint temp_d)
        {
        uint A2t;
        A1=temp_d/100; //分出百,十,和個位
        A2t=temp_d%100;
        A2=A2t/10;
        A3=A2t%10;
        }

        //*************************************************************************
        //主程序
        //*************************************************************************

        void main(void)
        {
        uint j;
        DS18B20_Reset(); //復位D18B20
        while (1)
        {
        ds1820_start(); //啟動一次轉換
        ds1820_read_temp(); //讀取溫度數值
        data_do(temp_value); //處理數據,得到要顯示的值
        for(j=0;j<200;j++)
        {
        Display_DS18B20(A1,A2,A3); //顯示溫度值
        }


        }
        }



        關鍵詞: ATmega128DS18B2

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 曲水县| 长沙市| 云浮市| 卓尼县| 舞钢市| 来宾市| 颍上县| 三原县| 禄劝| 军事| 灵丘县| 海兴县| 鹿泉市| 瓦房店市| 阳山县| 贵州省| 蕲春县| 柘荣县| 新巴尔虎左旗| 土默特左旗| 临清市| 和平县| 讷河市| 嵊泗县| 车险| 新干县| 临汾市| 江陵县| 牙克石市| 随州市| 平山县| 虎林市| 自贡市| 宁强县| 双鸭山市| 咸丰县| 东明县| 龙州县| 梧州市| 昌宁县| 梅州市|