找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5347|回复: 13
收起左侧

基于STC15系列的温湿度检测和时钟设计 DHT11+DS1302模块

  [复制链接]
ID:449323 发表于 2020-3-10 20:01 | 显示全部楼层 |阅读模式
小菜鸡一枚,自己调节DHT11调到奔溃,舍友都在某宝上买了,差点心态奔溃也买了,还好自己天天烦师傅烦师兄终于调好了,师傅说他那个题目搜不到一模一样的,enmmmmmm,方便参考,原理图+代码+仿真,希望能帮助到你们!

制作出来的实物图如下:
2.jpg 1.png 4.png

单片机源程序如下:
  1. #include<STC15F2K60S2.H>
  2. #include"LCD1602.h"
  3. #include"DS1302.h"
  4. #include "DHT.h"
  5. unsigned char time_add[7];
  6. void LcdDisplay();
  7. void keyscan();
  8. sbit add_y=P1^0;         //调整年按键
  9. sbit add_m=P1^1;         //调整月按键3
  10. sbit add_d=P1^2;         //调整日按键
  11. sbit add_w=P1^3;         //调整星期按键
  12. sbit add_hour=P1^4;   //调整小时按键
  13. sbit add_min=P1^5;    //调整分按键
  14. sbit add_sec=P1^6;    //调整秒按键
  15. sbit  change = P1^7;

  16. void LcdDisplay(void);//显示函数
  17. void keyscan(void);//时间、日历按键调整显示函数
  18. //-------------------------------------------//
  19. //  函数名  : main()
  20. //  函数功能: 主函数
  21. //------------------------------------------//
  22. /*void main()
  23. {
  24.         LcdInit();
  25.         Ds1302Init();
  26.         while(1)
  27.           {       
  28.    
  29.         Ds1302ReadTime(); //读取时间、日历数据
  30.         LcdDisplay();        //显示时间、日历数据
  31.         keyscan(); //时间、日历的按键调整
  32.             while(!change)
  33.                    {lcd_DHT();
  34.                  
  35.         }
  36.        

  37.         }          }          */


  38. void main(void)
  39. {  
  40.     unsigned char change_flag=0;//显示类型标志位
  41.         LcdInit();
  42.         Ds1302Init();
  43.         while(1)
  44.         {       
  45.            keyscan(); //时间、日历的按键调整
  46.          if(!change)
  47.            {
  48.              Lcd1602_Delay1ms(10);//防抖
  49.              if(!change)
  50.                  {       
  51.                  change_flag=!change_flag;//按下一次change,改变显示状态
  52.                  LCD_cls();//清屏
  53.                  }
  54.                  while(!change);
  55.            }
  56.            else if(change_flag==0)
  57.            {
  58.                    Ds1302ReadTime(); //读取时间、日历数据
  59.            LcdDisplay();        //显示时间、日历数据
  60.            }
  61.            else
  62.             lcd_DHT();
  63.           
  64.         }
  65.        
  66. }                 
  67. //-------------------------------------------------//
  68. //  函数名       : keyscan()
  69. //  函数功能                :时间、日历按键调整显示函数
  70. //-------------------------------------------------//
  71. void keyscan()                                                               
  72. {
  73.    Ds1302Write(0x8E,0x00);         //打开写保护功能
  74.    if( add_sec==0)                //秒调整按键
  75.    {
  76.     time_add[0]=(TIME[0]>>4)*10+(TIME[0]&0x0F);
  77.              //把当前秒的BCD码格式转换为十进制数
  78.     time_add[0]=(time_add[0]+1)%60 ;  //秒加1
  79.     TIME[0]=(time_add[0]/10<<4)|(time_add[0]%10);
  80.              //秒的十进制数格式转换为BCD码
  81.     Ds1302Write(WRITE_RTC_ADDR[0], TIME[0]);         
  82.             //调整好的秒钟写入DS1302
  83.     while(!add_sec);
  84.      }
  85. if( add_min==0)                //分调整按键
  86.   { time_add[1]=(TIME[1]>>4)*10+(TIME[1]&0x0F);
  87.             //把当前分的BCD码格式转换为十进制数
  88.     time_add[1]=(time_add[1]+1)%60 ;   //分加1
  89.     TIME[1]=(time_add[1]/10<<4)|(time_add[1]%10);
  90.            //分的十进制数格式转换为BCD码
  91.     Ds1302Write(WRITE_RTC_ADDR[1], TIME[1]);       
  92.            //调整好的分钟写入DS1302
  93.        while(!add_min);}
  94. if( add_hour==0)                //小时调整按键
  95.   {
  96.     time_add[2]=(TIME[2]>>4)*10+(TIME[2]&0x0F);
  97.            //把小时的BCD码格式转换为十进制数
  98.     time_add[2]=(time_add[2]+1)%24 ;  //小时加1
  99.     TIME[2]=(time_add[2]/10<<4)|(time_add[2]%10);
  100.            //小时的十进制数格式转换为BCD码
  101.     Ds1302Write(WRITE_RTC_ADDR[2], TIME[2]);
  102.         //调整好的小时写入DS1302
  103.      while(!add_hour);
  104. }
  105. if( add_d==0)                //日调整按键
  106.   {
  107.     time_add[3]=(TIME[3]>>4)*10+(TIME[3]&0x0F);
  108.          //把日的BCD码格式转换为十进制数
  109.     time_add[3]=(time_add[3]+1)%32 ;   //日加1
  110.     TIME[3]=(time_add[3]/10<<4)|(time_add[3]%10);
  111.          //日的十进制数格式转换为BCD码
  112.     Ds1302Write(WRITE_RTC_ADDR[3], TIME[3]);       
  113.          //调整好的日写入DS1302
  114.      while(!add_d);}
  115. if( add_m==0)                //月调整按键
  116.   {
  117.     time_add[4]=(TIME[4]>>4)*10+(TIME[4]&0x0F);
  118.          //把月的BCD码格式转换为十进制数
  119.     time_add[4]=(time_add[4]+1)%13 ;   //月加1
  120.     TIME[4]=(time_add[4]/10<<4)|(time_add[4]%10);
  121.         //月的十进制数格式转换为BCD码
  122.     Ds1302Write(WRITE_RTC_ADDR[4], TIME[4]);       
  123.         //调整好的月写入DS1302
  124.    while(!add_m);}
  125. if( add_w==0)                //星期调整按键
  126.   { time_add[5]=(TIME[5]>>4)*10+(TIME[5]&0x0F);
  127.           //把星期的BCD码格式转换为十进制数
  128.     time_add[5]=(time_add[5]+1)%7 ;   //星期加1
  129.     TIME[5]=(time_add[5]/10<<4)|(time_add[5]%10);
  130.          //星期的十进制数格式转换为BCD码
  131.     Ds1302Write(WRITE_RTC_ADDR[5], TIME[5]);       
  132.          //调整好的星期写入DS1302
  133.    while(!add_w);}
  134. if( add_y==0)                //年调整按键
  135.   { time_add[6]=(TIME[6]>>4)*10+(TIME[6]&0x0F);
  136.          //把年的BCD码格式转换为十进制数
  137.     time_add[6]=(time_add[6]+1)%100 ;    //年加1
  138.     TIME[6]=(time_add[6]/10<<4)|(time_add[6]%10);
  139.         //年的十进制数格式转换为BCD码
  140.     Ds1302Write(WRITE_RTC_ADDR[6], TIME[6]);       
  141.         //调整好的年写入DS1302
  142.    while(!add_y);}
  143. }
  144. //------------------------------------------------//
  145. //  函数名        : LcdDisplay()
  146. //  函数功能          : 显示函数
  147. //-----------------------------------------------//
  148. void LcdDisplay()
  149. {
  150.         LcdWriteCom(0x80+0X40);
  151.         LcdWriteData('T');                                    //显示"T"
  152.         LcdWriteData(':');                                    //显示":"
  153.         LcdWriteData('0'+TIME[2]/16);                //时
  154.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  155.         LcdWriteData('-');
  156.         LcdWriteData('0'+TIME[1]/16);                //分
  157.         LcdWriteData('0'+(TIME[1]&0x0f));       
  158.         LcdWriteData('-');
  159.         LcdWriteData('0'+TIME[0]/16);                //秒
  160.         LcdWriteData('0'+(TIME[0]&0x0f ));
  161.     LcdWriteCom(0x80);
  162.     LcdWriteData('D');                    //显示"D"
  163.     LcdWriteData(':');                            //显示":"
  164.         LcdWriteData('2');
  165.         LcdWriteData('0');
  166.         LcdWriteData('0'+TIME[6]/16);                //年
  167.         LcdWriteData('0'+(TIME[6]&0x0f));
  168.         LcdWriteData('-');
  169.         LcdWriteData('0'+TIME[4]/16);                //月
  170.         LcdWriteData('0'+(TIME[4]&0x0f));
  171.         LcdWriteData('-');
  172.         LcdWriteData('0'+TIME[3]/16);                //日
  173.         LcdWriteData('0'+(TIME[3]&0x0f));
  174.         LcdWriteCom(0x8D);
  175.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                         
  176. }
