目录

项目:基于51单片机ds1302时钟、ds18b20的恒温器

功能说明:

运行流程:

效果展示:

供电方式:

用途:

提高:

附:


​                                                                                  广西河池学院

广西高校重点实验室培训基地

系统控制与信息处理重点实验室

本篇博客来自河池学院:OpenWRT无线路由组

写作时间:2020年8月12日22:00:00

首先要感谢学长学姐们在制作项目的时间里指导,期间遇到许多的问题,有的得到了解决,有的实在解决不了的只能另选方法,在问题中发现、学习和吸取教训才重要:

第一:做一个工程项目前,一定要设计和规划好项目,要明确达到什么功能,有目标的去做。

第二:一定要建好单独项目文件,不要混在一起,工程名尽量使用英文命名,中文命名有几率会使工程无法使用或出现故障。

第三:在使用多个模块时,要注意各个模块使用的引脚是否重复,例如:LED灯、蜂鸣器同时无法与12864液晶显示屏使用,可能是由于LED灯所使用的P2端口与12864的使能信号端、读/写选择端、数据/命令选择端冲突。

第四:使用模块时,要仔细辨认器件是否插入正确,若插反器件极易发烫、烧坏,损坏元器件。

第五:使用函数封装,程序简洁明了,使用简便。

项目:基于51单片机ds1302时钟、ds18b20的恒温器

所需模块:51单片机,STC15F2K60S2,DS1302时钟芯片,DS18B20温度传感器,LCD12864,矩阵按键,独立按键,蜂鸣器,LED

如图:

功能说明:

  1. 采用STC15F2K60S2芯片、DS1302时钟芯片、DS18B20温度传感器,LCD12864、独立按键,矩阵键盘。
  2. 开机进入第一界面,显示时间,作者。
  3. 第二界面显示实时温度,上下限,以及温度显示是否正常提示。
  4. 按下第三个独立按键则进入第三界面,显示时间,时间不会因为切换界面而从新开始,并可以后台提供温度报警。

运行流程:

①开机问候,时间显示在12864上,温度在上下限范围时仅亮三个led灯作为待机指示,当温度超出设定范围时则led全亮,蜂鸣器也开始响,开始声光报警。

②第一界面显示时间,可通过矩阵键盘调节年、月、日、时、分。(秒不必要调)按下第一个独立按键就跳到第二界面,采用DS18B20+12864显示温度和上下限值 。按下第三个独立按键跳回第一界面继续走时,即在第非时间显示界面时,时间在后台正常走。温度达到限值则触发流水灯闪亮与蜂鸣器鸣叫,同时在界面底部显示“温度超出范围”,温度在范围内则显示“温度稳定”。

从新切回到时间界面时,温度仍然实时监测,只是在最后一行显示“温度超出范围”或“温度稳定”。

④时间,温度报警可以同时起作用。

效果展示:

(拍照太快,时间还没有显示)

(温度正常时)

(温度报警时)

(时间持续走)

供电方式:

USB直连或外接电池组。

用途:

家居日常

提高:

完成上述功能后,可以添加其他模块,如温湿度传感器,红外接收修改报警范围,以扩展恒温器用途与便捷性。

