找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机DS18b20温度检测液晶显示

[复制链接]
ID:317436 发表于 2018-4-26 23:51 | 显示全部楼层 |阅读模式
17年节能减排大赛作品,获得校赛一等奖,控制简单,主要是想法比较好,想做类似项目的可以参考一下

实物图如下:
IMG_20180421_205528.jpg
0.jpg

单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:DS18b20 温度检测液晶显示
  3.   修改:无
  4.   内容:
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  7. #include<stdio.h>
  8. #include "18b20.h"
  9. #include "1602.h"
  10. #include "delay.h"


  11. sbit KEY0=P1^0;  //独立按键
  12. sbit KEY1=P1^1;  //独立按键
  13. sbit KEY2=P1^2;  //独立按键
  14. sbit KEY3=P1^3;  //独立按键

  15. sbit LED0=P1^4;  //指示灯
  16. sbit LED1=P1^5;  //指示灯
  17. sbit LED2=P1^6;  //指示灯
  18. sbit LED3=P1^7;  //指示灯

  19. sbit RELAY0=P3^3;  //继电器
  20. sbit RELAY1=P3^4;  //继电器

  21. bit ReadTempFlag;//定义读时间标志

  22. void Init_Timer0(void);//定时器初始化
  23. /*------------------------------------------------
  24.               串口通讯初始化
  25. ------------------------------------------------*/
  26. void UART_Init(void)
  27. {
  28.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  29.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  30.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  31.     TR1   = 1;                  // TR1:  timer 1 打开                        
  32.     //EA    = 1;                  //打开总中断
  33.     //ES    = 1;                  //打开串口中断
  34.         TI=1;
  35. }
  36. /*------------------------------------------------
  37.                     主函数
  38. ------------------------------------------------*/
  39. void main (void)
  40. {         
  41. float chazhi=0;       
  42. int temp;
  43. float temperature;
  44. float settemperature=30;
  45. char displaytemp[16];//定义显示区域临时存储数组
  46. int setdisplaytemp[16];
  47. LCD_Init();           //初始化液晶
  48. DelayMs(20);          //延时有助于稳定
  49. LCD_Clear();          //清屏
  50. Init_Timer0();
  51. UART_Init();
  52. Lcd_User_Chr();       //写入自定义字符
  53. LCD_Write_Char(12,0,0x01);//写入温度右上角点
  54. LCD_Write_Char(13,0,'C'); //写入字符C
  55. LCD_Write_Char(14,1,0x01);//写入温度右上角点
  56. LCD_Write_Char(15,1,'C'); //写入字符C

  57. while (1)         //主循环
  58. {
  59.         chazhi=settemperature-temperature;
  60.         if(!KEY0)  
  61.     {
  62.            DelayMs(10);  
  63.      if(!KEY0)     
  64.            {
  65.         while(!KEY0);
  66.                {
  67.                         settemperature++;
  68.                          }
  69.            }
  70.         }
  71. if(!KEY1)  
  72.     {
  73.            DelayMs(10);
  74.      if(!KEY1)      
  75.            {
  76.        while(!KEY1);
  77.                {
  78.                   settemperature--;
  79.                          }
  80.            }
  81.         }
  82.         if(settemperature>temperature)
  83.         {
  84.                 RELAY0=0;
  85.                 RELAY1=1;   
  86.         }
  87.         if(settemperature<temperature)
  88.         {
  89.                 RELAY0=1;
  90.                 RELAY1=0;   
  91.         }
  92.         if(chazhi<0.5&&chazhi>-0.5)
  93.         {
  94.                 RELAY0=0;
  95.                 RELAY1=0;   
  96.         }
  97.         sprintf(setdisplaytemp,"SET Temp %3.0f",settemperature);//打印温度值
  98.   LCD_Write_String(0,0,setdisplaytemp);//显示第一行
  99.         if(ReadTempFlag==1)
  100.   {
  101.                 ReadTempFlag=0;
  102.     temp=ReadTemperature();
  103.     temperature=(float)temp*0.0625;
  104.     sprintf(displaytemp,"RT Temp %6.2f",temperature);//打印温度值
  105.     LCD_Write_String(0,1,displaytemp);//显示第二行
  106.   }       
  107. }
  108. }

  109. /*------------------------------------------------
  110.                     定时器初始化子程序
  111. ------------------------------------------------*/
  112. void Init_Timer0(void)
  113. {
  114. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  115. //TH0=0x00;              //给定初值
  116. //TL0=0x00;
  117. EA=1;            //总中断打开
  118. ET0=1;           //定时器中断打开
  119. TR0=1;           //定时器开关打开
  120. }
  121. /*------------------------------------------------
  122.                  定时器中断子程序
  123. ------------------------------------------------*/
  124. void Timer0_isr(void) interrupt 1
  125. {
  126. static unsigned int num;
  127. TH0=(65536-2000)/256;                  //重新赋值 2ms
  128. TL0=(65536-2000)%256;

  129. num++;
  130. if(num==300)        //
  131.    {
  132.     num=0;
  133.     ReadTempFlag=1; //读标志位置1
  134.         }
  135. }


复制代码

所有资料51hei提供下载:
三通混水阀.rar (52.94 KB, 下载次数: 47)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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