<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ATmega128(DS18B20)

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

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

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

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

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

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

          #define delay_us(x) _delay_us(x) //AVR GCC延時函數(shù) x(us)
          #define delay_ms(x) _delay_ms(x) //AVR GCC延時函數(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ù)碼管動態(tài)掃描顯示函數(shù),顯示采集到的溫度
          //*************************************************************************

          void Display_DS18B20(uint data_b,uint data_s,uint data_g)
          {
          uchar i,j;
          system_init();
          j=0x01; //此數(shù)據(jù)用來控制位選
          for(i=0;i<5;i++) //用后3位數(shù)碼管來顯示
          {
          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ù)點
          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);//延時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讀一個字節(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);//*延時4uS

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

          if (DQ_R)
          {
          value|=0x80;

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

          }

          return(value);
          }

          //*************************************************************************
          //向18B20寫一個字節(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);//延時4uS
          if (value & 0x01)
          {
          DQ_SET;

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

          }

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

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

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

          //*************************************************************************
          //溫度數(shù)據(jù)處理函數(shù)
          //*************************************************************************
          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(); //復(fù)位D18B20
          while (1)
          {
          ds1820_start(); //啟動一次轉(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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();