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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
ID:814988 發(fā)表于 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寫一個字節(jié)
{
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讀一節(jié)數(shù)據(jù)
{
uint i;
uchar date=0;//讀出的一節(jié)數(shù)據(jù)
for(i=0;i<8;i++)
{
  DQ=1;//將電平拉高
  _nop_();//等待1us(一個機器周期)
  DQ=0;//拉低電平
  _nop_();
  _nop_();
  DQ=1;//拉高電平,為輸出電平做準備
  date>>=1;
  if(DQ)
  {
   date|=0x80; //如果讀到數(shù)據(jù)是1,將1存入date
  }
  _nop_();
  _nop_(); //延時3us,|兩個讀時序之間需要2us恢復期
  _nop_();
}
return date;
}
注釋可能有錯誤,被我改了好多次了。




51hei截圖20200818112037.png

DS18B20.rar

55.26 KB, 下載次數(shù): 16

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:213173 發(fā)表于 2020-8-19 06:52 | 顯示全部樓層
主要問題是時序不當和數(shù)據(jù)處理不當。
無標題.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寫指令函數(shù)
  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寫數(shù)據(jù)函數(shù)
  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位數(shù)據(jù)接口
  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寫一個字節(jié)
  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讀一節(jié)數(shù)據(jù)
  101. {
  102.         uint i;
  103.         uchar date=0;//讀出的一節(jié)數(shù)據(jù)
  104.         for(i=8;i>0;i--)
  105.         {
  106.                 DQ=0;//拉低電平
  107.                 date>>=1;
  108.                 DQ=1;//拉高電平,為輸出電平做準備
  109.                 if(DQ)
  110.                         date|=0x80;        //如果讀到數(shù)據(jù)是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);//啟動溫度轉(zhuǎn)換
  140.         delay_ms(10);//溫度轉(zhuǎn)換需要一點時間
  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;                //分解出整數(shù)
  170.                 Temp_L=Temp&0x0f;           //分解出小數(shù)
  171.                 Temp_L=Temp_L*0.625;        //保留一位小數(shù)

  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 發(fā)表于 2020-8-19 08:17 | 顯示全部樓層
DS18B20讀寫時序,在單片機發(fā)送復位脈沖低電平保持至少480us釋放總線進入接收狀態(tài)
回復

使用道具 舉報

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

已解決,謝謝大佬。
回復

使用道具 舉報

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

謝謝大佬。
回復

使用道具 舉報

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

使用道具 舉報

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

所以你這原理圖能顯示數(shù)據(jù)也是奇葩,能不能幫幫我,我發(fā)現(xiàn)ds18b20無法轉(zhuǎn)換溫度,就是沒數(shù)據(jù)也不知道怎么回事
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品视频免费观看 | 91久久国产精品 | 欧洲精品在线观看 | 夜夜艹 | 一区二区三区视频在线 | 美国一级黄色片 | 日韩一区二区三区视频 | 少妇淫片aaaaa毛片叫床爽 | 中国一级特黄毛片大片 | 亚洲香蕉在线视频 | 久久中文字幕一区 | 国产一级片在线观看视频 | 成人教育av | 国产日韩欧美在线一区 | 日韩中文字幕一区二区 | 亚洲激情综合网 | 国产男女视频 | 成人网址在线观看 | 国产日韩免费观看 | 在线观看免费福利 | 亚洲综合成人网 | 亚洲精品v | 欧美日韩在线综合 | 九九在线视频 | 国产激情在线播放 | 中文字幕一区在线观看视频 | 精品精品视频 | 9久久精品| 久久久久久久久久久蜜桃 | 亚洲一区 中文字幕 | 九九久久精品视频 | 亚卅毛片 | 色噜噜亚洲男人的天堂 | 欧美综合久久 | 国产欧美精品在线 | 无码日韩精品一区二区免费 | 一区二区三区电影在线观看 | 一区二区中文 | 精品一区久久 | 女同av亚洲女人天堂 | 成人免费在线观看 |