在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ATmega128(DS18B20)

            作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
            //ATmega28的溫度傳感器DS18B20控制程序,顯示環(huán)境溫度,編譯優(yōu)化等級(jí)-01

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

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

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

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

            //***********************************************************************
            //定義變量區(qū)
            //***********************************************************************

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

            #define uchar unsigned char
            #define uint unsigned int

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

            #define DQ_IN DDRE &= ~(1 << PE4)//設(shè)置輸入,DS18B20接單片機(jī)PE4口
            #define DQ_OUT DDRE |= (1 << PE4)//設(shè)置輸出
            #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; //定義的變量,顯示數(shù)據(jù)處理
            uchar flag1;

            //***********************************************************************
            //共陰數(shù)碼管顯示的斷碼表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; //數(shù)據(jù)口為輸出
            Data_DDR=0xFF;

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

            //*************************************************************************
            //74HC573控制數(shù)碼管動(dòng)態(tài)掃描顯示函數(shù),顯示采集到的溫度
            //*************************************************************************

            void Display_DS18B20(uint data_b,uint data_s,uint data_g)
            {
            uchar i,j;
            system_init();
            j=0x01; //此數(shù)據(jù)用來(lái)控制位選
            for(i=0;i<5;i++) //用后3位數(shù)碼管來(lái)顯示
            {
            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; //顯示小數(shù)點(diǎn)
            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) //初始化和復(fù)位

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

            if (i)
            {
            return 0x00;

            }
            else
            {
            return 0x01;

            }

            }


            //*************************************************************************
            //DS18B20讀一個(gè)字節(jié)函數(shù)
            //*************************************************************************

            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);//*延時(shí)4uS

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

            if (DQ_R)
            {
            value|=0x80;

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

            }

            return(value);
            }

            //*************************************************************************
            //向18B20寫一個(gè)字節(jié)函數(shù)
            //*************************************************************************

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

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

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

            }

            }
            //*************************************************************************
            //發(fā)送溫度轉(zhuǎn)換命令
            //*************************************************************************

            /*啟動(dòng)ds1820轉(zhuǎn)換*/
            void ds1820_start(void) {

            DS18B20_Reset();
            ds1820_write_byte(0xCC);//勿略地址
            ds1820_write_byte(0x44);//啟動(dòng)轉(zhuǎn)換
            }

            //*************************************************************************
            //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的原因是為了把小數(shù)點(diǎn)后一位數(shù)據(jù)也轉(zhuǎn)化為可以顯示的數(shù)據(jù)
            //比如溫度本身為27.5度,為了在后續(xù)的數(shù)據(jù)處理程序中得到BCD碼,我們先放大到275
            //然后在顯示的時(shí)候確定小數(shù)點(diǎn)的位置即可,就能顯示出27.5度了
            return i;
            }

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

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

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


            }
            }



            關(guān)鍵詞: ATmega128DS18B2

            評(píng)論


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

            關(guān)閉