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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大佬們看看,ds18b20單片機讀出來溫度總是55.9不變

[復制鏈接]
跳轉到指定樓層
樓主
這是ds18b20.c的:
#include "ds18b20.h"
#include "reg52.h"

sbit DQ=P1^4;

void Delay_OneWire(unsigned int t)  
{
        unsigned char i;
        while(t--){
                for(i=0;i<12;i++);
        }
}

void Write_DS18B20(unsigned char dat)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                DQ = 0;
                DQ = dat&0x01;
                Delay_OneWire(5);
                DQ = 1;
                dat >>= 1;
        }
        Delay_OneWire(5);
}

unsigned char Read_DS18B20(void)
{
        unsigned char i;
        unsigned char dat;

        for(i=0;i<8;i++)
        {
                DQ = 0;
                dat >>= 1;
                DQ = 1;
                if(DQ)
                {
                        dat |= 0x80;
                }            
                Delay_OneWire(5);
        }
        return dat;
}

unsigned char init_ds18b20(void)
{
          unsigned char initflag = 0;
         
          DQ = 1;
          Delay_OneWire(12);
          DQ = 0;
          Delay_OneWire(80);
          DQ = 1;
          Delay_OneWire(10);
    initflag = DQ;     
          Delay_OneWire(5);

          return initflag;
}

float read_ds18b20_temp()
{
        unsigned char ls;
        unsigned int hs;

        init_ds18b20();
        Write_DS18B20(0xcc);
        Write_DS18B20(0x44);
        Delay_OneWire(1000);
        
        init_ds18b20();
        Write_DS18B20(0xcc);
        Write_DS18B20(0xbe);
        
        ls=Read_DS18B20();
        hs=Read_DS18B20();

  return ((hs<<8)|ls)/16.0;
}


這是主程序:
#include "reg52.h"
#include "ds18b20.h"

unsigned char smgdata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x8c};
float temp;

void selecthc573(unsigned char a)
{
        switch(a)
        {
                case 4: P2=(P2&0x1f)|0x80;break;
                case 5: P2=(P2&0x1f)|0xa0;break;
                case 6: P2=(P2&0x1f)|0xc0;break;
                case 7: P2=(P2&0x1f)|0xe0;break;
        }
}

void seg_dy(unsigned char wei,duan,point)
{
        P0=0xff;
        
        if(point)
        {
                selecthc573(7);
                P0=duan&0x7f;
                P2&=0x1f;
        }
        else
        {
                selecthc573(7);
                P0=duan;
                P2&=0x1f;
        }
        
        selecthc573(6);
        P0=0x01<<wei;
        P2&=0x1f;
        
        
}

void delay(int s)
{
        while(s--);
}

void segdisplay()
{
        temp=read_ds18b20_temp();
        seg_dy(0,smgdata[((unsigned char)temp/10%10)],0);
        delay(600);
        seg_dy(1,smgdata[((unsigned char)temp%10)],1);
        delay(600);
        seg_dy(2,smgdata[((unsigned int)(temp*10)%10)],0);
        delay(600);
}

int main()
{
        while(1)
        {
                segdisplay();
        }
               
}

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

使用道具 舉報

沙發
ID:1109793 發表于 2024-2-6 09:53 | 只看該作者
10多年前研究過,記得時序要求比較嚴格。還有加上拉
回復

使用道具 舉報

板凳
ID:1058641 發表于 2024-2-6 12:47 | 只看該作者
xiaobendan001 發表于 2024-2-6 09:53
10多年前研究過,記得時序要求比較嚴格。還有加上拉

我感覺這也沒問題啊
回復

使用道具 舉報

地板
ID:1058641 發表于 2024-2-6 14:50 | 只看該作者
有人知道嗎
回復

使用道具 舉報

5#
ID:213173 發表于 2024-2-6 15:07 | 只看該作者
rtyweq 發表于 2024-2-6 12:47
我感覺這也沒問題啊

