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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32編程之ds18b20單總線溫度傳感器操作

          STM32編程之ds18b20單總線溫度傳感器操作

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          1、主程序:

          #include "sys.h"
          #include "led.h"
          #include "delay.h"
          #include "usart.h"
          #include "lcd.h"
          #include "ds18b20.h"
          /*
          程序功能 :用STM32實(shí)現(xiàn)DS18B20單總線溫度傳感器操作
          LCD顯示當(dāng)前的溫度;
          并用串口打印出溫度數(shù)據(jù) 。

          日期:2015年7月27日
          地點(diǎn):湖北工業(yè)職業(yè)技術(shù)學(xué)院電子工程
          硬件連接:PA0---DS18B20

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

          */

          int main(void)
          {
          short temp1;
          NVIC_Configuration();
          delay_init();
          LED_Init();
          uart_init(9600);
          LCD_Init();
          LCD_Clear(RED);
          POINT_COLOR=BLUE;
          LCD_ShowString(30,60,200,16,16,"DS18B20 TEST!");
          LCD_ShowString(30,80,200,16,16,"CURRENT TEMPTURE IS: . C");
          while(DS18B20_Init()!=0)
          {
          LCD_ShowString(30,100,200,16,16,"DS18B20 ERROR!PLEASE CHECK!");
          printf("DS18B20 ERROR!PLEASE CHECK!");
          delay_ms(100);
          }

          while(1)
          {
          temp1=DS18B20_Get_Temp();
          if(temp1<0)
          temp1=-temp1;
          LCD_ShowNum(190,80,temp1/10,2,16);
          LCD_ShowNum(214,80,temp1%10,1,16);
          printf("CURRENT TEMPTURE IS:%d.%d Cn",temp1/10,temp1%10);
          delay_ms(200);
          LED0=~LED0;

          }
          }

          2、頭文件

          #ifndef __DS18B20_H
          #define __DS18B20_H
          #include "sys.h"


          //IO方向設(shè)置
          #define DS18B20_IO_IN() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
          #define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}
          ////IO操作函數(shù)
          #defineDS18B20_DQ_OUT PAout(0) //數(shù)據(jù)端口PA0
          #defineDS18B20_DQ_IN PAin(0) //數(shù)據(jù)端口PA0

          u8 DS18B20_Init(void);//初始化DS18B20
          short DS18B20_Get_Temp(void);//獲取溫度
          void DS18B20_Start(void);//開始溫度轉(zhuǎn)換
          void DS18B20_Write_Byte(u8 dat);//寫入一個(gè)字節(jié)
          u8 DS18B20_Read_Byte(void);//讀出一個(gè)字節(jié)
          u8 DS18B20_Read_Bit(void);//讀出一個(gè)位
          u8 DS18B20_Check(void);//檢測(cè)是否存在DS18B20
          void DS18B20_Rst(void);//復(fù)位DS18B20
          #endif

          3、源文件

          #include "ds18b20.h"
          #include "delay.h"

          //DS18B20驅(qū)動(dòng)代碼

          //復(fù)位DS18B20
          void DS18B20_Rst(void)
          {
          DS18B20_IO_OUT(); //SET PA0 OUTPUT
          DS18B20_DQ_OUT=0; //拉低DQ
          delay_us(750); //拉低750us
          DS18B20_DQ_OUT=1; //DQ=1
          delay_us(15); //15US
          }
          //等待DS18B20的回應(yīng)
          //返回1:未檢測(cè)到DS18B20的存在
          //返回0:存在
          u8 DS18B20_Check(void)
          {
          u8 retry=0;
          DS18B20_IO_IN();//SET PA0 INPUT
          while (DS18B20_DQ_IN&&retry<200)
          {
          retry++;
          delay_us(1);
          };
          if(retry>=200)return 1;
          else retry=0;
          while (!DS18B20_DQ_IN&&retry<240)
          {
          retry++;
          delay_us(1);
          };
          if(retry>=240)return 1;
          return 0;
          }
          //從DS18B20讀取一個(gè)位
          //返回值:1/0
          u8 DS18B20_Read_Bit(void) // read one bit
          {
          u8 data;
          DS18B20_IO_OUT();//SET PA0 OUTPUT
          DS18B20_DQ_OUT=0;
          delay_us(2);
          DS18B20_DQ_OUT=1;
          DS18B20_IO_IN();//SET PA0 INPUT
          delay_us(12);
          if(DS18B20_DQ_IN)data=1;
          else data=0;
          delay_us(50);
          return data;
          }
          //從DS18B20讀取一個(gè)字節(jié)
          //返回值:讀到的數(shù)據(jù)
          u8 DS18B20_Read_Byte(void) // read one byte
          {
          u8 i,j,dat;
          dat=0;
          for (i=1;i<=8;i++)
          {
          j=DS18B20_Read_Bit();
          dat=(j<<7)|(dat>>1);
          }
          return dat;
          }
          //寫一個(gè)字節(jié)到DS18B20
          //dat:要寫入的字節(jié)
          void DS18B20_Write_Byte(u8 dat)
          {
          u8 j;
          u8 testb;
          DS18B20_IO_OUT();//SET PA0 OUTPUT;
          for (j=1;j<=8;j++)
          {
          testb=dat&0x01;
          dat=dat>>1;
          if (testb)
          {
          DS18B20_DQ_OUT=0;// Write 1
          delay_us(2);
          DS18B20_DQ_OUT=1;
          delay_us(60);
          }
          else
          {
          DS18B20_DQ_OUT=0;// Write 0
          delay_us(60);
          DS18B20_DQ_OUT=1;
          delay_us(2);
          }
          }
          }
          //開始溫度轉(zhuǎn)換
          void DS18B20_Start(void)// ds1820 start convert
          {
          DS18B20_Rst();
          DS18B20_Check();
          DS18B20_Write_Byte(0xcc);// skip rom
          DS18B20_Write_Byte(0x44);// convert
          }
          //初始化DS18B20的IO口 DQ 同時(shí)檢測(cè)DS的存在
          //返回1:不存在
          //返回0:存在
          u8 DS18B20_Init(void)
          {
          GPIO_InitTypeDef GPIO_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口時(shí)鐘

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PORTA0 推挽輸出
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);

          GPIO_SetBits(GPIOA,GPIO_Pin_0); //輸出1

          DS18B20_Rst();

          return DS18B20_Check();
          }
          //從ds18b20得到溫度值
          //精度:0.1C
          //返回值:溫度值 (-550~1250)
          short DS18B20_Get_Temp(void)
          {
          u8 temp;
          u8 TL,TH;
          short tem;
          DS18B20_Start (); // ds1820 start convert
          DS18B20_Rst();
          DS18B20_Check();
          DS18B20_Write_Byte(0xcc);// skip rom
          DS18B20_Write_Byte(0xbe);// convert
          TL=DS18B20_Read_Byte(); // LSB
          TH=DS18B20_Read_Byte(); // MSB

          if(TH>7)
          {
          TH=~TH;
          TL=~TL;
          temp=0;//溫度為負(fù)
          }else temp=1;//溫度為正
          tem=TH; //獲得高八位
          tem<<=8;
          tem+=TL;//獲得底八位
          tem=(float)tem*0.625;//轉(zhuǎn)換
          if(temp)return tem; //返回溫度值
          else return -tem;
          }



          關(guān)鍵詞: STM32編程ds18b20溫度傳感

          評(píng)論


          技術(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); })();