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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1816|回復: 5
收起左側

大佬幫我看下單片機DS18b20程序哪里有錯誤?

[復制鏈接]
ID:518415 發表于 2019-4-22 11:06 | 顯示全部樓層 |閱讀模式
我是用DS18B20傳感器檢測溫度的,然后用數碼管把它顯示出來,但是數碼管顯示的數值一直是00000006固定不變,數碼管代碼好像也沒啥問題,讓它顯示87654321這些固定值也可以顯示出來,請大佬幫幫忙

z3.jpg
z2.jpg
z1.jpg
回復

使用道具 舉報

ID:432823 發表于 2019-4-22 15:01 | 顯示全部樓層
應與顯示無關,與DS18b20讀出數據有關,可能沒有讀出,tp=0是初始值。
回復

使用道具 舉報

ID:314000 發表于 2019-4-22 17:10 | 顯示全部樓層
檢查下單片機讀DS18B20傳感器的時序機延時是否有問題
回復

使用道具 舉報

ID:293247 發表于 2019-4-22 21:01 | 顯示全部樓層
如果你用protues上的ds18b20,你檢查的ds18b20的時序,
之前我也存在這個問題
回復

使用道具 舉報

ID:164602 發表于 2019-4-23 08:32 | 顯示全部樓層
直接貼程序不好嗎?還方便一些嘛。
給你一個例程:
main.c

#include<reg51.h>
#include"DS18B20.h"

#define SMG        P0//數碼管IO

sbit LSA=P2^2;//138譯碼器
sbit LSB=P2^3;
sbit LSC=P2^4;

unsigned char code ZF[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//要顯示的數字

unsigned int XS[5]={0x3f,0x3f,0x3f,0x3f,0x3f};//顯示緩存

void FZ(int temp)//給數碼管顯示緩存放入數據
{
        float tp;//要進行帶符號的小數運算,必須用有符號實型數據,32位  
        if(temp< 0)//當溫度值為負數
          {
        XS[0] = 0x40;//顯示負號-
                temp=temp-1;//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數
                                                                //轉換為整型的時候把小數點后面的數自動去掉,不管是否
                                                                //大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
                                                                //算加上.5,還是在小數點后面。
          }
        else
          {       
        XS[0] = 0x70;//正數就顯示┣               
                tp=temp;
                temp=tp*0.0625*100+0.5;       
        }
        XS[1] = ZF[temp % 10000 / 1000];
        XS[2] = ZF[temp % 1000 / 100] + 0x80;//顯示小數點
        XS[3] = ZF[temp % 100 / 10];
        XS[4] = ZF[temp % 10 / 1];

}

void DISPLAY()
{
        LSC=1;LSB=0;LSA=0;//溫度正負號
        SMG=XS[0];
        Delay1ms(1);
        SMG=0x00;

        LSC=0;LSB=1;LSA=1;//溫度的十位
        SMG=XS[1];
        Delay1ms(1);
        SMG=0x00;

        LSC=0;LSB=1;LSA=0;//溫度的個位帶小數點
        SMG=XS[2];
        Delay1ms(1);
        SMG=0x00;

        LSC=0;LSB=0;LSA=1;//溫度的小數點后第一位
        SMG=XS[3];
        Delay1ms(1);
        SMG=0x00;

        LSC=0;LSB=0;LSA=0;//溫度的小數點后第二位
        SMG=XS[4];
        Delay1ms(1);
        SMG=0x00;
}

void main()
{
        while(1)
        {
                FZ(Ds18b20ReadTemp());//讀取溫度值并對顯示緩存賦值
                DISPLAY();//數碼管顯示
        }
}

DS18B20.c
#include"DS18B20.h"

void Delay1ms(unsigned int y)//延時yms
{
        unsigned int x;
        for(y;y>0;y--)
                for(x=110;x>0;x--);
}

unsigned char Ds18b20Init()//初始化
{
        unsigned int i;
        DSPORT=0;//將總線拉低480us~960us
        i=70;       
        while(i--);//延時642us
        DSPORT=1;//然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
        i=0;
        while(DSPORT)//等待DS18B20拉低總線
        {
                i++;
                if(i>1000)//等待>1MS
                {
                        return 0;//初始化失敗
                }
        }
        return 1;//初始化成功
}

void Ds18b20WriteByte(unsigned char dat)//向18B20寫入一個字節
{
        unsigned int i,j;
        for(j=0;j<8;j++)
        {
                DSPORT=0;//每寫入一位數據之前先把總線拉低1us
                i++;
                DSPORT=dat&0x01;//然后寫入一個數據,從最低位開始
                i=6;
                while(i--);//延時68us,持續時間最少60us
                DSPORT=1;//然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
                dat>>=1;
        }
}

unsigned char Ds18b20ReadByte()//從DS18B20讀取一個字節
{
        unsigned char byte,bi;
        unsigned int i,j;
        for(j=8;j>0;j--)
        {
                DSPORT=0;//先將總線拉低1us
                i++;
                DSPORT=1;//然后釋放總線
                i++;
                i++;//延時6us等待數據穩定
                bi=DSPORT;//讀取數據,從最低位開始讀取
                byte=(byte>>1)|(bi<<7);                                                  
                i=4;//讀取完之后等待48us再接著讀取下一個數
                while(i--);
        }
        return byte;
}

void  Ds18b20ChangTemp()//向DS18B20發送溫度轉換命令
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);//跳過ROM操作命令                 
        Ds18b20WriteByte(0x44);//溫度轉換命令
}

