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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc89c52單片機ds18b20傳感器,仿真能夠獲取溫度,但是實物卻是0

[復制鏈接]
跳轉到指定樓層
樓主
stc89c52單片機ds18b20傳感器,仿真能夠獲取溫度,但是實物卻是0,測試過傳感器沒有問題。

溫度獲取代碼:
/*溫度函數*/
void delay_18B20(unsigned int i)                                                //延時1微秒
{
   while(i--);
}

/*ds1820復位*/
void ds1820rst(void)
{
        unsigned char x=0;
        DQ = 1;                                                                                  //DQ復位
        delay_18B20(40);                                                                         //延時
        DQ = 0;                                                                                  //DQ拉低
        delay_18B20(100);                                                                         //精確延時大于480us
        DQ = 1;                                                                                  //拉高
        delay_18B20(40);
}

/*讀數據*/
uchar ds1820rd(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {   
                DQ = 0;                                                                                 //給脈沖信號
                dat>>=1;
                DQ = 1;                                                                                 //給脈沖信號
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
        }
   return(dat);
}

/*寫數據*/
void ds1820wr(uchar wdata)
{
        unsigned char i=0;
   for (i=8; i>0; i--)
   {
                DQ = 0;
                DQ = wdata&0x01;
                delay_18B20(10);
                DQ = 1;
                wdata>>=1;
   }
}

/*讀取溫度值并轉換*/
unsigned int get_temp(void)
{
        unsigned int tvalue=0;
        uchar a,b;
        ds1820rst();
        delay_18B20(1);   
        ds1820wr(0xcc);                                                                                //跳過讀序列號/
        ds1820wr(0x44);
        delay_18B20(1);                                                                                //啟動溫度轉換/
        ds1820rst();   
        ds1820wr(0xcc);                                                                                //跳過讀序列號/
        ds1820wr(0xbe);                                                                                //讀取溫度/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
    if(tvalue<0x0fff)  ;                                                                // tflag=0;
    else  tvalue=0;                                                                                // {tvalue=~tvalue+1;tflag=1;}
        tvalue=tvalue*(0.625);                                                                //溫度值擴大10倍,精確到1位小數
        return(tvalue);
}

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

使用道具 舉報

沙發
ID:1076813 發表于 2023-5-11 14:51 | 只看該作者
連接單片機sbit DQ=P3^1;
回復

使用道具 舉報

板凳
ID:161164 發表于 2023-5-11 14:57 | 只看該作者
30塊包郵的邏輯分析儀,你值得擁有
回復

使用道具 舉報

地板
ID:96682 發表于 2023-5-11 16:17 來自觸屏版 | 只看該作者
仿真≠實物,只有軟硬件完美結合才會沒問題
回復

使用道具 舉報

5#
ID:384109 發表于 2023-5-11 21:56 | 只看該作者
代碼有問題,確定這個代碼在仿真里能用??
回復

使用道具 舉報

6#
ID:213173 發表于 2023-5-12 11:33 | 只看該作者
代碼沒有什么問題,可能是晶振不合適,延時函數可能不準確導致18b20時序不準所致。下面是在TX-1C實驗板上測試,串口返回的數據,晶振11.0592MHz,


/*溫度函數*/
void delay_18B20(unsigned int i)   //12MHz   T=i*9+16us
{
   while(i--);}





