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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數(shù): 1893 | 評論數(shù): 5 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2019-4-22 11:06

正文摘要:

我是用DS18B20傳感器檢測溫度的,然后用數(shù)碼管把它顯示出來,但是數(shù)碼管顯示的數(shù)值一直是00000006固定不變,數(shù)碼管代碼好像也沒啥問題,讓它顯示87654321這些固定值也可以顯示出來,請大佬幫幫忙

回復(fù)

ID:382454 發(fā)表于 2019-4-23 15:24
初學(xué)不要直接去寫,在開發(fā)板里小小修改一下,等熟透了再去寫,這樣才是對的。
ID:164602 發(fā)表于 2019-4-23 08:32
直接貼程序不好嗎?還方便一些嘛。
給你一個例程:
main.c

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

#define SMG        P0//數(shù)碼管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};//要顯示的數(shù)字

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

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

}

void DISPLAY()
{
        LSC=1;LSB=0;LSA=0;//溫度正負(fù)號
        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;//溫度的個位帶小數(shù)點
        SMG=XS[2];
        Delay1ms(1);
        SMG=0x00;

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

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

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

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做出反應(yīng)會將在15us~60us后總線拉低
        i=0;
        while(DSPORT)//等待DS18B20拉低總線
        {
                i++;
                if(i>1000)//等待>1MS
                {
                        return 0;//初始化失敗
                }
        }
        return 1;//初始化成功
}

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

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

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

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

int Ds18b20ReadTemp()//讀取溫度
{
        int temp=0;
        unsigned char tmh,tml;
        Ds18b20ChangTemp();//先寫入轉(zhuǎn)換命令
        Ds18b20ReadTempCom();//然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
        tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節(jié)
        tmh=Ds18b20ReadByte();//再讀高字節(jié)
        temp=tmh;//把兩次得到的8位數(shù)據(jù),合并為16位實際數(shù)據(jù)
        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

程序適用的電路:






ID:293247 發(fā)表于 2019-4-22 21:01
如果你用protues上的ds18b20,你檢查的ds18b20的時序,
之前我也存在這個問題
ID:314000 發(fā)表于 2019-4-22 17:10
檢查下單片機讀DS18B20傳感器的時序機延時是否有問題
ID:432823 發(fā)表于 2019-4-22 15:01
應(yīng)與顯示無關(guān),與DS18b20讀出數(shù)據(jù)有關(guān),可能沒有讀出,tp=0是初始值。

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91视频中文| 欧美激情欧美激情在线五月 | 午夜资源 | 久久久久免费精品国产小说色大师 | 久草a√| 日韩欧美精品一区 | 四虎影院在线播放 | 日韩精品一区二区三区在线观看 | 国产99久久 | 免费av观看| 久久久久国产精品一区二区 | www中文字幕 | 国产精品久久久久久久久久软件 | 日韩综合网| 99中文字幕| 亚洲在线免费观看 | 中文字幕精品一区二区三区精品 | 日本xx视频免费观看 | 国产麻豆乱码精品一区二区三区 | 国产99久久久国产精品下药 | 国产精品国产精品国产专区不卡 | 成人免费视频网站在线观看 | www.亚洲一区| 国产色片 | 亚洲视频一区二区三区 | 中文无吗| 日韩精品视频一区二区三区 | 欧洲亚洲一区二区三区 | 国产永久免费 | 国产激情一区二区三区 | 欧美一级欧美三级在线观看 | 成人福利视频 | 91porn成人精品| 国产午夜久久久 | 韩国精品一区二区三区 | 免费观看一级毛片 | 国产精品亚洲一区二区三区在线 | 99热在线播放 | 亚洲成人一区 | 久久精品国产一区二区电影 | 羞羞的视频免费观看 |