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

標題: 大佬們看看,ds18b20單片機讀出來溫度總是55.9不變 [打印本頁]

作者: rtyweq    時間: 2024-2-5 16:42
標題: 大佬們看看,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();
        }
               
}


作者: xiaobendan001    時間: 2024-2-6 09:53
10多年前研究過,記得時序要求比較嚴格。還有加上拉
作者: rtyweq    時間: 2024-2-6 12:47
xiaobendan001 發表于 2024-2-6 09:53
10多年前研究過,記得時序要求比較嚴格。還有加上拉

我感覺這也沒問題啊

作者: rtyweq    時間: 2024-2-6 14:50
有人知道嗎
作者: wulin    時間: 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. }
復制代碼




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

真不錯,學習了
作者: rtyweq    時間: 2024-2-6 21:29
wulin 發表于 2024-2-6 15:07
ds18b20對時序要求很高,數碼管動態顯示也要求穩定掃描,你不掌握兩者時間的有序協調,很難成功。

就是對這里不明白,做這個延時就很煩
作者: lkc8210    時間: 2024-2-6 21:37
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us
Delay_OneWire(12)=1814us
Delay_OneWire(80)=1200us
作者: rtyweq    時間: 2024-2-6 21:40
lkc8210 發表于 2024-2-6 21:37
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us

是把for循環去掉嗎?

作者: rtyweq    時間: 2024-2-6 22:26
lkc8210 發表于 2024-2-6 21:37
Delay_OneWire這函數有問題
在11.0592Mhz之下
Delay_OneWire(5)=766us

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

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

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

作者: wulin    時間: 2024-2-7 10:20
rtyweq 發表于 2024-2-6 21:29
就是對這里不明白,做這個延時就很煩

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

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

要是測負溫度怎么改
作者: 3442118983    時間: 2024-11-18 10:03

Delay_OneWire這函數有問題好像

作者: WL0123    時間: 2024-11-18 10:22
3wjkdhus 發表于 2024-11-17 20:49
要是測負溫度怎么改

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







歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费av网址在线观看 | 色爽av| 欧美专区在线 | av在线播放网站 | 国产99页 | 国产精品偷乱一区二区三区 | 国产精品国产成人国产三级 | 亚洲永久免费视频 | 福利av在线| 亚洲一区二区三区在线播放 | 亚洲激情偷拍 | 精品国产欧美一区二区三区成人 | 国产精品911| 免费观看一区二区三区毛片 | 丁香六月综合 | 国产激情综合五月久久 | 国产综合一区二区 | 一级真人毛片 | 国产又黄又猛 | 久久久精品一区二区三区 | 成人久久av | 国产在线一区二区 | 亚洲三级网站 | 欧美成年人视频 | www.成人网| 日韩美女一区 | 黄色av一区 | av大片在线观看 | 免费看黄色av | 99视频在线精品免费观看2 | 99小视频 | 欧美不卡在线观看 | 日日操夜夜 | 成人免费毛片aaaaaa片 | 亚洲天码中字 | 国产一区二区三区视频 | 午夜在线免费视频 | 婷婷第四色 | 日韩伊人 | 免费不卡视频 | 免费看色片 |