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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于ds18b20 程序問題求大神解答,為何數碼管顯示一直是959

  [復制鏈接]
跳轉到指定樓層
樓主
ID:323005 發表于 2019-3-4 01:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
程序功能:檢車DS18B20并顯示數碼管上;奈何數碼管一直顯示A959;
#include<STC8.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define FOSC  12000000L
sbit w1=P1^0;
sbit w2=P1^1;
sbit w3=P1^2;
sbit w4=P1^3;//數碼管位選
sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;
sbit DS=P5^4;數據口
sbit g=P5^5;
           //define interface
uint temp;             // variable of temperature
uchar flag1;            // sign of the result positive or negative
uchar code SM[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code SM5[]={
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void nb(uint z)   //??
{
uint x,y;
     x=z;
for(x;x>0;x--)
   for(y=110;y>0;y--);
}

void delay(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}
bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}
uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);  
  }
  return(dat);
}
void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }
  }
}
void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}
uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}
void display(uint temp)   //&Iuml;&Ocirc;&Ecirc;&frac34;&sup3;&Igrave;&ETH;ò
{
   uchar A1,A2,A2t,A3;
      A1=temp%10;
     A2=temp/10%10;
    A3=temp/100%10;
    w1=0;
    P3=SM[A1];
    nb(50);
    w1=1;
    w2=0;
    P3=SM[A2];
    nb(50);
    w2=1;
    w3=0;
    P3=SM[A3];
    nb(50);
    w3=1;
    w4=0;
    P3=0x77;nb(50);
    w4=1;
}

void main()
{
uchar a;
    tmpchange();  
    display(tmp());
   
   while(1)
  {tmpchange();  
  display(tmp());
  }
}


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

使用道具 舉報

沙發
ID:158375 發表于 2019-3-4 08:28 | 只看該作者
程序要分開調試:
先別管ds18b20 程序,你的數碼管顯示對嗎?是不是想顯示什么都無問題?
18b20讀出數據后要轉換,轉換對嗎?給一個讀出數據,,能顯示正確否?
以上全對了,再研究DS18B20程序。。。。。。
回復

使用道具 舉報

板凳
ID:466578 發表于 2019-3-4 08:34 | 只看該作者
已經定義了一個全局變量
uint temp;             // variable of temperature
然而,又定義了這個
void display(uint temp)   //&Iuml;&Ocirc;&Ecirc;&frac34;&sup3;&Igrave;&ETH;ò
回復

使用道具 舉報

地板
ID:323005 發表于 2019-3-4 15:19 | 只看該作者
笨笨兔 發表于 2019-3-4 08:28
程序要分開調試:
先別管ds18b20 程序,你的數碼管顯示對嗎?是不是想顯示什么都無問題?
18b20讀出數據 ...

謝謝回答 ;數碼管顯示沒問題的
回復

使用道具 舉報

5#
ID:323005 發表于 2019-3-4 15:33 | 只看該作者
佛云 發表于 2019-3-4 08:34
已經定義了一個全局變量
uint temp;             // variable of temperature
然而,又定義了這個

謝謝 ,但是不是這個問題
回復

使用道具 舉報

6#
ID:323005 發表于 2019-3-4 15:34 | 只看該作者
通電直接就顯示A959好像沒有檢測
回復

使用道具 舉報

7#
ID:323005 發表于 2019-3-4 17:49 | 只看該作者
求解答
回復

使用道具 舉報

8#
ID:466164 發表于 2019-3-4 21:34 | 只看該作者
1.單從顯示看A959,A百位錯誤," A3=temp/100%10;"最高位直接求模A3=temp/100;
2.溫度轉換有問題,沒考慮負溫度,當時溫度低于0度你處理的是補碼。
3.        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*10+0.5;       
4.你英語太好注釋看不太明白,所以水平有限只能看怎么多。
回復

使用道具 舉報

9#
ID:348627 發表于 2019-3-4 21:35 | 只看該作者
temp 是全局變量就別再返回temp   你可以把temp定義在uint tmp()  這里面就行了。  樓主可以嘗試一下
回復

