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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1780|回復(fù): 7
收起左側(cè)

求助各位大佬,為啥單片機(jī)仿真中ds18b20讀不出來(lái)溫度

[復(fù)制鏈接]
ID:1083784 發(fā)表于 2023-6-13 13:54 | 顯示全部樓層 |閱讀模式
這是全部代碼,請(qǐng)求各位大佬幫忙看一下哪里出問(wèn)題了非常感謝各位

代碼運(yùn)行后有三個(gè)警告
R)]BF~YRV(UE)~QIZTN[ISY.png

單片機(jī)源程序如下:
#include <reg52.h>                        // 包含頭文件
#include <intrins.h>
#include<math.h>
#define uchar unsigned char        
#define uint  unsigned int        

sbit DQ = P3^7;                                                // DS18B20傳感器的引腳定義

sbit Buzzer  = P1^0;                        // 蜂鳴器引腳
sbit JdqLow  = P2^0;                        // 溫度過(guò)低繼電器控制(加熱)
sbit JdqHig  = P2^1;                        // 溫度過(guò)高繼電器控制(降溫)
sbit LedLow  = P2^2;                        // 溫度低指示燈
sbit LedHig  = P2^3;                        // 溫度高指示燈
sbit key1  = P3^4;                        // 設(shè)置按鍵
sbit key3 = P3^6;                        // 減按鍵
sbit key2   = P3^5;                        // 加按鍵
sbit RS = P2^6;//1602數(shù)據(jù)/命令選擇端(H:數(shù)據(jù)寄存器L:指令寄存器)
sbit RW = P2^5;//1602讀/寫(xiě)選擇端
sbit E  = P2^4;//1602使能信號(hào)





/******************************************************************/
/*                    全局變量                                    */
/******************************************************************/
int temp;//測(cè)得溫度
char temp_max=40,temp_min=10;//設(shè)定的溫度
char TempH,TempL;
char control;
uchar flag_get,num=0;
uchar code tab[]={'0','1','2','3','4','5','6','7','8','9'};//液晶顯示
uchar tab1[10]="zcjrjw";//液晶第二行顯示內(nèi)容
uchar mark[16];
uchar  str[8];
/*********************************************************/
// 延時(shí)函數(shù),
/*********************************************************/
void delay1(uint i)//短延時(shí)函數(shù)
{
         while(i--);
}
void delay(uint z) //長(zhǎng)延時(shí)函數(shù)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/*********************************************************/
// 延時(shí)15微秒
/*********************************************************/
void Delay15us(void)
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}




/*********************************************************/
// 定時(shí)器初始化
/*********************************************************/
void Init_DS18B20(void)
{
        uchar x=0;
        DQ = 1;    //拉高總線,等待
         delay1(8);
         DQ = 0;    //單片機(jī)將DQ拉低
         delay1(80); //精確延時(shí) 大于 480us
         DQ = 1;    //拉高總線,等待
         delay1(10);
         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
         delay1(10);
}



/******************************************************************/
/*                 DS18B20寫(xiě)一個(gè)字節(jié)                              */
/******************************************************************/
void WriteOneChar(uchar dat) //DS18B20寫(xiě)一個(gè)字節(jié)
{
         uchar i=0;
         for (i=8; i>0; i--)
         {
                  DQ = 0;
                  DQ = dat&0x01;//取最低位
                  delay1(5);
                  DQ = 1;
                  dat>>=1;//左移
         }
        delay1(5);
}


/******************************************************************/
/*                    DS18B20讀一個(gè)字節(jié)                           */
/******************************************************************/
uchar ReadOneChar(void)        // DS18B20讀一個(gè)字節(jié)
{
        uchar i=0;
        uchar dat = 0;
        for (i=8;i>0;i--)
         {
                  DQ = 0; // 給脈沖信號(hào)
                  dat>>=1;
                  DQ = 1; // 給脈沖信號(hào),主機(jī)在讀時(shí)隙期間必須釋放總線
                  if(DQ)
                   dat|=0x80;
                  delay1(5);
         }
         return(dat);
}


