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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20測溫數(shù)碼管顯示并保存數(shù)據(jù)到AT24C02

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:523178 發(fā)表于 2020-4-12 12:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
將測的溫度通過IIC總線保存到AT24C02芯片中,同樣也可以讀出來并在數(shù)碼管上顯示,程序中的串口部分用于切換程序段、向AT24C02寫數(shù)據(jù)并提示是否寫入成功:返回1:成功,返回0:失敗”、從AT24C02數(shù)據(jù),并處理顯示在數(shù)碼管上。

單片機源程序如下:
  1. /*********************************************************************
  2. *程序說明:用DS18B20測溫,用串口發(fā)送響應(yīng)的字符串可實現(xiàn)將溫度數(shù)據(jù)保存
  3. *                   在AT24C02中,同樣也可以讀出來并顯示在數(shù)碼管上。
  4. *主要程序段:IIC、DS18B20驅(qū)動、Usart
  5. *********************************************************************/
  6. #include "REG52.H"
  7. #include "DS18B20.h"
  8. #include "I2C.h"
  9. #include "Usart.h"

  10. #define GPIO_DIG P0

  11. typedef unsigned int u16;
  12. typedef unsigned char u8;

  13. u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
  14.                                                 0x7c,0x39,0x5e,0x79,0x71};
  15. u8 display[6];
  16. u8 data_r;
  17. int Read_tp;   //保存從AT24C02讀出來的溫度
  18. int tp;                   //保存將要寫入AT24C02的溫度
  19. int response;  //檢查是否了寫入數(shù)據(jù)


  20. sbit LSA = P1^0;
  21. sbit LSB = P1^1;
  22. sbit LSC = P1^2;

  23. void Delay(u16 i)
  24. {
  25.         while(i--);
  26. }
  27. /* 定義八個數(shù)碼管顯示器的位選函數(shù) ,掃描數(shù)碼管 */
  28. void Digdisplay()
  29. {
  30.         u8 i;
  31.         for(i = 0; i < 6; i++)
  32.         {
  33.                  switch(i)
  34.                 {
  35.                
  36.                          case (0):
  37.                                         LSA = 0; LSB = 0; LSC = 0; break;           // 000
  38.                         case (1):                                                                          
  39.                                         LSA = 1; LSB = 0; LSC = 0; break;           // 001
  40.                         case (2):                                                                          
  41.                                         LSA = 0; LSB = 1; LSC = 0; break;           // 010
  42.                         case (3):                                                                          
  43.                                         LSA = 1; LSB = 1; LSC = 0; break;           // 011
  44.                         case (4):
  45.                                         LSA = 0; LSB = 0; LSC = 1; break;           // 100
  46.                         case (5):
  47.                                         LSA = 1; LSB = 0; LSC = 1; break;           // 101
  48.                 }
  49.                 GPIO_DIG = display[i];
  50.                 Delay(80);                     //改變參數(shù)的值能實現(xiàn)滾動顯示。最大為65535,否則會溢出。
  51.                 GPIO_DIG = 0x00;           //清空數(shù)碼管,以防止出現(xiàn)重影。
  52.         }
  53. }
  54. //將讀出來的溫度數(shù)據(jù)進行處理
  55. void DataPros(int temp)
  56. {
  57.         float temperature;
  58.         if(temp < 0)
  59.         {
  60.                 display[0] = 0x40;        //顯示負號
  61.                  temp -= 1;
  62.                 temperature = ~temp;
  63.                 temp = temperature * 0.0625 * 100;       
  64.         }
  65.         else
  66.         {
  67.                  display[0] = 0x00;
  68.                 temperature = temp;
  69.                 temp = temperature * 0.0625 * 100;       
  70.         }
  71.         display[1] = smgduan[temp/10000];
  72.         display[2] = smgduan[temp%10000/1000];
  73.         display[3] = smgduan[temp%1000/100]|0x80;
  74.         display[4] = smgduan[temp%100/10];
  75.         display[5] = smgduan[temp%10];               
  76. }

  77. void main()
  78. {
  79.         Usart_Init();      //串口初始化
  80.         while(1)
  81.         {
  82.                 switch(data_r)
  83.                 {
  84.                          case '1':                                                   //測溫
  85.                                 DataPros(Ds18b20ReadTemp());
  86.                                 Digdisplay();
  87.                                 break;
  88.                         case '2':                                                  //將測溫數(shù)據(jù)保存在AT24c02第1個地址中
  89.                                 DataPros(0x00);                                  //保存數(shù)據(jù)時,讓數(shù)碼管顯示零
  90.                                 Digdisplay();
  91.                                 tp = Ds18b20ReadTemp();
  92.                                 response = At24C02WriteByte(1,tp);//檢查數(shù)據(jù)是否寫入,返回1:成功 返回0:失敗
  93.                                 break;
  94.                         case '3':                                                  //讀出AT24c02第1個地址中的溫度數(shù)據(jù)并顯示
  95.                                 Read_tp = At24C02ReadByte(1);
  96.                                 DataPros(Read_tp);
  97.                                 Digdisplay();
  98.                                 break;
  99.                         case '4':                                                  //將測溫數(shù)據(jù)保存在AT24c02第2個地址中
  100.                                 DataPros(0x00);
  101.                                 Digdisplay();
  102.                                 tp = Ds18b20ReadTemp();
  103.                                 response = At24C02WriteByte(2,tp);
  104.                                 break;
  105.                         case '5':                                                  //讀出AT24c02第2個地址中的溫度數(shù)據(jù)并顯示
  106.                                 Read_tp = At24C02ReadByte(2);
  107.                                 DataPros(Read_tp);
  108.                                 Digdisplay();
  109.                                 break;               
  110.                 }               
  111.         }
  112. }
  113. void Usart() interrupt 4
  114. {
  115.         u8 ReceiveData;
  116.         ReceiveData = SBUF;
  117.         data_r = ReceiveData;
  118.         while(!RI);
  119.         RI = 0;

  120. //        SBUF = tp;
  121. //        while(!TI);
  122. //        TI = 0;
  123.                                                   
  124.         SBUF = response;
  125.         while(!TI);
  126.         TI = 0;
  127. }