复制代码
3.png
所有资料51hei提供下载:
原理图 程序 仿真.zip (1.91 MB, 下载次数: 264)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:102963 发表于 2020-3-11 17:21 | 显示全部楼层
仿真是不能用吗?
回复

使用道具 举报

ID:449323 发表于 2020-4-4 20:06 | 显示全部楼层
songxia8013 发表于 2020-3-11 17:21
仿真是不能用吗?

仿真能用啊,我可能放错了文件,抱歉
回复

使用道具 举报

ID:716005 发表于 2020-4-5 16:46 | 显示全部楼层
原理图里面是空白的呀
回复

使用道具 举报

ID:748487 发表于 2020-5-10 17:32 | 显示全部楼层
多谢分享
回复

使用道具 举报

ID:723845 发表于 2020-5-11 14:16 | 显示全部楼层
我最近也在学单片机,刚好做到DS1302这里了,用的仿真。我能正确的写数据到1302,但是读回来的数据有问题,在编译软件上跑程序看参数值,回读函数读回来的值是没有问题的,但是仿真就是不对。。。。请问度回来的数据需要什么特殊处理吗  ?BCD转码?
回复

使用道具 举报

ID:449323 发表于 2020-6-12 17:32 | 显示全部楼层
HEHELO 发表于 2020-5-11 14:16
我最近也在学单片机,刚好做到DS1302这里了,用的仿真。我能正确的写数据到1302,但是读回来的数据有问题, ...

