久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2716|回復: 4
打印 上一主題 下一主題
收起左側

新手求救 溫度采集不了!!! 附上代碼程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:196544 發表于 2017-5-4 16:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在線等!

新建文件夾.zip

81.6 KB, 下載次數: 7

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:90658 發表于 2017-5-4 22:48 | 只看該作者
不錯!挺好
回復

使用道具 舉報

板凳
ID:194871 發表于 2017-5-4 22:51 | 只看該作者
是時序的問題吧
回復

使用道具 舉報

地板
ID:194871 發表于 2017-5-4 22:54 | 只看該作者
給你一個參考一下吧
#include "stdio.h" // printf用

#define DS18B20_GPIO_NUM                                 GPIO_Pin_5
#define DS18B20_GPIO_X                                        GPIOC
#define RCC_APB2Periph_DS18B20_GPIO_X        RCC_APB2Periph_GPIOC

#define DS18B20_DQ_OUT_Low                        GPIO_ResetBits(DS18B20_GPIO_X,DS18B20_GPIO_NUM)
#define DS18B20_DQ_OUT_High                        GPIO_SetBits(DS18B20_GPIO_X,DS18B20_GPIO_NUM)
#define DS18B20_DQ_IN                                GPIO_ReadInputDataBit(DS18B20_GPIO_X,DS18B20_GPIO_NUM)

#define MaxSensorNum 8
unsigned char DS18B20_ID[MaxSensorNum][8];        // 存檢測到的傳感器DS18B20_ID的數組,前面的維數代表單根線傳感器數量上限
unsigned char DS18B20_SensorNum;                        // 檢測到的傳感器數量(從1開始,例如顯示1代表1個,8代表8個)

// 配置DS18B20用到的I/O口
void DS18B20_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_DS18B20_GPIO_X, ENABLE);
        GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_NUM;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DS18B20_GPIO_X, &GPIO_InitStructure);
        GPIO_SetBits(DS18B20_GPIO_X, DS18B20_GPIO_NUM);
}

// 引腳輸入
void DS18B20_Mode_IPU(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_NUM;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(DS18B20_GPIO_X, &GPIO_InitStructure);
}

// 引腳輸出
void DS18B20_Mode_Out(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_NUM;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DS18B20_GPIO_X, &GPIO_InitStructure);

}

// 復位,主機給從機發送復位脈沖
void DS18B20_Rst(void)
{
        DS18B20_Mode_Out();
        DS18B20_DQ_OUT_Low;                // 產生至少480us的低電平復位信號
        Delay_us(480);
        DS18B20_DQ_OUT_High;        // 在產生復位信號后,需將總線拉高
        Delay_us(15);
}

// 檢測從機給主機返回的應答脈沖。從機接收到主機的復位信號后,會在15~60us后給主機發一個應答脈沖
u8 DS18B20_Answer_Check(void)
{
        u8 delay = 0;
        DS18B20_Mode_IPU(); // 主機設置為上拉輸入
        // 等待應答脈沖(一個60~240us的低電平信號 )的到來
        // 如果100us內,沒有應答脈沖,退出函數,注意:從機接收到主機的復位信號后,會在15~60us后給主機發一個存在脈沖
        while (DS18B20_DQ_IN&&delay < 100)
        {
                delay++;
                Delay_us(1);
        }
        // 經過100us后,如果沒有應答脈沖,退出函數
        if (delay >= 100)//Hu200
                return 1;
        else
                delay = 0;
        // 有應答脈沖,且存在時間不超過240us
        while (!DS18B20_DQ_IN&&delay < 240)
        {
                delay++;
                Delay_us(1);
        }
        if (delay >= 240)
                return 1;
        return 0;
}

// 從DS18B20讀取1個位
u8 DS18B20_Read_Bit(void)
{
        u8 data;
        DS18B20_Mode_Out();
        DS18B20_DQ_OUT_Low; // 讀時間的起始:必須由主機產生 >1us <15us 的低電平信號
        Delay_us(2);
        DS18B20_DQ_OUT_High;
        Delay_us(12);
        DS18B20_Mode_IPU();// 設置成輸入,釋放總線,由外部上拉電阻將總線拉高
        if (DS18B20_DQ_IN)
                data = 1;
        else
                data = 0;
        Delay_us(50);
        return data;
}

