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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
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;
}
/*****讀一個字節*****/
uchar  ReadOneChar(void)  //主機數據線先從高拉至低電平1us以上,再使數據線升為高電平,從而產生讀信號
{  
unsigned char i=8; //每個讀周期最短的持續時間為60us,各個讀周期之間必須有1us以上的高電平恢復期
unsigned char dat=0,dab;
for (i=8;i>0;i--) //一個字節有8位
{
  
  DQ=0;
  dat>>=1;
  Delay1us(2);
  DQ=1;
  Delay1us(10);
  if(DQ)
  {
   dat|=0x80;
  }
  Delay1us(60);

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

unsigned char i=0;

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

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


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

使用道具 舉報

沙發
ID:213173 發表于 2019-3-6 15:34 | 只看該作者
你這樣問很難解答,給你一個成熟的程序和仿真圖參考

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

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

  11. /************定義全局變量*************/
  12. uchar code dofly_DuanMa[]={//共陰數碼管段碼"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[]={//共陰數碼管8位位碼
  16.                 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  17. uchar TempData[6]; //存儲顯示值的全局變量
  18. bit ReadTempFlag;        //讀時間標志
  19. /*------------------------------------------------
  20.                   函數聲明
  21. ------------------------------------------------*/
  22. void WriteOneChar(uchar dat);//寫入DS18B20一個字節
  23. uchar ReadOneChar();//讀取DS18B20一個字節
  24. uint ReadTemperature();//讀取DS18B20溫度值
  25. void Init_DS18B20();//初始化DS18B20
  26. void Display();        //數碼管顯示函數
  27. void Init_Timer0();        //定時器初始化
  28. void delay(uchar i);//1ms延時函數
  29. /*------------------------------------------------
  30.                     主函數
  31. ------------------------------------------------*/
  32. void main()
  33. {                  
  34.         uint temp;
  35.         long tempM;
  36.         bit negative;//負數標志
  37.         uchar TempH,TempL,TempK;
  38.         Init_Timer0();
  39.         TempData[5]=0x39;                                //顯示C
  40.         while(1)         //主循環
  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;        //正數

  53.                         tempM=temp*0.0625*100;        //換算為10進制溫度值再放大100倍
  54.                         TempH=tempM/100;                                //分解出整數值       
  55.                         TempL=tempM%100;                                //分解出小數值
  56.                         TempL=(TempL+TempK)/2+0.5;//小數取兩次平均值加四舍五入
  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;//顯示個位溫度,帶小數點
  71.                         TempData[3]=dofly_DuanMa[TempL/10];                                //顯示溫度小數1位
  72.                         TempData[4]=dofly_DuanMa[TempL%10];                                //顯示溫度小數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. /*****讀一個字節*****/
  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. /*****寫一個字節*****/
  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); //寫入溫度轉換命令字

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

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

  151.         DataPort=0;   //清空數據,消隱
  152.         LATCH1=1;     //段鎖存
  153.         LATCH1=0;
  154.        
  155.         DataPort=dofly_WeiMa[i]; //取位碼
  156.         LATCH2=1;     //位鎖存
  157.         LATCH2=0;
  158.        
  159.         DataPort=TempData[i]; //取顯示數據,段碼
  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;           //定時器開關打開
  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();       // 調用數碼管掃描
  188.         num++;
  189.         if(num>=250)        //500ms
  190.         {
  191.                 num=0;
  192.                 ReadTempFlag=1; //讀標志位置1
  193.         }
  194. }
復制代碼



回復

使用道具 舉報

板凳
ID:323005 發表于 2019-3-6 21:17 | 只看該作者
wulin 發表于 2019-3-6 15:34
你這樣問很難解答,給你一個成熟的程序和仿真圖參考

謝謝已解決
回復

使用道具 舉報

地板
ID:466164 發表于 2019-3-6 22:57 | 只看該作者
缺少浮點變量,轉來轉去全是整數
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];                                //顯示溫度小數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個月
回復

使用道具 舉報

5#
ID:471066 發表于 2019-3-7 00:47 | 只看該作者

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

評分

參與人數 1黑幣 +8 收起 理由
嘉立創AAA + 8 很給力!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美中文字幕在线观看 | 亚洲成人精品国产 | 国产精品永久免费视频 | 国产精品久久久久久久久久久久 | 日韩中文字幕在线不卡 | xxx国产精品视频 | www.精品国产 | 亚洲自拍偷拍免费视频 | 久久伊人在| 在线成人免费视频 | 亚洲欧洲在线观看视频 | 成人一级片在线观看 | 精品videossex高潮汇编 | 久久综合一区二区三区 | 亚洲综合色丁香婷婷六月图片 | 激情五月综合 | 国产精品一区久久久 | 精品亚洲一区二区三区 | 免费久久久 | 亚洲福利在线观看 | 国产激情精品 | 日韩欧美一区二区三区 | 午夜爽爽爽男女免费观看 | 成人在线不卡 | 91精品国产综合久久精品 | 99久久久无码国产精品 | 超碰成人在线观看 | 国产精品爱久久久久久久 | 日日做夜夜爽毛片麻豆 | 毛片网站在线观看 | 日本一区二区高清不卡 | 91精品国产一区二区三区 | 成人小视频在线观看 | 亚洲欧洲一区 | 日本手机在线 | 久久精品a级毛片 | 天天在线操 | 天天久久 | 欧美黑人一级爽快片淫片高清 | 日韩成人精品一区二区三区 | 天天干干 |