/******************************************************************/
/*                   DS18B20讀取溫度                              */
/******************************************************************/
uint ReadTemperature(void) //DS18B20讀取溫度
{
        uchar a=0;
        uint b=0;
        uint t=0;
        Init_DS18B20();//DS18B20初始化
        WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
        delay1(200);       //延時(shí)以求信號(hào)的穩(wěn)定
        Init_DS18B20();    //DS18B20再次初始化
        WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
        a=ReadOneChar();   //低位
        b=ReadOneChar();   //高位
        b<<=8;  //b左移8位
        t=a+b;  //把a(bǔ)與b結(jié)合,放在16位的t中   此處兩行代碼也可用t=((b*256)+1)替代 原理相同
        return(t);
}

/******************************************************************/
/*                   LCD1602寫(xiě)命令操作                            */
/******************************************************************/
void WriteCommand(uchar com)
{
        delay(5);//操作前短暫延時(shí),保證信號(hào)穩(wěn)定
        E=0;
        RS=0;
        RW=0;

        P0=com;
        E=1;
        delay(5);
        E=0;
}
/******************************************************************/
/*                   LCD1602寫(xiě)數(shù)據(jù)操作                            */
/******************************************************************/
void WriteData(uchar dat)
{
        delay(5);  //操作前短暫延時(shí),保證信號(hào)穩(wěn)定
        E=0;
        RS=1;
        RW=0;

        P0=dat;
        E=1;
        delay(5);
        E=0;
}
/******************************************************************/
/*                   LCD1602初始化程序                            */
/******************************************************************/
void InitLcd()
{
//        uchar i;
        delay(15);
        WriteCommand(0x38); //display mode
        WriteCommand(0x06); //顯示光標(biāo)移動(dòng)位置
        WriteCommand(0x0c); //顯示開(kāi)及光標(biāo)設(shè)置
        WriteCommand(0x01); //顯示清屏
}
/******************************************************************/
/*                   顯示測(cè)得的溫度                               */
/******************************************************************/
void handle_T()
{

        uchar i;
        str[0]=0x20;//顯示為空
        str[1]=tab[TempH/100]; //百位溫度
           str[2]=tab[(TempH%100)/10]; //十位溫度
           str[3]=tab[(TempH%100)%10]; //個(gè)位溫度,帶小數(shù)點(diǎn)
           str[5]=tab[TempL];
        str[4]='.';
    str[6]=0xdf;
    str[7]='C';
        
    mark[1]=0x20;
        mark[2]=tab[1]; //百位溫度
           mark[3]=tab[0]; //十位溫度
        mark[4]=0x20;
    mark[5]='-'; //百位溫度
    mark[6]=0x20;
           mark[7]=tab[4]; //十位溫度
        mark[8]=tab[0]; //百位溫度
        mark[9]=0x20;
        mark[10]=0x20;        
           mark[11]=tab1[control/10]; //十位溫度11
           mark[12]=tab1[control%10]; //十位溫度

          if(flag_get==1)       //定時(shí)讀取當(dāng)前溫度
    {
                  flag_get=0;       //清標(biāo)志位
                  temp=ReadTemperature();//讀取溫度值
                  if(temp&0x8000)
        {
                     str[0]=0xb0;//負(fù)號(hào)標(biāo)志
                     temp=~temp;  // 取反加1
                         temp +=1;
                 }

        TempH=temp>>4;        //由權(quán)重表知移4位就是整數(shù)位
                  TempL=temp&0x0F;
                  TempL=TempL*6/10;//小數(shù)近似處理

               
    }
        
          WriteCommand(0x80+0x40);//將光標(biāo)移到第二行
        for(i=0;i<16;i++)//顯示初始化內(nèi)容
        {               
                WriteData(mark[ i]);
                delay(10);
        }
      WriteCommand(0x80+0x04);//光標(biāo)指向第一行第一個(gè)字符
        for(i=0;i<8;i++)// 顯示
        {
                WriteData(str[ i]);
                delay(10);
        }

               
}
void display_range(uchar add,int t)
{
        uchar i;
        if(t<0)
        {
                str[0]=0xb0;//負(fù)號(hào)標(biāo)志
        }
        else
    {
        str[0]=tab[abs(t)/100]; //百位溫度
               str[1]=tab[(abs(t)%100)/10]; //十位溫度
               str[2]=tab[(abs(t)%100)%10]; //個(gè)位溫度
            WriteCommand(0x80+0x40+add);
    }
        
        for(i=0;i<3;i++)
        {
                WriteData(str[ i]);
                delay(5);
        }
}
/*********************************************************/
// 報(bào)警判斷
/*********************************************************/
void alarm(int dat)
{
        if(TempL<temp_min)                                // 判斷溫度是否過(guò)低
        {
                LedLow=0;                                                        // 溫度低指示燈亮
                LedHig=1;                                                        // 溫度高指示燈滅
                JdqLow=0;                                                        // 溫度過(guò)低的繼電器閉合(開(kāi)始加熱)
                JdqHig=1;                                                        // 溫度過(guò)高的繼電器斷開(kāi)(停止降溫)
                Buzzer=0;                                                        // 蜂鳴器報(bào)警
        }
        else if(TempH>temp_max)                // 判斷溫度是否過(guò)高
        {
                LedLow=1;                                                        // 溫度低指示燈滅
                LedHig=0;                                                        // 溫度高指示燈亮
                JdqLow=1;                                                        // 溫度過(guò)低的繼電器斷開(kāi)(停止加熱)
                JdqHig=0;                                                        // 溫度過(guò)高的繼電器閉合(開(kāi)始降溫)
                Buzzer=0;                                                        // 蜂鳴器報(bào)警
        }
        else                                                                                // 溫度正常
        {
                LedLow=1;                                                        // 溫度低指示燈滅
                LedHig=1;                                                        // 溫度高指示燈滅
                JdqLow=1;                                                        // 溫度過(guò)低的繼電器斷開(kāi)(停止加熱)
                JdqHig=1;                                                        // 溫度過(guò)高的繼電器斷開(kāi)(停止降溫)
                Buzzer=1;                                                        // 蜂鳴器停止報(bào)警
        }
}


