找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5081|回复: 4
打印 上一主题 下一主题
收起左侧

DS18b20温度可调上下限1602液晶显示程序

[复制链接]
跳转到指定楼层
楼主
  1. /*-----------------------------------------------
  2.   名称:DS18b20 温度检测液晶显示
  3.   内容:
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  6. #include<stdio.h>
  7. #include "18b20.h"
  8. #include "1602.h"
  9. #include "delay.h"

  10. #define KeyPort P3 //定义按键端口



  11. bit ReadTempFlag;//定义读时间标志
  12. sbit P2_0=P2^0;
  13. sbit P2_1=P2^1;
  14. sbit P2_2=P2^2;
  15. sbit P1_7=P1^7;         //定义电机输出端口
  16. sbit P10=P1^0;

  17. sbit SPK =P1^1;
  18. unsigned char frq;

  19. void Init_Timer0(void);//定时器初始化

  20. void T2csh(void)  //定时器T2初始化
  21. {
  22. RCAP2H=0xff; //TH2初值
  23. RCAP2L=0xee; //TL2初值


  24. TR2=1;   //启动定 时器
  25. ET2=1;    //打开定时器2中断
  26. //EA=1;     //打开总中断
  27. }

  28. unsigned char KeyScan(void);//键盘扫描
  29. /*------------------------------------------------
  30.               串口通讯初始化
  31. ------------------------------------------------*/
  32. void UART_Init(void)
  33. {
  34.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  35.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  36.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  37.     TR1   = 1;                  // TR1:  timer 1 打开                        
  38.     //EA    = 1;                  //打开总中断
  39.     //ES    = 1;                  //打开串口中断
  40.         TI=1;
  41. }
  42. /*------------------------------------------------
  43.                     主函数
  44. ------------------------------------------------*/
  45. void main (void)
  46. {                  
  47. int temp,tempH=18,tempL=15;
  48. float temperature;
  49. unsigned char TempFlag=0;
  50. char displaytemp[16],num;//定义显示区域临时存储数组

  51. LCD_Init();           //初始化液晶
  52. DelayMs(20);          //延时有助于稳定
  53. LCD_Clear();          //清屏
  54. Init_Timer0();

  55. UART_Init();
  56. Lcd_User_Chr();       //写入自定义字符


  57. while (1)         //主循环
  58.   {
  59. num=KeyScan();
  60. switch(num)
  61.        {
  62.             case 1:if(tempH<127)tempH++;break;
  63.                 case 2:if(tempH>-55)tempH--;break;
  64.                 case 3:if(tempL<127)tempL++;break;
  65.                 case 4:if(tempL>-55)tempL--;break;
  66.                 default:break;
  67.            }

  68. switch(TempFlag)                                                                                                                                                                                                                                                                       
  69.        {
  70.             case 0:    //输出温度上限下限
  71.                     {
  72.                       sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);
  73.               LCD_Write_String(0,1,displaytemp);        P2_0=0;P2_2=1;P2_1=1; P1_7=0;
  74.                           break;
  75.                     }
  76.                 case 1:LCD_Write_String(0,1,"over  tempH    ") ;P2_1=0;P2_0=1;P2_2=1;P1_7=1;

  77.                        break;

  78.                 case 2:LCD_Write_String(0,1,"under  tempL   "); P2_2=0;P2_0=1;P2_1=1;P1_7=0;  
  79.                       break;
  80.                 default:break;
  81.            }

  82. if(ReadTempFlag==1)
  83. {
  84.     ReadTempFlag=0;
  85.     temp=ReadTemperature();


  86.     temperature=temp*0.0625;

  87.     temp>>=4;
  88.     if(temp>tempH)
  89.      {
  90.         TempFlag=1;  //高于高温标志
  91.                 ET2=0;
  92.      }
  93.     else if(temp<tempL)
  94.      {
  95.         TempFlag=2;  //低于低温标志
  96.                 ET2=0          ;
  97.      }
  98.     else
  99.      {
  100.        TempFlag=0;   //正常显示标志
  101.            if(temp>tempH-1)
  102.             T2csh();

  103.      }

  104.      sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值
  105.      LCD_Write_String(0,0,displaytemp);//显示第一行
  106.      LCD_Write_Char(13,0,0x01);//写入温度右上角点
  107.      LCD_Write_Char(14,0,'C'); //写入字符C
  108.   }        


  109. }
  110. }

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

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

  138. /*------------------------------------------------
  139. 按键扫描函数,返回扫描键值
  140. ------------------------------------------------*/
  141. unsigned char KeyScan(void)
  142. {
  143. unsigned char keyvalue;
  144. if(KeyPort!=0xff)
  145.    {
  146.     DelayMs(10);
  147.     if(KeyPort!=0xff)
  148.            {
  149.             keyvalue=KeyPort;
  150.             while(KeyPort!=0xff);
  151.                 switch(keyvalue)
  152.                 {
  153.                  case 0xfe:return 1;break;
  154.                  case 0xfd:return 2;break;
  155.                  case 0xfb:return 3;break;
  156.                  case 0xf7:return 4;break;
  157.                  case 0xef:return 5;break;
  158.                  case 0xdf:return 6;break;
  159.                  case 0xbf:return 7;break;
  160.                  case 0x7f:return 8;break;
  161.                  default:return 0;break;
  162.                 }
  163.           }
  164.    }
  165.    return 0;
  166. }

  167. //定时器2中断
  168. timer2() interrupt 5  
  169. {
  170. static uchar t;
  171. TF2=0;
  172. t++;
  173. if(t==20) //溢出20次就是1秒钟,晶振12Mhz
  174. {
  175.   t=0;
  176.   P10=~P10; //反转LED灯的亮灭
  177. }
  178. }


复制代码



完整源码下载:
温度可调上下限1602显示.rar (54.24 KB, 下载次数: 77)

评分

参与人数 2黑币 +53 收起 理由
admin + 50 共享资料的黑币奖励!
LXJ50 + 3 有原理图就更好了

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:215238 发表于 2017-10-24 21:13 | 只看该作者
大神 谢了
回复

使用道具 举报

板凳
ID:526896 发表于 2019-5-11 13:53 | 只看该作者
能对多个DS18B20进行设置吗
回复

使用道具 举报

地板
ID:711846 发表于 2020-4-17 11:18 | 只看该作者
有原理图吗
回复

使用道具 举报

5#
ID:106422 发表于 2020-4-18 15:15 | 只看该作者
感谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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