// 從DS18B20讀取2個位
u8 DS18B20_Read_2Bit(void)//讀二位 子程序
{
        u8 i;
        u8 dat = 0;
        for (i = 2; i > 0; i--)
        {
                dat = dat << 1;
                DS18B20_Mode_Out();
                DS18B20_DQ_OUT_Low;
                Delay_us(2);
                DS18B20_DQ_OUT_High;
                DS18B20_Mode_IPU();
                Delay_us(12);
                if (DS18B20_DQ_IN)        dat |= 0x01;
                Delay_us(50);
        }
        return dat;
}

// 從DS18B20讀取1個字節
u8 DS18B20_Read_Byte(void)        // read one byte
{
        u8 i, j, dat;
        dat = 0;
        for (i = 0; i < 8; i++)
        {
                j = DS18B20_Read_Bit();
                dat = (dat) | (j << i);
        }
        return dat;
}

// 寫1位到DS18B20
void DS18B20_Write_Bit(u8 dat)
{
        DS18B20_Mode_Out();
        if (dat)
        {
                DS18B20_DQ_OUT_Low;// Write 1
                Delay_us(2);
                DS18B20_DQ_OUT_High;
                Delay_us(60);
        }
        else
        {
                DS18B20_DQ_OUT_Low;// Write 0
                Delay_us(60);
                DS18B20_DQ_OUT_High;
                Delay_us(2);
        }
}

// 寫1字節到DS18B20
void DS18B20_Write_Byte(u8 dat)
{
        u8 j;
        u8 testb;
        DS18B20_Mode_Out();
        for (j = 1; j <= 8; j++)
        {
                testb = dat & 0x01;
                dat = dat >> 1;
                if (testb)
                {
                        DS18B20_DQ_OUT_Low;// 寫1
                        Delay_us(10);
                        DS18B20_DQ_OUT_High;
                        Delay_us(50);
                }
                else
                {
                        DS18B20_DQ_OUT_Low;// 寫0
                        Delay_us(60);
                        DS18B20_DQ_OUT_High;// 釋放總線
                        Delay_us(2);
                }
        }
}

//初始化DS18B20的IO口,同時檢測DS的存在
u8 DS18B20_Init(void)
{
        DS18B20_GPIO_Config();
        DS18B20_Rst();
        return DS18B20_Answer_Check();
}

// 從ds18b20得到溫度值,精度:0.1C,返回溫度值(-550~1250),Temperature1返回浮點實際溫度
float DS18B20_Get_Temp(u8 i)
{
        //u8 flag;
        u8 j;//匹配的字節
        u8 TL, TH;
        short Temperature;
        float Temperature1;
        DS18B20_Rst();
        DS18B20_Answer_Check();
        DS18B20_Write_Byte(0xcc);// skip rom
        DS18B20_Write_Byte(0x44);// convert
        DS18B20_Rst();
        DS18B20_Answer_Check();

        // DS18B20_Write_Byte(0xcc);// skip rom
        //匹配ID,i為形參
        DS18B20_Write_Byte(0x55);
        for (j = 0; j < 8; j++)
        {
                DS18B20_Write_Byte(DS18B20_ID[i][j]);
        }

        DS18B20_Write_Byte(0xbe);// convert
        TL = DS18B20_Read_Byte(); // LSB   
        TH = DS18B20_Read_Byte(); // MSB  
        if (TH & 0xfc)
        {
                //flag=1;
                Temperature = (TH << 8) | TL;
                Temperature1 = (~Temperature) + 1;
                Temperature1 *= 0.0625;
        }
        else
        {
                //flag=0;
                Temperature1 = ((TH << 8) | TL)*0.0625;
        }
        return Temperature1;
}