附:/**************LCD12864上显示时钟、实时温度、报警温度上下限*************************
原创于河池学院OpenWRT无线路由组:小蔡
显示屏第一页为时钟,可用矩阵按键来控制年月日时分秒的值。
独立按键可以实现翻页功能,当由时钟页面跳到报警器页面时,时钟的值依旧跳动
第二页为温度报警器,可用独立按键调节温度上限,矩阵按键调节温度下限,
当温度高于上限值或者低于下限值时,显示屏出现“温度超出范围”,并拉响蜂鸣,LED灯闪烁以达到报警效果。
若温度正常,显示屏将显示“温度稳定”;
*********************************************************************************/#include "DS18B20.H"
#include "LCD12864.H"
#include "DS1302.h"
#include <stdio.h>uchar table1[]="当前温度        ";
uchar table2[]="上限值        度";
uchar table3[]="下限值        度";
uchar table4[]="  温度超出范围  ";
uchar table5[]="    温度稳定    ";unsigned char Time_buf[8]={0x20,0x00,0x00,0x00,0x15,0x08,0x03,0x20};//年,秒,分,时,日,月,星期,年sbit BUZZ = P1^1;     //定义蜂鸣器引脚sbit key1 = P3^2;     //独立按键右一切换到温度显示界面
sbit key2 = P3^3;      //上限加一
sbit key3 = P3^4;   //左一切换到时间界面
sbit key4 = P3^5;        //上限减一/*================================================================================按键调节时间
=================================================================================*/
void SetTime(void)
{uint i;switch(array())                                //矩阵按键扫描{case 0:    Time_buf[7] = Time_buf[7] + 0x01;break;            //年+case 1: Time_buf[5] = Time_buf[5] + 0x01;break;     //月+case 2: Time_buf[4] = Time_buf[4] + 0x01;break;     //日+case 8:    Time_buf[3] = Time_buf[3] + 0x01;break;     //时+case 9: Time_buf[2] = Time_buf[2] + 0x01;break;     //分+case 4:    Time_buf[7] = Time_buf[7] - 0x01;break;            //年-case 5: Time_buf[5] = Time_buf[5] - 0x01;break;     //月-case 6: Time_buf[4] = Time_buf[4] - 0x01;break;     //日-case 12:Time_buf[3] = Time_buf[3] - 0x01;break;     //时-case 13:Time_buf[2] = Time_buf[2] - 0x01;break;     //分-default:;}for( i = 0; i < 8;i++){if( (Time_buf[i] & 0x0F) > 9){Time_buf[i] = ((Time_buf[i]+0x10)&0xF0);}}DS1302_Data_Input(DS1302_CONTROL_ADD,0x00);                //关闭写保护DS1302_Data_Input(DS1302_MIN_ADD,Time_buf[2]);        //分DS1302_Data_Input(DS1302_HR_ADD,Time_buf[3]);            //时DS1302_Data_Input(DS1302_DAY_ADD,Time_buf[4]);        //日DS1302_Data_Input(DS1302_MONTH_ADD,Time_buf[5]);    //月DS1302_Data_Input(DS1302_YEAR_ADD,Time_buf[7]);        //年DS1302_Data_Input(DS1302_CONTROL_ADD,0x80);                //打开写保护}/*================================================================================主函数
=================================================================================*/
void main()
{unsigned char sec_buf = 0x00;    //用来保存上一次的秒数uint i,z;int hight=27,low=25;  //定义上限为27度,下限为20度。uchar L, H;init_12864();                   //12864初始化DS1302_Init();                    //DS1302初始化DS1302_Write_Time();            //初始化数据print(4,0,"  祝你生活愉快  ");get:    print(1,0,"    年  月  日");print(2,0,"    时  分  秒");print(3,0,"华人牌温度报警器");/*----------------------------------------------------------------------------------    时间显示
----------------------------------------------------------------------------------*/while(1){DS1302_Read_Time();SetTime(); //设定时间if(Time_buf[1] != sec_buf)                    //当前时间与原来时间不同{    sec_buf = Time_buf[1];                        //把当前的秒数赋值给临时变量display_int(1,0,ChangeTime(Time_buf[0]));display_int(1,1,ChangeTime(Time_buf[7]));        //年display_int(1,3,ChangeTime(Time_buf[5]));   //月display_int(1,5,ChangeTime(Time_buf[4]));   //日display_int(2,1,ChangeTime(Time_buf[3]));   //时display_int(2,3,ChangeTime(Time_buf[2]));   //分display_int(2,5,ChangeTime(Time_buf[1]));        //秒}if(key1 == 0){init_12864();break;//按下切换到温度显示界面}}//-----------------------------------------------------------
//-----------------------------------------------------------//作用:    将三行汉子固定显示,不刷新display(1,0,&table1);  //在第1行显示display(2,0,&table2);display(3,0,&table3);/*----------------------------------------------------------------------------------温度显示
----------------------------------------------------------------------------------*/while(1){Init_DS18B20();              //初始化DS18B20Write_Byte(0xcc);          //发送跳跃ROM指令Write_Byte(0x44);          //发送温度转换指令Init_DS18B20();              //初始化DS18B20Write_Byte(0xcc);          //发送跳跃ROM指令Write_Byte(0xbe);         //读取DS18B20暂存器值L = Read_Byte();          //读高速暂存器的byte0(低字节,二进制数)H = Read_Byte();     //读高速暂存器的byte1(高字节,二进制数)i = H;                      //低8位赋值给ii <<= 8;                    // 低8位的数据整体左移8位i |= L;                      // 高8位的数据填充低8位移走的空位,组成16位的二进制赋值给ii = i * 0.0625 * 10 + 0.5;  //读到的二进制数据转换温度的算法LcdDisplay(i); //温度显示函数LcdDisplay_hight(hight);LcdDisplay_low(low);if((i>=hight*10)|(i<=low*10)) //温度高于上限就报警{display(4,0,&table4);for(z = 0;z<5;z++){                                            BUZZ = 0;    //拉低蜂鸣器响//    P2=1;//会出错,啥原因暂不晓得....Delay50ms();BUZZ =~BUZZ;//    P2=~P2;//会出错,啥原因暂不晓得....Delay50ms();}P2=1;Delay50ms();P2=~P2;Delay50ms();}else{display(4,0,&table5);}//---------------------------------------------------------------------
//按键调上限if(key2==0)    //当key2按下一次时,上限温度加一,一直按一直加{hight++;}if(key4==0)   //当key4按下一次时,上限温度减一,一直按一直减{hight--;}
//-----------------------------------------------------------------------
//调下限if(array()==11)    //当key11按下一次时,下限温度加一,一直按一直加{low++;}if(array()==15)   //当key15按下一次时,下限温度减一,一直按一直减{low--;}
//--------------------------------------------------------------------.........................文章限制,需要请复制连接至网盘下载完整代码。

链接:https://pan.baidu.com/s/1lur5jEOUVKhlhBRiC7Vc-Q 
提取码:1awg

基于51单片机ds1302时钟、ds18b20、lcd12864的恒温器相关推荐

  1. 基于51单片机的时钟系统

     这一次带来的项目是课程设计级别的基于51单片机的时钟系统,本次的项目共有两种,一种是基础功能时钟,上电后自动从00-00-00开始计时,另一种加上了调时功能,上电后自动从00-00-00开始,当需要 ...

  2. 基于51单片机电子时钟

    keil工程与protues仿真电路 1 基于51单片机用LCD1602实现时-分的显示 2. 按键控制时-分的调整 3. 能实现整时报时的功能(蜂鸣器响) 4. 闹钟模式 5.按键切换模式(模式一: ...

  3. 基于51单片机DS1302的LCD电子时钟

    设计要求:设计一个LCD显示的电子时钟,系统是以51单片机为控制核心,通过DS1302,使用LCD显示器显示时间,"年-月-日-时-分-秒-星期",使用4个功能键K1-K4,其中K ...

  4. 基于51单片机的智能门禁系统仿真LCD12864显示原理图程序

    硬件设计 本电路是由STC89C52 单片机为控制核心,射频卡信息由MFRC522模块读出,通过MCU在LCD12864上显示,通过按键完成密码验证和修改密码的功能.整个门禁系统框图如图3-1所示. ...

  5. 51单片机DS1302时钟LCD1602显示(可以按键设置时钟)

    DS1302实时时钟具有能计算2100年之前的秒.分.时.日.日期.星期.月.年的能力,还有闰年调整的能力. 图1:DS1302引脚示意图 其中: X1.X2:32.768KHz晶振接入引脚. GND ...

  6. (九)51单片机——DS1302时钟

    目录 DS1302介绍 引脚定义和应用电路 寄存器定义 命令字 时序定义 代码编写 今天,我们的任务是要编写一个用51开发板编写的可调小时钟,接下来就让我们一步一步来实现它吧! DS1302介绍 DS ...

  7. 51单片机DS1302时钟芯片应用Proteus仿真

    系列文章目录 第一章 51单片机Proteus仿真(一) DS1302使用 文章目录 系列文章目录 前言 一.DS1302时序解读 二.BCD码转十进制解读 三.Proteus仿真 四.详细代码 前言 ...

  8. 51单片机——DS1302时钟

    目录 1.前言 1.1 实验现象 2. DS1302的介绍 2.1 DS1302的引脚定义以及应用电路 2.2 DS1302内部结构 2.21  DS1302内部特殊寄存器 2.22 时序 2.3 B ...

  9. (给自己看)51单片机DS1302时钟芯片

    老规矩先上DS1302.c的代码 #include <regx52.h>//首先 DS1302_Init(); // DS1302_SetTime();//再在while中DS1302_R ...

最新文章

  1. VsCode中文乱码解决方法
  2. Android全屏与透明状态栏
  3. c# socket接收字符串_socket通信很难?这一文让你轻松搞定!
  4. c++ 虚继承与继承的差异
  5. gulp 实现sass自动化 ,监听同步
  6. 基金本子提交在即!这11个问题现在改还来得及
  7. 新型 Linux 病毒,脚本超 1000 行,功能复杂
  8. C++ vector 类学习笔记(转)
  9. 安卓手机小说阅读器_粉笔免费小说阅读器app下载-粉笔免费小说阅读器APP手机版v1.0.1...
  10. QQ2007密码盗取程序介绍(参考部分网上代码)
  11. 计算机运维需要那些知识,运维必知必备!73页计算机基础知识,新手小白也能轻松读懂...
  12. NC21499-今天,你惹对象生气了吗(dfs)
  13. 20155307 2016-2017-2《Java程序设计》课程总结
  14. RK 3568 IDB烧录失败解决方法
  15. 使用母版页实现页面布局
  16. Python输出回文数
  17. Jude导出Java代码
  18. 华为机考1-54题总结
  19. 设计分享|单片机多音阶电子琴(汇编)
  20. 优效文件助手-【深度】都2021年了,你还只会用文件夹管理电脑文件?

热门文章

  1. ROS IDE —— RoboWare Studio
  2. NMAD-2.14b1安装
  3. 搭建wnmp开发环境
  4. PS2 键盘在win10下开机过程 收发的数据
  5. MFC radio button 设置默认选中
  6. Html单选按钮自定义样式
  7. 2021_lg_03.SQL实战:如何用sql计算用户留存问题
  8. java基于ssm的论坛贴子网站ssm论坛项目发帖子网站论坛系统论坛源码
  9. Gram矩阵与卷积网络中的卷积的直观理解
  10. shell 脚本中常见的 if [ $? -ne 0 ]; 意思