使用道具 舉報

10#
ID:346616 發表于 2019-3-4 22:21 | 只看該作者
P3=0x77;這個顯示A,
tmpread()返回0xFF,
tmp()函數中經過計算返回temp的值是0x9FFF,
A1=temp%10;
A2=temp/10%10;
A3=temp/100%10;
這三個值是0x09.0x05,0x09,對應的是SM數組中的位置,第九個,第五個,第九個,即959。
調試的時候可以從temp往上回溯,注意char和int的長度。
回復

使用道具 舉報

11#
ID:323005 發表于 2019-3-5 00:11 | 只看該作者
菜鳥來了 發表于 2019-3-4 22:21
P3=0x77;這個顯示A,
tmpread()返回0xFF,
tmp()函數中經過計算返回temp的值是0x9FFF,

貌似是初始化的問題 12晶振 不知道哪里出問題了
回復

使用道具 舉報

12#
ID:346616 發表于 2019-3-5 00:37 | 只看該作者
sssssdffs 發表于 2019-3-5 00:11
貌似是初始化的問題 12晶振 不知道哪里出問題了

有這個意思,建議完整的接上傳感器看看。
如果有問題先在tmp()里下個斷點調試,看一下tmpread()的返回值。
回復

使用道具 舉報

13#
ID:323005 發表于 2019-3-5 00:40 | 只看該作者
菜鳥來了 發表于 2019-3-5 00:37
有這個意思,建議完整的接上傳感器看看。
如果有問題先在tmp()里下個斷點調試,看一下tmpread()的返回值 ...

初始化失敗了應該,發圖發不上去
回復

使用道具 舉報

14#
ID:478073 發表于 2019-3-5 07:54 | 只看該作者
壇子里有案例,找一下看看

評分

參與人數 4黑幣 +44 收起 理由
微小苛 + 10
yoxi + 10
shuisheng60 + 10
Trump1438 + 14

查看全部評分

回復

使用道具 舉報

15#
ID:481641 發表于 2019-4-5 16:36 | 只看該作者
數碼管和溫度分開試試
回復

使用道具 舉報

16#
ID:382454 發表于 2019-4-5 22:54 來自手機 | 只看該作者
要單個單個模塊調試,才對。調好了再整合
回復

使用道具 舉報

17#
ID:481641 發表于 2019-4-6 08:27 | 只看該作者
轉換或者數碼管有問題
回復

使用道具 舉報

18#
ID:315110 發表于 2023-6-11 03:29 | 只看該作者
菜鳥來了 發表于 2019-3-4 22:21
P3=0x77;這個顯示A,
tmpread()返回0xFF,
tmp()函數中經過計算返回temp的值是0x9FFF,

感謝,說白了就是時序問題,導致初始化失敗,或者讀出的數據錯誤,全部為0xFF。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 中文 欧美 日韩 在线观看 | 免费观看一级毛片 | 亚洲高清视频在线 | 欧美日韩在线成人 | 99pao成人国产永久免费视频 | 欧美精品一区二区三区在线 | 久久精品一 | 中文字幕免费在线 | 欧美三级三级三级爽爽爽 | 超碰日韩 | 午夜久久久久久久久久一区二区 | 亚洲精品视频免费观看 | 欧美亚洲另类丝袜综合网动图 | av片免费 | 99久久精品国产毛片 | 四虎影院美女 | 欧美成人激情 | 国产高清在线观看 | 国产一区二区免费电影 | 97国产精品| 99爱在线免费观看 | 欧美精品一二三 | 亚洲小视频在线观看 | a级黄色片视频 | 一级黄色夫妻生活 | 草比av | 午夜伊人 | 久久久久国产精品 | 亚洲一区二区中文字幕 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 天天射天天干 | 日韩免费网站 | 美女爽到呻吟久久久久 | 日韩欧美三区 | 日本成年免费网站 | 偷拍亚洲色图 | 久久精品亚洲精品 | 国产在线麻豆精品入口 | 国产一区二区自拍 | 涩爱av一区二区三区 | 在线天堂免费中文字幕视频 |