找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3579|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

DS18B20讀取序列號(hào)+1602顯示源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:233067 發(fā)表于 2017-10-30 19:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
DS18B20讀取序列號(hào)+1602顯示,H我沒(méi)加進(jìn)去,序列號(hào)開(kāi)頭是28H,我只放進(jìn)去28.

單片機(jī)源程序如下:

  1. #include <intrins.h>
  2. #include <lcd.h>
  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. uint temp,flag1;
  8. int  LedOut[4];
  9. int temper;

  10. sbit DQ=P3^7;

  11. uchar sn[8];//存序列號(hào)

  12. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  13.                                         0x66,0x6d,0x7d,0x07,
  14.                                         0x7f,0x6f,0x77,0x7c,
  15.                                         0x39,0x5e,0x79,0x71};
  16.                        


  17. /*---------        DS18B20-----------*/
  18. void delay1(unsigned char i)
  19. {
  20. while(i--);
  21. }

  22. void initionds18b20()
  23. {

  24.         DQ=0;
  25.         delay1(128);  //900us

  26.         DQ=1;
  27.                 delay1(1);


  28.         while(DQ);  //檢測(cè)到應(yīng)答脈沖
  29.     //i=103;while(i>0) i--;//等待870us
  30.         delay1(100);
  31. }

  32. uchar readds18b20()
  33. {  uchar i   = 0;
  34. uchar dat = 0;
  35. for(i=8;i>0;i--)
  36. {
  37.    DQ = 0;                  //將總線拉低,要在1us之后釋放總線
  38.                            //單片機(jī)要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會(huì)有效。
  39.    _nop_();                 //至少維持了1us,表示讀時(shí)序開(kāi)始
  40.    dat >>= 1;               //讓從總線上讀到的位數(shù)據(jù),依次從高位移動(dòng)到低位。
  41.    DQ = 1;                  //釋放總線,此后DS18B20會(huì)控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
  42.    delay1(1);                 //延時(shí)7us,此處參照推薦的讀時(shí)序圖,盡量把控制器采樣時(shí)間放到讀時(shí)序后的15us內(nèi)的最后部分
  43.    if(DQ)                   //控制器進(jìn)行采樣
  44.    {
  45.     dat |= 0x80;            //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進(jìn)行處理,保持為0
  46.    }        
  47.    delay1(10);               //此延時(shí)不能少,確保讀時(shí)序的長(zhǎng)度60us。
  48. }
  49. return (dat);
  50. }



  51. void writeds18b20(uchar dat)
  52. {
  53. uchar i = 0;
  54. for(i=8;i>0;i--)
  55. {
  56.    DQ = 0;                        //拉低總線
  57.    _nop_();                       //至少維持了1us,表示寫時(shí)序(包括寫0時(shí)序或?qū)?時(shí)序)開(kāi)始
  58.    DQ = dat&0x01;                 //從字節(jié)的最低位開(kāi)始傳輸
  59.                                  //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
  60.                                  //因?yàn)?5us后DS18B20會(huì)對(duì)總線采樣。
  61.    delay1(10);                     //必須讓寫時(shí)序持續(xù)至少60us
  62.    DQ = 1;                        //寫完后,必須釋放總線,
  63.    dat >>= 1;
  64.    delay1(1);
  65. }
  66. }



  67. void rom() //讀取序列號(hào)
  68. {
  69. uchar i;
  70. int j;
  71. initionds18b20(); //復(fù)位
  72. delay1(1); //延時(shí)
  73. writeds18b20(0x33); //發(fā)送讀序列號(hào)子程序
  74. for        (j=0;j<9;j++)
  75. {
  76.          sn[j]=readds18b20(); //讀取序列號(hào)


  77. }

  78. }



  79. /*---------------lLCD----------------------*/
  80. delay(BYTE ms)
  81. {                                                        // 延時(shí)子程序
  82.         BYTE i;
  83.         while(ms--)
  84.         {
  85.                 for(i = 0; i< 250; i++)
  86.                 {
  87.                         _nop_();
  88.                         _nop_();
  89.                         _nop_();
  90.                         _nop_();
  91.                 }
  92.         }
  93. }

  94. BOOL lcd_bz()
  95. {                                                        // 測(cè)試LCD忙碌狀態(tài)
  96.         BOOL result;
  97.         rs = 0;
  98.         rw = 1;
  99.         ep = 1;
  100.         _nop_();
  101.         _nop_();
  102.         _nop_();
  103.         _nop_();
  104.         result = (BOOL)(P0 & 0x80);
  105.         ep = 0;
  106.         return result;       
  107. }


  108. lcd_pos(BYTE pos)
  109. {                                                        //設(shè)定顯示位置
  110.         LcdWriteCom(pos | 0x80);
  111. }






  112.   void write_lcd_disp(char Rom)
  113. {
  114. uchar i,c,l,h;

  115.      l = Rom & 0x0f;            //取低4位
  116.          h = Rom & 0xf0;                //取高4位  
  117.          h >>= 4;
  118.          if( ( h >= 0x00 )&&( h <= 0x09 ) )
  119.                   LcdWriteData(h+0x30);               //取ASCII碼
  120.          else  
  121.                   LcdWriteData(h+0x37);               //取ASCII碼

  122.          if( ( l >= 0x00 )&&( l <= 0x09 ) )
  123.                   LcdWriteData(l+0x30);               //取ASCII碼
  124.          else  
  125.                   LcdWriteData(l+0x37);               //取ASCII碼  

  126.   delay(1);
  127. }




  128. void main()
  129. {

  130. int k;
  131. uchar a,b,c,d,e,f,g,h,j;
  132. LcdInit();                                // 初始化LCD       
  133.                  
  134.    rom();

  135.    a=sn[0];    //調(diào)用讀序列號(hào)子程序
  136.    b=sn[1];
  137. ……………………

  138. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
ds18b20讀取序列號(hào) 16022.rar (40.62 KB, 下載次數(shù): 77)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表