/******************************************************************/
/*              獨(dú)立鍵盤(pán)掃描函數(shù)并顯示設(shè)定的溫度                  */
/******************************************************************/
void keyscan()  
{        

        uchar flag1=0,flag2=0;//有按鍵按下標(biāo)記
        P3=0xff;//拉高P3口,以讀取P3口的值
        
        if(key1==0) //兩個(gè)按鍵控制最高/最低溫度的加減 按住key1時(shí)通過(guò)其他2個(gè)鍵控制最高溫度的加減
        {
                delay(5);
                if(key2==0)//最高溫加
                {
                        delay(5);//延時(shí)消抖
                        if(key2==0)
                        {
                                temp_max++;
                                if(temp_max>=85)
                                        temp_max=85;
                        }
                        while(!key2);//松手檢測(cè)
                        flag1=1;
                }
                if(key3==0)//最高溫減
                {
                        delay(5);
                        if(key3==0)
                        {
                                temp_max--;
                                if(temp_max<=temp_min)
                                        temp_max=temp_min;
                        }
                        while(!key3);
                        flag1=1;
                }
        }
        
        if(key1==1)  //松開(kāi)key1時(shí)通過(guò)其他2個(gè)鍵控制最低溫度的加減
        {
                delay(5);
                if(key2==0)//最低溫加
                {
                        delay(5);//延時(shí)消抖
                        if(key2==0)
                        {
                                temp_min++;
                                if(temp_min>=temp_max)
                                        temp_min=temp_max;
                        }
                        while(!key2);//松手檢測(cè)
                        flag2=1;
                }
                if(key3==0)//最低溫減
                {
                        delay(5);
                        if(key3==0)
                        {
                                temp_min--;
                                if(temp_min<=-10)
                                        temp_min=-10;
                        }
                        while(!key3);
                        flag2=1;
                }
        }

        if(flag1)//如有設(shè)置最高溫度的鍵按下,更新設(shè)定的溫度
        {
                flag1=0;// 清標(biāo)記
                display_range(0x0d,temp_max);
        }
        if(flag2)//如有設(shè)置最低溫度的鍵按下,更新設(shè)定的溫度
        {
                flag2=0;// 清標(biāo)記
                display_range(0x04,temp_min);
        }
               
}