ds18b20對時序要求很高,數碼管動態顯示也要求穩定掃描,你不掌握兩者時間的有序協調,很難成功。




  1. #include "reg52.h"
  2. #include "intrins.h"

  3. sbit DQ=P1^4;

  4. unsigned char code smgdata[]={
  5. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  6. 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x8c};
  7. unsigned char  data dis_buf[8];
  8. unsigned int temp;

  9. bit flag;

  10. void delay(unsigned int n)
  11. {
  12.         while(n--);      
  13. }

  14. unsigned char init_ds18b20()
  15. {
  16.         unsigned char x=0;
  17.         DQ = 1;
  18.         delay(8);
  19.         DQ=0;
  20.         delay(80);
  21.         DQ=1;
  22.         delay(10);
  23.         x=DQ;
  24.         delay(20);
  25.         return x;
  26. }

  27. void Write_DS18B20(unsigned char dat)
  28. {
  29.         unsigned char i;
  30.         for(i=8;i>0;i--)
  31.         {
  32.                 DQ=0;
  33.                 DQ=dat&0x01;
  34.                 delay(5);
  35.                 DQ=1;
  36.                 dat>>=1;
  37.         }
  38.         delay(4);
  39. }

  40. unsigned char Read_DS18B20()
  41. {
  42.         unsigned char i,dat;

  43.         for(i=8;i>0;i--)
  44.         {
  45.                 DQ=0;
  46.                 dat>>=1;
  47.                 DQ=1;
  48.                 if(DQ)
  49.                 dat|=0x80;
  50.                 delay(4);
  51.         }
  52.         return (dat);
  53. }

  54. void read_ds18b20_temp()
  55. {
  56.         static unsigned char ls,hs,i;
  57.         switch(i)
  58.         {
  59.                 case  0: init_ds18b20();        break;
  60.                 case  1: Write_DS18B20(0xcc);   break;
  61.                 case  2: Write_DS18B20(0x44);   break;
  62.                 case 94: init_ds18b20();        break;
  63.                 case 95: Write_DS18B20(0xcc);   break;
  64.                 case 96: Write_DS18B20(0xbe);   break;
  65.                 case 97: ls=Read_DS18B20();     break;
  66.                 case 98: hs=Read_DS18B20();     break;
  67.                 case 99: temp=((hs<<8)|ls)/1.6; break;//保留1位小數
  68.         }
  69.         i=++i%100;
  70. }

  71. void Timer0_Init(void)                //2毫秒@11.0592MHz
  72. {
  73.         TMOD |= 0x01;                        //設置定時器模式
  74.         TL0 = 0xCD;                                //設置定時初始值
  75.         TH0 = 0xF8;                                //設置定時初始值
  76.         TF0 = 0;                                //清除TF0標志
  77.         TR0 = 1;                                //定時器0開始計時
  78.         ET0 = 1;                                //使能定時器0中斷
  79.         EA  = 1;
  80. }

  81. void main()
  82. {
  83.         unsigned char i,j;
  84.         Timer0_Init();
  85.         while (1)
  86.         {
  87.                 if(flag)
  88.                 {
  89.                         flag=0;
  90.                         P0=0xff;       P2=0xe0; P2=0x00;//段消影
  91.                         P0=0x01<<i;    P2=0xd0; P2=0x00;//傳位碼
  92.                         P0=dis_buf[i]; P2=0xe0; P2=0x00;//傳段碼
  93.                         i=++i%4;
  94.                         read_ds18b20_temp();
  95.                         switch(j)
  96.                         {
  97.                                 case 0: dis_buf[0]=smgdata[temp/1000%10]; break;
  98.                                 case 1: dis_buf[1]=smgdata[temp/100%10]; break;
  99.                                 case 2: dis_buf[2]=smgdata[temp/10%10]&0x7f; break;//加小數點
  100.                                 case 3: dis_buf[3]=smgdata[temp%10]; break;
  101.                         }       
  102.                         j=++j%4;
  103.                 }
  104.         }
  105. }
  106. void Timer0_Isr(void) interrupt 1
  107. {
  108.         TL0 = 0xCD;                                //設置定時初始值
  109.         TH0 = 0xF8;                                //設置定時初始值
  110.         flag=1;
  111. }
復制代碼



回復

使用道具 舉報

6#
ID:1109793 發表于 2024-2-6 19:04 | 只看該作者
wulin 發表于 2024-2-6 15:07
ds18b20對時序要求很高,數碼管動態顯示也要求穩定掃描,你不掌握兩者時間的有序協調,很難成功。

真不錯,學習了
回復

使用道具 舉報

7#
ID:1058641 發表于 2024-2-6 21:29 | 只看該作者
wulin 發表于 2024-2-6 15:07
ds18b20對時序要求很高,數碼管動態顯示也要求穩定掃描,你不掌握兩者時間的有序協調,很難成功。

就是對這里不明白,做這個延時就很煩
回復

使用道具 舉報

