在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

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

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

            作者: 時間:2016-11-18 來源:網絡 收藏
            1、主程序:

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

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

            本文引用地址:http://www.biyoush.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方向設置
            #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);//開始溫度轉換
            void DS18B20_Write_Byte(u8 dat);//寫入一個字節(jié)
            u8 DS18B20_Read_Byte(void);//讀出一個字節(jié)
            u8 DS18B20_Read_Bit(void);//讀出一個位
            u8 DS18B20_Check(void);//檢測是否存在DS18B20
            void DS18B20_Rst(void);//復位DS18B20
            #endif

            3、源文件

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

            //DS18B20驅動代碼

            //復位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的回應
            //返回1:未檢測到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讀取一個位
            //返回值: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讀取一個字節(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;
            }
            //寫一個字節(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);
            }
            }
            }
            //開始溫度轉換
            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 同時檢測DS的存在
            //返回1:不存在
            //返回0:存在
            u8 DS18B20_Init(void)
            {
            GPIO_InitTypeDef GPIO_InitStructure;

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

            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;//溫度為負
            }else temp=1;//溫度為正
            tem=TH; //獲得高八位
            tem<<=8;
            tem+=TL;//獲得底八位
            tem=(float)tem*0.625;//轉換
            if(temp)return tem; //返回溫度值
            else return -tem;
            }



            評論


            技術專區(qū)

            關閉