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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用單片機+LCD1602采集溫度數據(DS18B20傳感器)

[復制鏈接]
跳轉到指定樓層
樓主
51單片機視頻教程中,是用數碼管來顯示溫度的,這里用LCD1602來顯示數據,效果圖如下


下面是代碼,采用模塊化編程,分成LCD1602和DS18B20兩個模塊,在LCD1602的程序中調用DS18B20的讀取溫度數據,主函數中調用LCD1602的顯示數據,從而顯示溫度

1.主函數代碼
  1. #include "reg52.h"
  2. #include "lcd1602.h"

  3. #ifndef u8
  4. #define u8 unsigned char
  5. #endif

  6. #ifndef u16
  7. #define u16 unsigned int
  8. #endif


  9. void main()
  10. {
  11.         LcdDisp();
  12.         while(1);
  13. }
復制代碼
2.LCD1602代碼
  1. #include "lcd1602.h"
  2. #include "ds18b20.h"

  3. extern u8 Tempdata[9];    //聲明ds18b20中保存溫度數據的數組,擴展使用范圍

  4. void Lcd1602_Delay1ms(u8 c)   //誤差 0us
  5. {
  6.     u8 a,b;
  7.         for (; c>0; c--)
  8.         {
  9.                  for (b=199;b>0;b--)
  10.                  {
  11.                           for(a=1;a>0;a--);
  12.                  }      
  13.         }            
  14. }

  15. void Lcd1602WriteCom(u8 com)   //寫命令函數
  16. {
  17.         LCD_E=0;
  18.         LCD_RS=0;    //寫命令,RS=0
  19.         LCD_RW=0;
  20.         LCD_DATAPIN=com;
  21.         Lcd1602_Delay1ms(1);
  22.         LCD_E=1;
  23.         Lcd1602_Delay1ms(5);
  24.         LCD_E=0;
  25. }

  26. void Lcd1602WriteDat(u8 dat)   //寫數據函數
  27. {
  28.         LCD_E=0;
  29.         LCD_RS=1;    //寫數據,RS=1
  30.         LCD_RW=0;
  31.         LCD_DATAPIN=dat;
  32.         Lcd1602_Delay1ms(1);
  33.         LCD_E=1;
  34.         Lcd1602_Delay1ms(5);
  35.         LCD_E=0;
  36. }

  37. void LcdInit()                                //初始化函數
  38. {
  39.         Lcd1602WriteCom(0x38);   //功能設置指令,總線8位,顯示2行,5x7點陣每個字符        
  40.         Lcd1602WriteCom(0x0c);   //顯示開關控制指令,顯示功能開,無光標        
  41.         Lcd1602WriteCom(0x06);   //模式設置指令,寫入新數據后光標右移,顯示屏不移動        
  42.         Lcd1602WriteCom(0x01);   //清屏指令        
  43.         Lcd1602WriteCom(0x47+0x80);           //寫入第二行倒數第八個位置
  44. }

  45. void LcdDisp()                        //顯示函數
  46. {
  47.         u8 i;
  48.         LcdInit();     //LCD初始化
  49.         tempdatapros(Tempdata);     //讀取溫度數據,存入數組中
  50.         for(i=0;i<9;i++)
  51.         {
  52.                 Lcd1602WriteDat(Tempdata[i]);
  53.         }        
  54. }
復制代碼
  1. #ifndef _LCD1602_H_
  2. #define _LCD1602_H_

  3. #include "reg52.h"

  4. #ifndef u8
  5. #define u8 unsigned char
  6. #endif

  7. #ifndef u16
  8. #define u16 unsigned int
  9. #endif

  10. #define LCD_DATAPIN P0    //定義數據口
  11. sbit LCD_RS=P2^6;
  12. sbit LCD_RW=P2^5;
  13. sbit LCD_E=P2^7;


  14. void LcdDisp();
復制代碼