抱歉,好久没有上论坛了,DS1302读入的是BCD码,要在LCD1602上显示转成ASSII码
回复

使用道具 举报

ID:449323 发表于 2020-6-12 17:35 | 显示全部楼层
wbbb 发表于 2020-4-5 16:46
原理图里面是空白的呀

抱歉,不知道是这个情况,我是在立创EDA上面画的,导出到AD,没想到导出是空白的
回复

使用道具 举报

ID:449323 发表于 2020-6-12 17:51 | 显示全部楼层
评论区小伙伴说仿真不能用,我找了一下我的仿真都删完了,enmmmmm,sorry,也有小伙伴说原理图是空的,我重新下载了看了一遍确实是,抱歉了,这里附上我的原理图和PCB,PCB太丑而且跳线太多,别太吐槽啊,里面的文件立创和AD的我都有导出放进去,看看哪个能打开了,应该不是空白的了。DHT11我调的时候因为菜花了许多时间,建议大家看看DHT11工作的时序问题再写哈。

原理图 PCB.zip

96.32 KB, 下载次数: 40, 下载积分: 黑币 -5

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:449323 发表于 2020-6-12 17:52 | 显示全部楼层
wbbb 发表于 2020-4-5 16:46
原理图里面是空白的呀

抱歉,确实是空白的,我又补发了我的原理图和PCB供大家参考。
回复

使用道具 举报

ID:915731 发表于 2021-5-19 15:04 | 显示全部楼层
上了板子不显示应该怎么处理咧
回复

使用道具 举报

ID:449323 发表于 2021-10-15 09:25 | 显示全部楼层
warisyin 发表于 2021-5-19 15:04
上了板子不显示应该怎么处理咧

这个问题情况很多吧,首先排查硬件问题,自己做的板子可能有点问题,程序也需要和你的硬件放在一起调试的
回复

使用道具 举报

ID:982170 发表于 2021-11-18 18:18 | 显示全部楼层
那我用stc15w4k60s4程序,原理图啥的是不是都一样?

回复

使用道具 举报

ID:982170 发表于 2021-12-5 17:59 | 显示全部楼层
楼主,dht11的程序在哪啊?我只需要温湿度的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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