/****************************************************************/
/*                    主函數(shù)                                    */
/******************************************************************/
void main()
{        
        TMOD|=0x01;//定時(shí)器設(shè)置
        TH0=0xEF;//裝初始值
        TL0=0xF0;   
        EA=1;// 開(kāi)總中斷
        ET0=1;//允許定時(shí)器0中斷
        TR0=1;//開(kāi)定時(shí)器0中斷
        InitLcd();//lcd1602初始化
        flag_get=1;
        while(1)
        {
                handle_T();// 處理溫度:獲得、顯示、報(bào)警
                keyscan();  //獨(dú)立按鍵掃描
          }
}

/******************************************************************/
/*    定時(shí)0中斷處理程序,用于溫度檢測(cè)間隔,大約1秒測(cè)一次溫度      */
/******************************************************************/
void timer0(void) interrupt 1 using 1
{
        TH0=0xEF;//定時(shí)器重裝值
        TL0=0xF0;
        num++;
        if (num==50)
    {
                num=0;
                  flag_get=1;//標(biāo)志位有效,開(kāi)始測(cè)溫
        }
}

回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2023-6-13 16:11 | 顯示全部樓層
答案很簡(jiǎn)單,程序是抄來(lái)的。
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2023-6-13 16:12 | 顯示全部樓層
我試沒(méi)有問(wèn)題,是否仿真軟件ds18b20驅(qū)動(dòng)有問(wèn)題,仿真軟件有警告嗎。
回復(fù)

使用道具 舉報(bào)

ID:1083784 發(fā)表于 2023-6-13 19:33 | 顯示全部樓層
xuyaqi 發(fā)表于 2023-6-13 16:12
我試沒(méi)有問(wèn)題,是否仿真軟件ds18b20驅(qū)動(dòng)有問(wèn)題,仿真軟件有警告嗎。

沒(méi)警告,大佬的仿真軟件版本是多少,會(huì)不會(huì)是我的8.9版本低了
回復(fù)

使用道具 舉報(bào)

ID:1083784 發(fā)表于 2023-6-13 19:34 | 顯示全部樓層
yzwzfyz 發(fā)表于 2023-6-13 16:11
答案很簡(jiǎn)單,程序是抄來(lái)的。

是的,LCD和顯示是直接用我同學(xué)的
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2023-6-13 20:08 | 顯示全部樓層
一個(gè)小小小白07 發(fā)表于 2023-6-13 19:33
沒(méi)警告,大佬的仿真軟件版本是多少,會(huì)不會(huì)是我的8.9版本低了

我是8.15版
回復(fù)

使用道具 舉報(bào)

ID:1083784 發(fā)表于 2023-6-13 20:19 | 顯示全部樓層

好的,謝謝大佬
回復(fù)

使用道具 舉報(bào)

ID:86450 發(fā)表于 2023-6-13 22:50 | 顯示全部樓層
警告 一般不會(huì)出問(wèn)題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚州视频在线 | 久久久久国 | 91亚洲欧美 | 久久久精品一区 | 超碰天天 | 日韩一区二区在线视频 | 九九热视频这里只有精品 | 欧美专区在线观看 | 91精品国产92| 久久久久久久久久久久一区二区 | 亚洲在线| 色网在线观看 | 国产成人av电影 | 国产精品自产拍在线观看蜜 | 亚洲永久 | 成人小视频在线免费观看 | 一级毛片成人免费看a | www.性色| 超碰97免费在线 | 国产不卡在线观看 | 天天综合成人网 | 国产精品99久久久久久大便 | 国产精品自产拍 | 日韩综合一区 | 91精品在线看 | 91偷拍精品一区二区三区 | 日韩第一区 | 天堂久久久久久久 | 亚洲天堂影院 | 欧美日韩久久 | 免费在线观看一区二区 | 人妖videosex高潮另类 | 观看av| 亚洲国产精品久久久久秋霞不卡 | 国产成人精品在线播放 | 日日操夜夜操视频 | 国产一区二区三区视频 | 91综合网 | 欧美亚洲在线视频 | 久久久精| 黄色一级大片在线免费看产 |