void  Ds18b20ReadTempCom()//發送讀取溫度命令
{       
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);//跳過ROM操作命令
        Ds18b20WriteByte(0xbe);//發送讀取溫度命令
}

int Ds18b20ReadTemp()//讀取溫度
{
        int temp=0;
        unsigned char tmh,tml;
        Ds18b20ChangTemp();//先寫入轉換命令
        Ds18b20ReadTempCom();//然后等待轉換完后發送讀取溫度命令
        tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節
        tmh=Ds18b20ReadByte();//再讀高字節
        temp=tmh;//把兩次得到的8位數據,合并為16位實際數據
        temp<<=8;
        temp|=tml;
        return temp;//溫度的英文單詞temperature
}

DS18B20.h
#ifndef __TEMP_H_
#define __TEMP_H_

#include<reg51.h>

sbit DSPORT=P3^7;

void Delay1ms(unsigned int );
unsigned char Ds18b20Init();
void Ds18b20WriteByte(unsigned char com);
unsigned char Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();

#endif

程序適用的電路:
1.jpg

1.jpg

1.jpg

回復

使用道具 舉報

ID:382454 發表于 2019-4-23 15:24 | 顯示全部樓層
初學不要直接去寫,在開發板里小小修改一下,等熟透了再去寫,這樣才是對的。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区在线 | 国产成人精品一区二区三区在线 | 91深夜福利视频 | 一级毛片成人免费看a | 亚洲精品视频免费观看 | 亚洲一区二区三区四区视频 | 久久国产精品一区二区 | 亚洲欧美日韩在线一区二区 | 国产日韩欧美 | 成人免费视频网站在线看 | 国产色婷婷| 成人日b视频 | 一级毛片在线看 | 成人国产在线视频 | 91麻豆精品国产91久久久久久 | 欧美一级免费看 | 国产sm主人调教女m视频 | 日日操日日干 | 亚洲精品一区二区三区中文字幕 | 91 在线| 中文字幕久久精品 | 中文字幕高清 | 国产日韩欧美在线观看 | 精品亚洲永久免费精品 | 日韩欧美在线一区 | 久久久高清| 日韩欧美在线观看 | 天天爽夜夜爽精品视频婷婷 | 午夜网站视频 | 天天久久| 在线观看成人免费视频 | 国产综合久久 | 午夜免费精品视频 | 99在线资源| 操久久| 久草.com | h视频在线播放 | 国产在线麻豆精品入口 | 国产精品视频免费观看 | 在线国产视频 | 一级欧美 |