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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于DS18B20問題

[復制鏈接]
跳轉到指定樓層
樓主

這是我開發板DS18B20的原理圖,可以接兩路DS18B20,我現在只插了一個,另一個空著
現在把這個DS12B20空著對寫程序有影響嗎?搞一個程序發現怎么搞都不對
程序如下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

void Init_LCD1602(void);
void WriteCommandLCD(uchar Cmd);
void WriteDataLCD(uchar Data);
void delayms(uint x);

sbit DQ = P3^2;
sbit Buzz = P1^6;

bit status;

//聲明待顯示內容
uchar data Word1[] = {"DS18B20 IS OK!!!"};
uchar data Word2[] = {"TEMP:    .    "};

uchar data Word3[] = {"DS18B20 IS FAULT"};
uchar data Word4[] = {"PLEASE CHECK!!! "};

uchar Temp_Value[] = {0x00,0x00};
uchar Display_Digit[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//溫度字符數組
uchar code CGRAM_CODE[] = {0x08,0x14,0x08,0x00,0x00,0x00,0x00,0x00};

//延時函數_us級別
void Delay(uint x)
{
        while(--x);         
}

//LCD1602自定義符號函數
void WriteCGRAM(void)
{
        uchar j;
        WriteCommandLCD(0x40);                  //寫CGRAM
        for(j = 0; j < 8; j ++)
        {
                WriteDataLCD(CGRAM_CODE[j]);
        }
}

//初始化DS18B20函數
bit Init_DS18B20(void)
{
        DQ = 1; Delay(1);
        DQ = 0; Delay(60);
        DQ = 1; Delay(5);
        status = DQ;
        while(!DQ);                 //等待DQ變為高電平
        return status;
}

//寫字節函數
void WriteOneByte(uchar dat)
{
        uchar i;
        DQ = 1; Delay(1);
        for(i = 0; i < 8; i ++)
        {
                DQ = 0; Delay(1);                //1101 1101 & 0x01  
                DQ = dat & 0x01;
                Delay(5);                                //DS18B20采樣DQ線
                DQ = 1;
                dat >>= 1;
        }               
}

//讀字節函數
uchar ReadOneByte(void)
{
        uchar i, dat = 0x00;
        DQ = 1; Delay(1);
        for(i = 0; i < 8; i ++)
        {
                DQ = 0; _nop_();
                dat >>= 1;                        //高位放入0
                DQ = 1; _nop_();
                if(DQ)
                {
                        dat |= 0x80;    //高位放入1
                }
                Delay(8);
                DQ = 1;
        }
        return dat;        
}

//讀取溫度值函數
void Read_Temperature(void)
{
        Init_DS18B20();
        WriteOneByte(0xCC);
        WriteOneByte(0x44);
        
        Init_DS18B20();
        WriteOneByte(0xCC);
        WriteOneByte(0xBE);
        Temp_Value[0] = ReadOneByte();         //溫度低8位
        Temp_Value[1] = ReadOneByte();         //溫度高8位
}

//LCD1602顯示當前溫度值函數
void Display_Temperature(void)
{
        uchar i,ng = 0;
        uint Temp;
        ulong Current;
        
        if((Temp_Value[1] & 0xF8) == 0xF8)
        {
                if(Temp_Value[0] == 0)  //有進制
                {
                        Temp_Value[1] = ~Temp_Value[1] + 1;        
                }

                else                                   //沒有進制
                {
                        Temp_Value[1] = ~Temp_Value[1];
                        Temp_Value[0] = ~Temp_Value[0] + 1;        
                }
                ng = 1;                        
        }
         
        Temp = ((uint)Temp_Value[1]) << 8;         //強制性轉換成16位,并且移至高8位
        Current = (Temp + (uint)Temp_Value[0]) * 0.0625 * 10000; //1250000
        
        Display_Digit[6] = Current / 1000000;          //百位
        Display_Digit[5] = Current % 1000000 / 100000; //十位
        Display_Digit[4] = Current % 100000 / 10000;   //個位

        Display_Digit[3] = Current % 10000 / 1000;     //1位小數點
        Display_Digit[2] = Current % 1000 / 100;       //2位小數點
        Display_Digit[1] = Current % 100 / 10;         //3位小數點
        Display_Digit[0] = Current % 10;               //4位小數點
        
        //顯示在LCD上的位置
        Word2[6] = Display_Digit[6] + '0';                     //百位
        Word2[7] = Display_Digit[5] + '0';                     //十位
        Word2[8] = Display_Digit[4] + '0';                     //個位

        Word2[10] = Display_Digit[3] + '0';                     //1位小數點
        Word2[11] = Display_Digit[2] + '0';                     //2位小數點
        Word2[12] = Display_Digit[1] + '0';                     //3位小數點
        Word2[13] = Display_Digit[0] + '0';                     //4位小數點

        if(Display_Digit[6] == 0) Word2[6] = ' ';           //百位為0不顯示
        if(Display_Digit[6] == 0 && Display_Digit[5] == 0) Word2[7] = ' ';//十位為0且百位為0,十位不顯示

        if(ng) //讓“-”顯示在適當位置  -15  -8
        {
                if(Word2[7] == ' ')
                        Word2[7] = '-';
                else
                Word2[6] = '-';
        }

        //在第一行里顯示標題
        WriteCommandLCD(0x80);
        for(i = 0; i < 16; i ++)
        {
                WriteDataLCD(Word1);
        }

        //在第二行顯示當前溫度值
        WriteCommandLCD(0xC0);
        for(i = 0; i < 14; i ++)
        {
                WriteDataLCD(Word2);        // 125.0000℃
        }

        //顯示溫度符號
        WriteCGRAM();
        WriteCommandLCD(0xCE); WriteDataLCD(0x00); //顯示°符號
        WriteCommandLCD(0xCF); WriteDataLCD('C');  //顯示C符號
}

//顯示故障信息函數
void Display_Fault(void)
{
        uchar i;
        WriteCommandLCD(0x80);
        for(i = 0; i < 16; i ++)
        {
                WriteDataLCD(Word3);
        }
        
        WriteCommandLCD(0xC0);
        for(i = 0; i < 16; i ++)
        {
                WriteDataLCD(Word4);
        }        
}

//蜂鳴器發音函數
void Pulse_Buzz(void)
{
        uint i;
        for(i = 0; i < 100; i ++)
        {
                Buzz = ~Buzz;
                delayms(1);
        }
        Buzz = 1;
        delayms(80);
}

//主函數
void main(void)
{
        Init_LCD1602();
        Init_DS18B20();
        while(1)
        {
                if(status == 0)
                {
                        Read_Temperature();
                        Display_Temperature();        
                }
               
                else
                {
                        Init_DS18B20();
                        Display_Fault();
                        Pulse_Buzz();               
                }               
        }
}

還有一個1602.c的文件就不發了吧,免得大家看著暈
這個程序的主要功能是  先開機檢測 DS18B20是否能初始化,如果能,則1602第一行 顯示DS18B20 IS OK!!!,第二行顯示溫度,檢測的一句是 bit Init_DS18B20(void) 函數的返回值是否為0,0表示正常
如果DS18B20不能初始化則顯示DS18B20 IS FAULT   PLEASE CHECK!!!


這個程序應該沒問題別人用普通開發板只有一路DS18B20的好用,到我這里就不好用了,求大神告訴為什么

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

使用道具 舉報

沙發
ID:52767 發表于 2013-8-31 08:54 | 只看該作者
沒人嗎  來人啊
回復

使用道具 舉報

板凳
ID:52286 發表于 2013-10-14 00:33 | 只看該作者
支持支持、、
回復

使用道具 舉報

地板
ID:34763 發表于 2014-3-26 17:09 | 只看該作者
非常好的學習資料
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎海外 | 亚洲视频在线观看 | 精品自拍视频在线观看 | 国产欧美在线观看 | 凹凸日日摸日日碰夜夜 | 91亚洲精品久久久电影 | 欧美一区二区三区 | 午夜成人免费视频 | 99视频在线看| 九九九视频在线观看 | 91伦理片| 国产最新网址 | 91美女视频| 国产日韩精品一区 | 国产探花 | 精品福利视频一区二区三区 | 浴室洗澡偷拍一区二区 | 亚洲网站在线播放 | 91在线精品一区二区 | 久久久久国产 | 一区二区三区四区不卡 | 久久综合欧美 | 久久久久国产一区二区三区四区 | 黄色片网站在线观看 | 亚洲欧美另类在线观看 | 国产免费一区二区 | 亚洲三区视频 | 一级毛片在线播放 | 成人性视频在线播放 | 福利视频大全 | 久久伊人精品 | 91精品国产美女在线观看 | 中文字幕日韩一区 | 成人av电影在线观看 | 日韩av手机在线观看 | 成人在线免费电影 | 亚洲天堂日韩精品 | 99久久精品免费视频 | 欧美国产日韩一区二区三区 | 91中文视频 | 夜夜摸天天操 |