找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3822|回復: 4
收起左側(cè)

求玩過DS18B20大蝦解答;初始化正常讀出數(shù)據(jù)ab是0xffff

[復制鏈接]
ID:323005 發(fā)表于 2019-3-6 01:52 | 顯示全部樓層 |閱讀模式
void Delay800ms()  //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 49;
j = 180;
k = 100;
do
{
  do
  {
   while (--k);
  } while (--j);
} while (--i);
}
void nb(uint z)   //??
{
uint x,y;
     x=z;
for(x;x>0;x--)
   for(y=110;y>0;y--);
}
void Delay1us(uint zz)  //@12.000MHz 1U延時
{
unsigned char i ;uint z;

for(z=zz;z>0;z--)
{i = 2;
while (--i);}
}
void Delay1ms()  //@12.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
do
{
  while (--j);
} while (--i);
}
/*****初始化DS18B20*****/
void Init_DS18B20()
{
unsigned char x=100;
DQ=1;

DQ=0;

Delay1us(500);
DQ=1;
Delay1us(60);
while(DQ&&x--);
fg=DQ;
}
/*****讀一個字節(jié)*****/
uchar  ReadOneChar(void)  //主機數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號
{  
unsigned char i=8; //每個讀周期最短的持續(xù)時間為60us,各個讀周期之間必須有1us以上的高電平恢復期
unsigned char dat=0,dab;
for (i=8;i>0;i--) //一個字節(jié)有8位
{
  
  DQ=0;
  dat>>=1;
  Delay1us(2);
  DQ=1;
  Delay1us(10);
  if(DQ)
  {
   dat|=0x80;
  }
  Delay1us(60);

} return(dat);
}
/*****寫一個字節(jié)*****/
void WriteOneChar(unsigned char dat)
{

unsigned char i=0;

//數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
for(i=8;i>0;i--) //在15~60us之間對數(shù)據(jù)線進行采樣,如果是高電平就寫1,低寫0發(fā)生。
{
  
  DQ=0; //在開始另一個寫周期前必須有1us以上的高電平恢復期。
  Delay1us(1);
  DQ=dat&0x01;  //按低位發(fā)送數(shù)據(jù)
  Delay1us(120);
  DQ=1;
  dat=dat>>1;}
Delay1us(70);
}

