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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20測溫數碼管顯示并保存數據到AT24C02

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

單片機源程序如下:
  1. /*********************************************************************
  2. *程序說明:用DS18B20測溫,用串口發送響應的字符串可實現將溫度數據保存
  3. *                   在AT24C02中,同樣也可以讀出來并顯示在數碼管上。
  4. *主要程序段:IIC、DS18B20驅動、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;  //檢查是否了寫入數據


  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. /* 定義八個數碼管顯示器的位選函數 ,掃描數碼管 */
  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);                     //改變參數的值能實現滾動顯示。最大為65535,否則會溢出。
  51.                 GPIO_DIG = 0x00;           //清空數碼管,以防止出現重影。
  52.         }
  53. }
  54. //將讀出來的溫度數據進行處理
  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':                                                  //將測溫數據保存在AT24c02第1個地址中
  89.                                 DataPros(0x00);                                  //保存數據時,讓數碼管顯示零
  90.                                 Digdisplay();
  91.                                 tp = Ds18b20ReadTemp();
  92.                                 response = At24C02WriteByte(1,tp);//檢查數據是否寫入,返回1:成功 返回0:失敗
  93.                                 break;
  94.                         case '3':                                                  //讀出AT24c02第1個地址中的溫度數據并顯示
  95.                                 Read_tp = At24C02ReadByte(1);
  96.                                 DataPros(Read_tp);
  97.                                 Digdisplay();
  98.                                 break;
  99.                         case '4':                                                  //將測溫數據保存在AT24c02第2個地址中
  100.                                 DataPros(0x00);
  101.                                 Digdisplay();
  102.                                 tp = Ds18b20ReadTemp();
  103.                                 response = At24C02WriteByte(2,tp);
  104.                                 break;
  105.                         case '5':                                                  //讀出AT24c02第2個地址中的溫度數據并顯示
  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. }
復制代碼

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


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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本一二区视频 | 巨大荫蒂视频欧美另类大 | 亚洲欧美激情精品一区二区 | 欧美1区2区 | 91成人免费观看 | 成人国产精品免费观看 | 欧美三级在线 | 91欧美精品成人综合在线观看 | 一区二区三区av | 色视频网站免费 | 免费小视频在线观看 | 男人的天堂视频网站 | 黄色一级电影免费观看 | 亚洲最大福利网 | 91精品久久 | 日日夜夜精品 | 日韩欧美中文在线 | 日韩精品视频在线免费观看 | 一本一道久久a久久精品蜜桃 | 国产欧美精品一区二区 | 久草热播| 草在线| 四虎永久免费影院 | 激情的网站 | 国产精品亚洲综合 | 成人久久久久 | 国产线视频精品免费观看视频 | 天天操夜夜操 | 久久久久久美女 | 国产女人与拘做受免费视频 | 一区二区三区亚洲 | a在线免费观看 | 在线国产一区 | 高清一区二区三区 | 男女精品网站 | 男女国产视频 | 一区二区三区在线 | 在线91| 国产精品毛片一区二区三区 | 国产精品免费观看视频 | 欧美日韩在线播放 |