找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1256|回复: 0
收起左侧

DS18B20测温

[复制链接]
ID:945385 发表于 2021-8-8 23:22 | 显示全部楼层 |阅读模式

  1. DS18B20 测温程序
复制代码
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. #include "temp.h"       



  3. typedef unsigned int u16;          //对数据类型进行声明定义

  4. typedef unsigned char u8;



  5. #define LowTemp 27        //低温报警,第五个数码管显0

  6. #define HighTemp 29 //高温报警,第五个数码管显1        //数值可以随便改



  7. sbit LSA=P2^2;

  8. sbit LSB=P2^3;

  9. sbit LSC=P2^4;



  10. char num=0;

  11. u8 DisplayData[8];

  12. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};



  13. /*

  14. * 函 数 名: delay

  15. * 函数功能:延时函数,i=1时,大约延时10us

  16. */

  17. void delay(u16 i)

  18. {

  19.         while(i--);       

  20. }





  21. /*

  22. * 函 数 名: datapros()

  23. * 函数功能: 温度读取处理转换函数

  24. * 输    入: temp

  25. * 输    出: 无

  26. */



  27. void datapros(int temp)          

  28. {

  29.            float tp;  

  30.         if(temp< 0)                                //当温度值为负数

  31.           {

  32.                 DisplayData[1] = 0x40; //-号

  33.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

  34.                 temp=temp-1;

  35.                 temp=~temp;//求原码

  36.                 tp=temp;

  37.                 temp=tp*0.0625*100+0.5;       

  38.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

  39.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

  40.                 //算加上0.5,还是在小数点后面。

  41.           }

  42.         else

  43.           {                       

  44.                 DisplayData[1] = 0x00;

  45.                 tp=temp;

  46.                 //因为数据处理有小数点所以将温度赋给一个浮点型变量

  47.                 //如果温度是正的那么,那么正数的原码就是补码它本身

  48.                 temp=tp*0.0625*100+0.5;       

  49.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

  50.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

  51.                 //算加上0.5,还是在小数点后面。

  52.         }

  53.        

  54.         if(temp <= LowTemp*100)

  55.                 DisplayData[0] = smgduan[0];//显示报警,0是温度过低,1是温度正常,2是温度过高

  56.         else if(temp >= HighTemp*100)

  57.                 DisplayData[0] = smgduan[2];//显示报警,0是温度过低,1是温度正常,2是温度过高

  58.         else if(temp > LowTemp*100 && temp < HighTemp*100)//温度正常显1

  59.                 DisplayData[0] = smgduan[1];

  60.        

  61.         DisplayData[2] = smgduan[temp % 10000 / 1000];//温度十位

  62.         DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;//个位

  63.         DisplayData[4] = smgduan[temp % 100 / 10];//十分位

  64.         DisplayData[5] = smgduan[temp % 10];//百分位

  65. }





  66. /*

  67. * 函 数 名:DigDisplay()

  68. * 函数功能:数码管显示函数

  69. * 输        入: 无

  70. * 输        出: 无

  71. */

  72. void DigDisplay()

  73. {

  74.         u8 i;

  75.         for(i=0;i<6;i++)

  76.         {

  77.                 switch(i)         //位选,选择点亮的数码管,

  78.                 {

  79.                         case(0):

  80.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位

  81.                         case(1):

  82.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位

  83.                         case(2):

  84.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位

  85.                         case(3):

  86.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位

  87.                         case(4):

  88.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位

  89.                         case(5):

  90.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位       

  91.                 }

  92.                 P0=DisplayData[5-i];//发送数据

  93.                 delay(100); //间隔一段时间扫描       

  94.                 P0=0x00;//消隐

  95.         }               

  96. }



  97. /*

  98. * 函 数 名: main

  99. * 函数功能: 主函数

  100. * 输    入: 无

  101. * 输    出: 无

  102. */

  103. void main()

  104. {       

  105.         while(1)

  106.         {

  107.                 datapros(Ds18b20ReadTemp());         //数据处理函数

  108.                 DigDisplay();//数码管显示函数               

  109.         }               

  110. }

复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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