/*****讀取溫度*****/
ReadTemperature()
{
uchar a,b;uchar t;float tt;
Init_DS18B20(); //初始化
Delay1ms();
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
  Delay800ms() ; //@12.000MHz //轉(zhuǎn)換需要一點時間,延時
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
a=ReadOneChar(); //讀出溫度的低位LSB
b=ReadOneChar(); //讀出溫度的高位MSB


回復

使用道具 舉報

ID:213173 發(fā)表于 2019-3-6 15:34 | 顯示全部樓層
你這樣問很難解答,給你一個成熟的程序和仿真圖參考 無標題.jpg

  1. /*-----------------------------------------------
  2.   名稱:DS18b20測溫程序 數(shù)碼管顯示(-55~128度)
  3. ------------------------------------------------*/
  4. #include <reg51.H>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define DataPort P0 //定義數(shù)據(jù)端口

  8. sbit LATCH1=P2^6;//定義鎖存使能端口 段鎖存
  9. sbit LATCH2=P2^7;//                 位鎖存
  10. sbit DQ=P2^2;                //DS18B20 端口

  11. /************定義全局變量*************/
  12. uchar code dofly_DuanMa[]={//共陰數(shù)碼管段碼"0~f-."
  13.                 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  14.                 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  15. uchar code dofly_WeiMa[]={//共陰數(shù)碼管8位位碼
  16.                 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  17. uchar TempData[6]; //存儲顯示值的全局變量
  18. bit ReadTempFlag;        //讀時間標志
  19. /*------------------------------------------------
  20.                   函數(shù)聲明
  21. ------------------------------------------------*/
  22. void WriteOneChar(uchar dat);//寫入DS18B20一個字節(jié)
  23. uchar ReadOneChar();//讀取DS18B20一個字節(jié)
  24. uint ReadTemperature();//讀取DS18B20溫度值
  25. void Init_DS18B20();//初始化DS18B20
  26. void Display();        //數(shù)碼管顯示函數(shù)
  27. void Init_Timer0();        //定時器初始化
  28. void delay(uchar i);//1ms延時函數(shù)
  29. /*------------------------------------------------
  30.                     主函數(shù)
  31. ------------------------------------------------*/
  32. void main()
  33. {                  
  34.         uint temp;
  35.         long tempM;
  36.         bit negative;//負數(shù)標志
  37.         uchar TempH,TempL,TempK;
  38.         Init_Timer0();
  39.         TempData[5]=0x39;                                //顯示C
  40.         while(1)         //主循環(huán)
  41.         {
  42.                 if(ReadTempFlag==1)//定時標志
  43.                 {
  44.                         ReadTempFlag=0;
  45.                         temp=ReadTemperature();//讀取溫度
  46.                         if(temp&0x8000)
  47.                         {
  48.                                 negative=1;                //負號標志
  49.                                 temp=~temp;                //取反加1
  50.                                 temp +=1;
  51.                         }
  52.                         else negative=0;        //正數(shù)

  53.                         tempM=temp*0.0625*100;        //換算為10進制溫度值再放大100倍
  54.                         TempH=tempM/100;                                //分解出整數(shù)值       
  55.                         TempL=tempM%100;                                //分解出小數(shù)值
  56.                         TempL=(TempL+TempK)/2+0.5;//小數(shù)取兩次平均值加四舍五入
  57.                         TempK=TempL;
  58.                        
  59.                         if(negative==1)
  60.                                 TempData[0]=0x40;//顯示負號
  61.                         else if(TempH/100==0)//小于100
  62.                                 TempData[0]=0;                                                                                        //百位消隱
  63.                         else
  64.                                 TempData[0]=dofly_DuanMa[TempH/100];                         //顯示百位溫度
  65.        
  66.                         if((TempH/100==0)&&((TempH%100)/10==0))
  67.                                 TempData[1]=0;                                                                                        //十位消隱
  68.                         else
  69.                                 TempData[1]=dofly_DuanMa[(TempH%100)/10];                //顯示十位溫度
  70.                         TempData[2]=dofly_DuanMa[(TempH%100)%10]|0x80;//顯示個位溫度,帶小數(shù)點
  71.                         TempData[3]=dofly_DuanMa[TempL/10];                                //顯示溫度小數(shù)1位
  72.                         TempData[4]=dofly_DuanMa[TempL%10];                                //顯示溫度小數(shù)2位       
  73.                 }
  74.         }
  75. }
  76. /**********1ms延時************/
  77. void delay(uchar i)
  78. {
  79.         uchar j, k;  
  80.         for(j=i;j>0;j--)
  81.                 for(k=120;k>0;k--);   
  82. }
  83. /*****初始化DS18B20*****/
  84. void Init_DS18B20()
  85. {
  86.         uint i;
  87.         DQ=0;
  88.         i = 103;  
  89.         while(i>0)
  90.                 i--;
  91.         DQ=1;
  92.         i = 4;   
  93.         while(i>0)
  94.                 i--;  
  95. }
  96. /*****讀一個字節(jié)*****/
  97. uchar ReadOneChar()
  98. {
  99.         uchar i=0;
  100.         uchar dat = 0;
  101.         for (i=8;i>0;i--)
  102.         {
  103.                 DQ = 0; // 給脈沖信號
  104.                 dat>>=1;
  105.                 DQ = 1; // 給脈沖信號
  106.                 if(DQ)
  107.                 dat|=0x80;
  108.                 delay(1);
  109.         }
  110.         return(dat);
  111. }
  112. /*****寫一個字節(jié)*****/
  113. void WriteOneChar(uchar dat)
  114. {
  115.         uchar i=0;
  116.         for(i=8; i>0; i--)
  117.         {
  118.                 DQ = 0;
  119.                 DQ = dat&0x01;
  120.                 delay(1);
  121.                 DQ = 1;
  122.                 dat>>=1;
  123.         }
  124.         delay(1);
  125. }
  126. /*****讀取溫度*****/
  127. uint ReadTemperature()
  128. {
  129.         uchar a,b;
  130.         uint tt;

  131.         Init_DS18B20();    //初始化DS18B20
  132.         delay(1);    //延時1ms  
  133.         WriteOneChar(0xcc); //寫入跳過序列號命令字
  134.         WriteOneChar(0x44); //寫入溫度轉(zhuǎn)換命令字

  135.         delay(1);      //延時1ms  //@12.000MHz //轉(zhuǎn)換需要一點時間,延時
  136.         Init_DS18B20();     //初始化DS18B20
  137.         delay(1);      //延時1ms  
  138.         WriteOneChar(0xcc); //寫入跳過序列號命令字
  139.         WriteOneChar(0xbe); //寫入讀取數(shù)據(jù)令字

  140.         a=ReadOneChar(); //讀出溫度的低位LSB
  141.         b=ReadOneChar(); //讀出溫度的高位MSB
  142.         tt=(b<<8)|a;
  143.         return tt;
  144. }
  145. /*------------------------------------------------
  146.                                 6位動態(tài)數(shù)碼管顯示函數(shù)
  147. ------------------------------------------------*/
  148. void Display()
  149. {
  150.         static uchar i=0;

  151.         DataPort=0;   //清空數(shù)據(jù),消隱
  152.         LATCH1=1;     //段鎖存
  153.         LATCH1=0;
  154.        
  155.         DataPort=dofly_WeiMa[i]; //取位碼
  156.         LATCH2=1;     //位鎖存
  157.         LATCH2=0;
  158.        
  159.         DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
  160.         LATCH1=1;     //段鎖存
  161.         LATCH1=0;
  162.        
  163.         i++;
  164.         i%=6;
  165. }
  166. /*------------------------------------------------
  167.             定時器初始化子程序
  168. ------------------------------------------------*/
  169. void Init_Timer0(void)
  170. {
  171.          TMOD |= 0x01;          //使用模式1,16位定時器
  172.          TH0=(65536-2000)/256;              //給定初值
  173.          TL0=(65536-2000)%256;
  174.          EA=1;            //總中斷打開
  175.          ET0=1;           //定時器中斷打開
  176.          TR0=1;           //定時器開關(guān)打開
  177. }
  178. /*------------------------------------------------
  179.                  定時器中斷子程序
  180. ------------------------------------------------*/
  181. void Timer0_isr(void) interrupt 1
  182. {
  183.         static uint num;
  184.         TH0=(65536-2000)/256;        //重新賦值 2ms
  185.         TL0=(65536-2000)%256;
  186.        
  187.         Display();       // 調(diào)用數(shù)碼管掃描
  188.         num++;
  189.         if(num>=250)        //500ms
  190.         {
  191.                 num=0;
  192.                 ReadTempFlag=1; //讀標志位置1
  193.         }
  194. }
復制代碼



回復

使用道具 舉報

ID:323005 發(fā)表于 2019-3-6 21:17 | 顯示全部樓層
wulin 發(fā)表于 2019-3-6 15:34
你這樣問很難解答,給你一個成熟的程序和仿真圖參考

謝謝已解決
回復

使用道具 舉報

ID:466164 發(fā)表于 2019-3-6 22:57 | 顯示全部樓層
缺少浮點變量,轉(zhuǎn)來轉(zhuǎn)去全是整數(shù)
TempData[1]=dofly_DuanMa[(TempH%100)/10];                //顯示十位溫度
TempData[2]=dofly_DuanMa[(TempH%100)%10]|0x80;//顯示個位溫度TempData[3]=dofly_DuanMa[TempL/10];                                //顯示溫度TempData[4]=dofly_DuanMa[TempL%10];                                //顯示溫度小數(shù)2位  
缺少個位
TempData[1]=dofly_DuanMa[TempH/100];
TempData[2]=dofly_DuanMa[TempH%100/10];
TempData[3]=dofly_DuanMa[TempH%10/10]|0x80;
TempData[4]=dofly_DuanMa[TempL/10];
TempData[5]=dofly_DuanMa[TempL%10];
你可以試下我新手才學3個月
回復

使用道具 舉報

ID:471066 發(fā)表于 2019-3-7 00:47 | 顯示全部樓層

是啊,在做只前一定要弄懂別人的,再找著調(diào)試,模仿

評分

參與人數(shù) 1黑幣 +8 收起 理由
嘉立創(chuàng)AAA + 8 很給力!

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表