3.DS18B20代碼
  1. #include "ds18b20.h"

  2. u16 temp;
  3. u8 Tempdata[9];

  4. void delay1ms(u8 y)           //延時函數,延時y毫秒
  5. {
  6.          u8 x;
  7.         for(;y>0;y--)
  8.                 for(x=110;x>0;x--);
  9. }

  10. u8 ds18b20Init()           //溫度傳感器初始化函數
  11. {
  12.          u8 i;
  13.         DSPORT=0;
  14.         i=60;while(i--);     //約延時600us
  15.         DSPORT=1;
  16.         while(DSPORT)
  17.         {
  18.                 i++;
  19.                 if(i>6)
  20.                         return 0;    //初始化失敗
  21.         }
  22.         return 1;     //初始化成功
  23. }

  24. u8 Ds18b20Read()    //從DS18B20中讀數據
  25. {
  26.         u8 dat=0,bi;
  27.         u8 i,j=0;
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 DSPORT=0;
  31.                 j++;
  32.                 DSPORT=1;
  33.                 j++;
  34.                 dat>>=1;
  35.                 bi=DSPORT;
  36.                 dat|=(bi<<7);
  37.                 j=5;while(j--);
  38.         }
  39.         return dat;
  40. }

  41. void Ds18b30Write(u8 dat)    //將數據寫入DS18B20
  42. {
  43.         u8 i,j=0;
  44.         for(i=0;i<8;i++)
  45.         {
  46.                 DSPORT=0;
  47.                 j++;
  48.                 DSPORT=dat<<7;
  49.                 j=6;while(j--);
  50.                 DSPORT=1;
  51.                 dat>>=1;
  52.         }
  53. }

  54. void Ds18b20TempConvert()    //溫度轉換函數
  55. {
  56.         ds18b20Init();
  57.         delay1ms(1);
  58.         Ds18b30Write(0xcc);           //發送跳過ROM指令
  59.         Ds18b30Write(0x44);           //發送溫度轉換指令
  60. }

  61. void Ds18b20ReadTempCom()  //發送讀暫存器指令
  62. {
  63.         ds18b20Init();
  64.         delay1ms(1);
  65.         Ds18b30Write(0xcc);           //發送跳過ROM指令
  66.         Ds18b30Write(0xbe);           //發送讀暫存器指令        
  67. }

  68. void Ds18b20ReadTemp()           //讀溫度存到temp中
  69. {
  70.         u8 th,tl;
  71.         Ds18b20TempConvert();
  72.         Ds18b20ReadTempCom();
  73.         tl=Ds18b20Read();
  74.         th=Ds18b20Read();
  75.         temp=th<<8;
  76.         temp=temp|tl;
  77.         if(temp<0)
  78.         {
  79.                 Tempdata[0]='-';           //若溫度為負值,前面加負號
  80.                 temp=~(temp-1);
  81.                 temp=temp*0.0625*100+0.5;
  82.         }
  83.         else
  84.         {                                                   
  85.                 Tempdata[0]=' ';           // 溫度為正值,前面無符號,顯示空格
  86.                 temp=temp*0.0625*100+0.5;
  87.         }        
  88. }

  89. void tempdatapros(u8 Tempdata[])  //將讀取的溫度temp處理,放入數組中
  90. {
  91.         Ds18b20ReadTemp();
  92.         /*數據位加‘0’,使數字轉化為相應字符*/
  93.         Tempdata[1]=temp/10000+'0';     //百位
  94.         Tempdata[2]=temp/100%100/10+'0';     //十位
  95.         Tempdata[3]=temp/100%10+'0';     //個位
  96.         Tempdata[4]='.';                         //小數點
  97.         Tempdata[5]=temp/10%10+'0';     //小數點后第一位
  98.         Tempdata[6]=temp%10+'0';     //小數點后第二位
  99.         Tempdata[7]=0xdf;                 //溫度單位,攝氏度的‘。’
  100.         Tempdata[8]='C';
  101.         if(Tempdata[1]=='0')                //如果溫度百位為0,顯示空格
  102.                 Tempdata[1]=' ';  
  103. }
復制代碼
  1. #ifndef __ds18b20_H_
  2. #define __ds18b20_H_

  3. #include "reg52.h"

  4. #ifndef u8
  5. #define u8 unsigned char
  6. #endif

  7. #ifndef u16
  8. #define u16 unsigned int
  9. #endif

  10. sbit DSPORT=P3^7;  //定義數據管腳


  11. void tempdatapros(u8 Tempdata[]);

  12. #endif
復制代碼

這個程序的缺點是不能實時更新溫度數值,可以加中斷函數或者其它函數來設定隔多長時間更新一次
歡迎大家在此基礎上創
全部資料51hei下載地址:
LCD1602 DS18B20.zip (36.4 KB, 下載次數: 78)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:946336 發表于 2021-7-1 09:50 | 只看該作者
嗚嗚嗚太有用了 感謝大神
回復

使用道具 舉報

板凳
ID:948474 發表于 2021-7-2 20:08 | 只看該作者
有沒有實時溫度顯示
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品日韩在线 | av毛片| 日韩精品在线观看一区二区三区 | 精品1区| 国产99久久 | 日韩成人精品在线 | 日韩在线视频免费观看 | 欧美日韩国产一区二区 | 久久美国 | 国产亚洲精品久久久久久豆腐 | 国产日韩91 | 欧美日韩中文在线 | 久久久高清 | 日本a级大片| 噜噜噜色网 | 欧美色综合 | 九九热这里 | 日本特黄a级高清免费大片 成年人黄色小视频 | 秋霞影院一区二区 | 一区视频在线免费观看 | 国产视频第一页 | 久久久久久国产精品 | 国产xxx在线观看 | 国内自拍第一页 | 男插女下体视频 | 日本久久精品视频 | 日韩精品一区二区久久 | 亚洲精品粉嫩美女一区 | 亚洲一区二区三区高清 | 涩涩片影院| 日韩中文在线视频 | 日韩不卡一区二区 | 日日干夜夜草 | 青青青伊人 | 成人一区二区在线 | 成人欧美日韩一区二区三区 | 午夜男人免费视频 | 91av视频在线观看 | 欧美亚洲高清 | 国产精品自拍av | 午夜视频在线免费观看 |