欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5884|回復: 8
收起左側

protues仿真DS18B20一直失敗,各位大佬幫忙看一下?

[復制鏈接]
ID:814988 發表于 2020-8-18 11:25 | 顯示全部樓層 |閱讀模式
uint init_DS18B02()//DS18B02初始化
{
uint x;//用于檢測DS18B02是否存在,1是并不存在,0是存在
DQ=1;//先將電平拉高
_nop_();
DQ=0;//將電平拉低,要求保持480uS-960uS
delay_us(48);
DQ=1;//釋放電平
delay_us(3);
x=DQ;//保持DS18B02是否存在的電平  
delay_us(6);  //延時足夠長的時間,等待存在脈沖輸出完畢
DQ=1;
delay_us(44);
return x;//返回是否存在
}


void write_DS18B02(uchar date)  //DS18B20寫一個字節
{
uint i;
for(i=0;i<8;i++)
{
  DQ=1;
  _nop_();
  DQ=0;
  _nop_();
  _nop_();
  DQ=1;
  delay_us(4);
  DQ=date&0x01;
  _nop_();
  _nop_();
  date>>=1;
}
delay_us(1);
}


uchar Read_DS18B02()//從DS18B02讀一節數據
{
uint i;
uchar date=0;//讀出的一節數據
for(i=0;i<8;i++)
{
  DQ=1;//將電平拉高
  _nop_();//等待1us(一個機器周期)
  DQ=0;//拉低電平
  _nop_();
  _nop_();
  DQ=1;//拉高電平,為輸出電平做準備
  date>>=1;
  if(DQ)
  {
   date|=0x80; //如果讀到數據是1,將1存入date
  }
  _nop_();
  _nop_(); //延時3us,|兩個讀時序之間需要2us恢復期
  _nop_();
}
return date;
}
注釋可能有錯誤,被我改了好多次了。




51hei截圖20200818112037.png

DS18B20.rar

55.26 KB, 下載次數: 16

回復

使用道具 舉報

ID:235954 發表于 2020-8-18 15:57 | 顯示全部樓層
論壇里面例程很多
回復

使用道具 舉報

ID:235200 發表于 2020-8-19 00:15 | 顯示全部樓層
只需修改程序中的延時程序,使之符合DS18B20讀寫時序即可
回復

使用道具 舉報

