找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2370|回复: 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, 下载次数: 49)


分享到:  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 单片机教程网

快速回复 返回顶部 返回列表