// 自動搜索ROM
void DS18B20_Search_Rom(void)
{
        u8 k, l, chongtuwei, m, n, num;
        u8 zhan[5];
        u8 ss[64];
        u8 tempp;
        l = 0;
        num = 0;
        do
        {
                DS18B20_Rst(); //注意:復位的延時不夠
                Delay_us(480); //480、720
                DS18B20_Write_Byte(0xf0);
                for (m = 0; m < 8; m++)
                {
                        u8 s = 0;
                        for (n = 0; n < 8; n++)
                        {
                                k = DS18B20_Read_2Bit();//讀兩位數據

                                k = k & 0x03;
                                s >>= 1;
                                if (k == 0x01)//01讀到的數據為0 寫0 此位為0的器件響應
                                {
                                        DS18B20_Write_Bit(0);
                                        ss[(m * 8 + n)] = 0;
                                }
                                else if (k == 0x02)//讀到的數據為1 寫1 此位為1的器件響應
                                {
                                        s = s | 0x80;
                                        DS18B20_Write_Bit(1);
                                        ss[(m * 8 + n)] = 1;
                                }
                                else if (k == 0x00)//讀到的數據為00 有沖突位 判斷沖突位
                                {
                                        //如果沖突位大于棧頂寫0 小于棧頂寫以前數據 等于棧頂寫1
                                        chongtuwei = m * 8 + n + 1;
                                        if (chongtuwei > zhan[l])
                                        {
                                                DS18B20_Write_Bit(0);
                                                ss[(m * 8 + n)] = 0;
                                                zhan[++l] = chongtuwei;
                                        }
                                        else if (chongtuwei < zhan[l])
                                        {
                                                s = s | ((ss[(m * 8 + n)] & 0x01) << 7);
                                                DS18B20_Write_Bit(ss[(m * 8 + n)]);
                                        }
                                        else if (chongtuwei == zhan[l])
                                        {
                                                s = s | 0x80;
                                                DS18B20_Write_Bit(1);
                                                ss[(m * 8 + n)] = 1;
                                                l = l - 1;
                                        }
                                }
                                else
                                {
                                        //沒有搜索到
                                }
                        }
                        tempp = s;
                        DS18B20_ID[num][m] = tempp; // 保存搜索到的ID
                }
                num = num + 1;// 保存搜索到的個數
        } while (zhan[l] != 0 && (num < MaxSensorNum));
        DS18B20_SensorNum = num;
        //printf("DS18B20_SensorNum=%d\r\n",DS18B20_SensorNum);
}
回復

使用道具 舉報

5#
ID:196544 發表于 2017-5-5 16:50 | 只看該作者
_少年放肆的夢 發表于 2017-5-4 22:54
給你一個參考一下吧
#include "stdio.h" // printf用

謝了  但是我還沒有學到那么深
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情视频网站 | 国产 欧美 日韩 一区 | 成人在线免费观看视频 | 国产一区二区精品在线 | 亚洲精品免费在线 | 女女百合av大片一区二区三区九县 | 久久久久久久久久久蜜桃 | 国产黄色大片网站 | 精品一区二区三区在线视频 | 嫩草影院黄 | 日本精品久久 | 国产高清视频在线观看 | 一区二区av在线 | 亚洲一区二区三区 | 黄色a视频| 99精品国产一区二区三区 | 亚洲最新在线视频 | 欧洲妇女成人淫片aaa视频 | 亚洲精选一区二区 | 草比av| 国产高清亚洲 | 亚洲视频免费在线观看 | 欧美福利一区 | 一区二区国产精品 | 欧美a区| 九九av| 久久精品亚洲精品 | 亚洲一区二区三区视频免费观看 | 中文字幕亚洲国产 | 中文字幕乱码视频32 | 亚洲日韩欧美一区二区在线 | 日韩精品在线视频 | 成人做爰9片免费看网站 | 99精品国产一区二区三区 | 久久久999国产精品 中文字幕在线精品 | 日韩中文字幕视频 | 在线播放国产一区二区三区 | 香蕉久久久 | 久久久久国产一区二区三区 | 91视频播放 | 日本一区不卡 |