ID:213173 發表于 2020-8-19 06:52 | 顯示全部樓層
主要問題是時序不當和數據處理不當。
無標題.jpg

  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. void display1_Temperature(int temp);
  6. int num1(uchar temp1,uchar temp2);
  7. uint shu10(t);
  8. uint time;

  9. uchar code cdis1[]="Error!!!";
  10. uchar code cdis2[]="Xianzaiwendu:";
  11. uchar code cdis3[]="Temp:XXXX.X*C";
  12. uint code date1[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

  13. sbit RS=P2^0;
  14. sbit RW=P2^1;
  15. sbit EN=P2^2;
  16. sbit DQ=P3^7;

  17. void delay_ms(uchar ms)//毫秒延時
  18. {
  19.         uint x,y;
  20.         for(x=ms;x>0;x--)
  21.                 for(y=124;y>0;y--);
  22. }
  23. //大致延時長度如下 T=us×2+5 uS
  24. void delay_us(uchar us)
  25. {
  26.         while(--us);
  27. }

  28. bit busy()        //檢測LCD1602忙
  29. {
  30.         bit Bit;
  31.         RS=0;
  32.         RW=1;
  33.         EN=1;
  34.         delay_ms(1);
  35.         Bit=(bit)(P0&0x80);//最高位為忙信號位
  36.         EN=0;
  37.         return Bit;
  38. }
  39. void write_com(uchar com)//LCD1602寫指令函數
  40. {
  41.         while(busy());
  42.         RS=0;
  43.         RW=0;
  44.         P0=com;
  45.         delay_ms(5);
  46.         EN=1;
  47.         delay_ms(5);
  48.         EN=0;
  49. }
  50. void pos_LCD(uchar pos)//LCD的顯示位置
  51. {
  52.         write_com(0x80|pos);
  53. }

  54. void write_date(uchar date)//LCD1602寫數據函數
  55. {
  56.         while(busy());         //測忙
  57.         RS=1;
  58.         RW=0;
  59.         P0=date;
  60.         delay_ms(5);
  61.         EN=1;
  62.         delay_ms(5);
  63.         EN=0;
  64. }
  65. void init_LCD1602()//LCD1602初始化
  66. {
  67.         EN=0;
  68.         write_com(0X38);//設置16*2顯示,5*7點陣,8位數據接口
  69.         write_com(0X0C);//設置開顯示,不開光標
  70.         write_com(0X06);//寫一個字符時,整屏右移
  71.         write_com(0X01);//顯示清零
  72. }

  73. bit init_DS18B02()//DS18B02初始化
  74. {
  75.         bit x;//用于檢測DS18B02是否存在,1是并不存在,0是存在       
  76.         DQ=1;//先將電平拉高       
  77.         delay_us(5);
  78.         DQ=0;//將電平拉低,要求保持480uS-960uS
  79.         delay_us(200);
  80.         delay_us(200);
  81.         DQ=1;//釋放電平
  82.         delay_us(50);       
  83.         x=DQ;//保持DS18B02是否存在的電平               
  84.         delay_us(25);//延時足夠長的時間,等待存在脈沖輸出完畢
  85.         return x;//返回是否存在
  86. }
  87. void write_DS18B02(uchar date)         //DS18B20寫一個字節
  88. {
  89.         uint i;
  90.         for(i=8;i>0;i--)
  91.         {
  92.                 DQ=0;
  93.                 DQ=date&0x01;
  94.                 delay_us(25);
  95.                 DQ=1;
  96.                 date>>=1;
  97.         }
  98.         delay_us(25);       
  99. }
  100. uchar Read_DS18B02()//從DS18B02讀一節數據
  101. {
  102.         uint i;
  103.         uchar date=0;//讀出的一節數據
  104.         for(i=8;i>0;i--)
  105.         {
  106.                 DQ=0;//拉低電平
  107.                 date>>=1;
  108.                 DQ=1;//拉高電平,為輸出電平做準備
  109.                 if(DQ)
  110.                         date|=0x80;        //如果讀到數據是1,將1存入date
  111.                 delay_us(25);
  112.         }
  113.         return date;
  114. }
  115. void error()//顯示檢測不到DS18B02
  116. {
  117.         uint i;
  118.         pos_LCD(0x00);//設置顯示位置為第一行
  119.         for(i=0;i<8;i++)write_date(cdis1[i]);       
  120. }
  121. void display_explan1()//第一行的顯示
  122. {
  123.         uint i;
  124.         pos_LCD(0x00);//設置顯示位置為第一行
  125.         for(i=0;i<13;i++)write_date(cdis2[i]);       
  126. }
  127. void display_explan2()//第二行的顯示
  128. {
  129.         uint i;
  130.         pos_LCD(0x40);//設置顯示位置為第二行
  131.         for(i=0;i<13;i++)write_date(cdis3[i]);
  132. }
  133. uint display()//讀溫度
  134. {
  135.         uchar L;
  136.         uint t,H;
  137.         init_DS18B02();//DS18B02初始化
  138.         write_DS18B02(0xCC);//跳過讀序號的操作
  139.         write_DS18B02(0x44);//啟動溫度轉換
  140.         delay_ms(10);//溫度轉換需要一點時間
  141.         init_DS18B02();//DS18B02初始化
  142.         write_DS18B02(0xCC);//跳過讀序號的操作
  143.         write_DS18B02(0xBE);//讀取溫度寄存器
  144.         L=Read_DS18B02();
  145.         H=Read_DS18B02();
  146.         t=H<<8|L;
  147.         return(t);
  148. }

  149. void main()
  150. {
  151.         uchar Temp_L,Temp_H;
  152.         uint Temp;
  153.         bit negative=0;
  154.         init_LCD1602();//LCD1602初始化       
  155.         if(init_DS18B02()==1)//檢測不到DS18B02
  156.                 error();//顯示檢測不到DS18B02
  157.         display_explan1();//第一行的顯示
  158.         display_explan2();//第二行的顯示

  159.         while(1)
  160.         {
  161.                 Temp=display();
  162.                  if(Temp&0x8000)       
  163.                 {
  164.                         negative=1;
  165.                         Temp=~Temp+1;
  166.                 }
  167.                 else negative=0;
  168.                
  169.                 Temp_H=Temp>>4;                //分解出整數
  170.                 Temp_L=Temp&0x0f;           //分解出小數
  171.                 Temp_L=Temp_L*0.625;        //保留一位小數

  172.                 write_com(0xc5);
  173.                 if(negative==1)
  174.                         write_date('-');
  175.                 else
  176.                         write_date('+');
  177.                 write_date(Temp_H/100+'0');
  178.                 write_date(Temp_H/10%10+'0');
  179.                 write_date(Temp_H%10+'0');
  180.                 write_date('.');
  181.                 write_date(Temp_L+'0');
  182.                 write_date(0xdf);
  183.                 delay_us(10);
  184.         }  
  185. }
復制代碼



回復

使用道具 舉報

ID:744327 發表于 2020-8-19 08:17 | 顯示全部樓層
DS18B20讀寫時序,在單片機發送復位脈沖低電平保持至少480us釋放總線進入接收狀態
回復

使用道具 舉報

ID:814988 發表于 2020-8-19 08:31 | 顯示全部樓層
csmyldl 發表于 2020-8-19 00:15
只需修改程序中的延時程序,使之符合DS18B20讀寫時序即可

已解決,謝謝大佬。
回復

使用道具 舉報

ID:814988 發表于 2020-8-31 11:25 | 顯示全部樓層
wulin 發表于 2020-8-19 06:52
主要問題是時序不當和數據處理不當。

謝謝大佬。
回復

使用道具 舉報

ID:235954 發表于 2020-8-31 14:04 | 顯示全部樓層
大佬們就是厲害,火速解決問題
回復

使用道具 舉報

ID:786629 發表于 2020-9-23 23:06 | 顯示全部樓層
wulin 發表于 2020-8-19 06:52
主要問題是時序不當和數據處理不當。

所以你這原理圖能顯示數據也是奇葩,能不能幫幫我,我發現ds18b20無法轉換溫度,就是沒數據也不知道怎么回事
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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