復(fù)制代碼

所有資料51hei提供下載:
DS18B20溫度傳感器.rar (42.31 KB, 下載次數(shù): 50)


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

使用道具 舉報

沙發(fā)
ID:523178 發(fā)表于 2020-4-12 14:54 | 只看該作者
由于AT24C02一個地址只能存一個字節(jié)的數(shù)據(jù),DS18B20讀出的數(shù)據(jù)是兩個字節(jié),所以當所測溫度到16時,存入AT24C02的數(shù)據(jù)就會溢出,解決辦法是:將溫度數(shù)據(jù)高八位取出來,低八位取出來,分別存入AT24C02的兩個地址中,讀出的時候分別讀出兩個地址的溫度數(shù)據(jù),再進行重組,送入數(shù)據(jù)處理函數(shù)以便進行顯示。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产乱码久久久久久 | 国产日韩一区二区三免费高清 | 国产一区二区久久 | 亚洲免费在线视频 | 亚洲一区二区免费电影 | 日韩在线观看一区 | 久99久视频 | 欧美午夜一区二区三区免费大片 | 91视在线国内在线播放酒店 | 日韩视频在线播放 | a欧美| 久久精品一区 | 日韩一区二区三区视频在线播放 | 人操人人 | 久久乐国产精品 | 国产一区二区av | 色小姐综合网 | 亚洲成人免费视频在线观看 | 四虎影视一区二区 | 久久精品天堂 | 中文字幕在线一区二区三区 | www.日韩欧美| 欧美日韩精品一区二区天天拍 | 亚洲免费在线视频 | 日韩欧美精品 | 国产精品久久久久久吹潮 | 激情五月婷婷综合 | 91精品免费视频 | 国产精品久久久久久吹潮 | 91精品久久久久久综合五月天 | 婷婷五月色综合香五月 | 国产精品视频一二三区 | 欧美日韩综合视频 | 亚洲午夜精品在线观看 | 一区二区国产精品 | 中文字幕精品一区久久久久 | 欧美激情久久久 | 日韩精品一区二区三区在线播放 | 成人3d动漫一区二区三区91 | 久久国产精品-久久精品 | 1204国产成人精品视频 |