下面是測試程序,樓主代碼部分沒有任何改動
  1. #include<reg51.H>

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. sbit DQ=P2^2;

  5. uchar data dis_buf[]="000.0\n";                //緩存數組

  6. uint temp;
  7. uchar i;

  8. /*溫度函數*/
  9. void delay_18B20(unsigned int i)//延時1微秒
  10. {
  11.    while(i--);
  12. }

  13. /*ds1820復位*/
  14. void ds1820rst(void)
  15. {
  16.         unsigned char x=0;
  17.         DQ = 1;            //DQ復位
  18.         delay_18B20(40);   //延時
  19.         DQ = 0;             //DQ拉低
  20.         delay_18B20(100);    //精確延時大于480us
  21.         DQ = 1;             //拉高
  22.         delay_18B20(40);
  23. }

  24. /*讀數據*/
  25. uchar ds1820rd(void)
  26. {
  27.         unsigned char i=0;
  28.         unsigned char dat = 0;
  29.         for (i=8;i>0;i--)
  30.         {   
  31.                 DQ = 0;  //給脈沖信號
  32.                 dat>>=1;
  33.                 DQ = 1;  //給脈沖信號
  34.                 if(DQ)
  35.                 dat|=0x80;
  36.                 delay_18B20(10);
  37.         }
  38.         return(dat);
  39. }

  40. /*寫數據*/
  41. void ds1820wr(uchar wdata)
  42. {
  43.         unsigned char i=0;
  44.         for (i=8; i>0; i--)
  45.         {
  46.                 DQ = 0;
  47.                 DQ = wdata&0x01;
  48.                 delay_18B20(10);
  49.                 DQ = 1;
  50.                 wdata>>=1;
  51.         }
  52. }

  53. /*讀取溫度值并轉換*/
  54. unsigned int get_temp(void)
  55. {
  56.         unsigned int tvalue=0;
  57.         uchar a,b;
  58.         ds1820rst();
  59.         delay_18B20(1);   
  60.         ds1820wr(0xcc);     //跳過讀序列號/
  61.         ds1820wr(0x44);
  62.         delay_18B20(1);     //啟動溫度轉換/
  63.         ds1820rst();   
  64.         ds1820wr(0xcc);     //跳過讀序列號/
  65.         ds1820wr(0xbe);     //讀取溫度/
  66.         a=ds1820rd();
  67.         b=ds1820rd();
  68.         tvalue=b;
  69.         tvalue<<=8;
  70.         tvalue=tvalue|a;
  71.         if(tvalue<0x0fff);  // tflag=0;
  72.         else  tvalue=0;     // {tvalue=~tvalue+1;tflag=1;}
  73.         tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
  74.         return(tvalue);
  75. }

  76. void InitUART(void)
  77. {
  78.         PCON = 0x00;
  79.         TMOD = 0x20;
  80.         SCON = 0x50;
  81.         TH1 = 0xFD;
  82.         TL1 = 0xFD;
  83.         TR1 = 1;
  84. }

  85. void main()
  86. {
  87.         InitUART();
  88.         while(1)
  89.         {
  90.                 temp=get_temp();
  91.                 dis_buf[0]=temp/1000%10+'0';
  92.                 dis_buf[1]=temp/100%10+'0';
  93.                 dis_buf[2]=temp/10%10+'0';
  94.                 dis_buf[4]=temp%10+'0';
  95.                 for(i=0;i<6;i++)
  96.                 {
  97.                         SBUF=dis_buf[i];
  98.                         while(!TI);
  99.                         TI=0;
  100.                 }
  101.                 delay_18B20(50000);
  102.         }
  103. }
復制代碼



回復

使用道具 舉報

7#
ID:384109 發表于 2023-5-12 13:50 | 只看該作者
  if(tvalue<0x0fff)  ;                                                                // tflag=0;
    else  tvalue=0;                                                                                // {tvalue=~tvalue+1;tflag=1;}
        tvalue=tvalue*(0.625);                                                                //溫度值擴大10倍,精確到1位小數
不太理解這一段
回復

使用道具 舉報

8#
ID:824490 發表于 2023-5-12 14:06 | 只看該作者
代碼有問題:

  if(tvalue<0x0fff)  ;  
   else  tvalue=0;                    

//有這樣的語法嗎?
回復

使用道具 舉報

9#
ID:517951 發表于 2023-5-12 17:01 | 只看該作者
核對軟件時候,不要忘記查下硬件線路有沒問題, 與18B20數據腳相連的腳是不是軟件定義的那個IO口.不要焊錯線了.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩精品一区二区三区四区 | 亚洲成人av | 久久久成| 午夜丰满少妇一级毛片 | 麻豆久久久 | 亚洲综合色网 | 在线免费观看欧美 | 高清一区二区 | 欧美a级成人淫片免费看 | 亚洲精品一区二区三区中文字幕 | 狠狠操狠狠干 | 男女网站免费观看 | 国产一区二区免费 | 男人的天堂久久 | 国产精品久久久久久婷婷天堂 | 97久久精品午夜一区二区 | 亚洲午夜精品一区二区三区 | 国产精品无码久久久久 | 黄视频免费在线 | 日韩欧美精品 | 99色播| 久久99精品久久久久久琪琪 | 国内精品久久久久久久影视简单 | 国产精久久久久久久 | 欧美一区二区三区在线观看 | www.久久久.com| 成人在线精品视频 | 亚洲三级国产 | 天天躁日日躁狠狠的躁天龙影院 | 精品一区二区久久久久久久网精 | 天天干天天插 | 日操操夜操操 | 粉嫩国产精品一区二区在线观看 | 欧美综合久久 | 亚洲精品在线看 | 蜜桃在线一区二区三区 | 亚洲国产成人在线视频 | 日韩毛片免费看 | 午夜精品福利视频 | 99久久99| 国产无套一区二区三区久久 |