8#
ID:161164 發表于 2024-2-6 21:37 | 只看該作者
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us
Delay_OneWire(12)=1814us
Delay_OneWire(80)=1200us
回復

使用道具 舉報

9#
ID:1058641 發表于 2024-2-6 21:40 | 只看該作者
lkc8210 發表于 2024-2-6 21:37
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us

是把for循環去掉嗎?
回復

使用道具 舉報

10#
ID:1058641 發表于 2024-2-6 22:26 | 只看該作者
lkc8210 發表于 2024-2-6 21:37
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us

好像是多了這個,仿真不是12Mhz。但是為什么那個顯示出來的溫度要跳成別的溫度?
回復

使用道具 舉報

11#
ID:161164 發表于 2024-2-7 09:10 | 只看該作者
本帖最后由 lkc8210 于 2024-2-7 11:09 編輯
rtyweq 發表于 2024-2-6 22:26
好像是多了這個,仿真不是12Mhz。但是為什么那個顯示出來的溫度要跳成別的溫度?

時序不對就會出現莫名奇妙的情況

正好你用的是仿真
可以加個虛擬邏輯分析儀來看看信號電平變化時序
回復

使用道具 舉報

12#
ID:213173 發表于 2024-2-7 10:20 | 只看該作者
rtyweq 發表于 2024-2-6 21:29
就是對這里不明白,做這個延時就很煩

軟件都是基于硬件條件編寫的。給你改的代碼是基于你以前的帖子用的藍橋杯CT107D電路。小延時可以用阻塞型沒有問題,超過1ms延時不宜用阻塞型,要用定時器。否則無法滿足各個子函數對時序的要求。上述程序主函數有效運行周期2ms。也就是數碼管每2ms顯示1位。8ms完成一輪掃描。讀取溫度DS18B20函數需要在主函數中運行100次才能完成,實際有效運行只有9次,其它時間都是在等待確保轉換成功。讀/寫DS18B20函數中的小延時都是us級的不會影響數碼管動態掃描。
回復

使用道具 舉報

13#
ID:1058641 發表于 2024-2-7 15:08 | 只看該作者
wulin 發表于 2024-2-7 10:20
軟件都是基于硬件條件編寫的。給你改的代碼是基于你以前的帖子用的藍橋杯CT107D電路。小延時可以用阻塞型 ...

學到了學到了
回復

使用道具 舉報

14#
ID:492633 發表于 2024-11-17 20:49 | 只看該作者
wulin 發表于 2024-2-6 15:07
ds18b20對時序要求很高,數碼管動態顯示也要求穩定掃描,你不掌握兩者時間的有序協調,很難成功。

要是測負溫度怎么改
回復

使用道具 舉報

15#
ID:1128354 發表于 2024-11-18 10:03 | 只看該作者

Delay_OneWire這函數有問題好像
回復

使用道具 舉報

16#
ID:1133081 發表于 2024-11-18 10:22 | 只看該作者
3wjkdhus 發表于 2024-11-17 20:49
要是測負溫度怎么改

讀取到的ds18b20數據是16位2進制數。高5位為符號位,中8位為整數位,低4位為小數位。只要識別到高5位任意一位為1即可判定是負溫度值。


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美1—12sexvideos| 极品久久 | 国产丝袜一区二区三区免费视频 | 亚洲韩国精品 | 视频一区二区三区在线观看 | 午夜小视频免费观看 | 久久夜色精品国产 | 成人免费视频一区二区 | 99自拍视频 | 中文字幕精品一区二区三区精品 | 国产激情精品视频 | 精品视频在线播放 | 亚洲视频免费观看 | 夜夜摸夜夜操 | 欧美日韩一区二区在线观看 | 欧美日韩国产一区 | 久久免费看 | 伦理午夜电影免费观看 | 国际精品鲁一鲁一区二区小说 | 国产 欧美 日韩 一区 | 国产亚洲欧美在线视频 | 99热在线播放 | 国产一级黄色网 | 欧美另类日韩 | 99精品久久久久 | 一区二区三区久久 | 欧美日韩在线观看一区 | 成人性视频在线播放 | 亚洲午夜精品 | 99视频免费在线观看 | 91在线视频国产 | 婷婷国产一区二区三区 | 国产在线二区 | 欧美一区二区三区在线播放 | 日韩欧美国产精品一区二区三区 | 天天舔天天 | 中文字幕av高清 | 亚洲一卡二卡 | 色久在线 | 国产欧美在线 | 亚洲精品一区二区在线观看 |