久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5704|回復: 13
打印 上一主題 下一主題
收起左側

基于STC15系列的溫濕度檢測和時鐘設計 DHT11+DS1302模塊

  [復制鏈接]
跳轉到指定樓層
樓主
ID:449323 發表于 2020-3-10 20:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小菜雞一枚,自己調節DHT11調到奔潰,舍友都在某寶上買了,差點心態奔潰也買了,還好自己天天煩師傅煩師兄終于調好了,師傅說他那個題目搜不到一模一樣的,enmmmmmm,方便參考,原理圖+代碼+仿真,希望能幫助到你們!

制作出來的實物圖如下:


單片機源程序如下:
  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. }
復制代碼

所有資料51hei提供下載:
原理圖 程序 仿真.zip (1.91 MB, 下載次數: 264)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
原理圖里面是空白的呀
回復

使用道具 舉報

5#
ID:748487 發表于 2020-5-10 17:32 | 只看該作者
多謝分享
回復

使用道具 舉報

6#
ID:723845 發表于 2020-5-11 14:16 | 只看該作者
我最近也在學單片機,剛好做到DS1302這里了,用的仿真。我能正確的寫數據到1302,但是讀回來的數據有問題,在編譯軟件上跑程序看參數值,回讀函數讀回來的值是沒有問題的,但是仿真就是不對。。。。請問度回來的數據需要什么特殊處理嗎  ?BCD轉碼?
回復

使用道具 舉報

7#
ID:449323 發表于 2020-6-12 17:32 | 只看該作者
HEHELO 發表于 2020-5-11 14:16
我最近也在學單片機,剛好做到DS1302這里了,用的仿真。我能正確的寫數據到1302,但是讀回來的數據有問題, ...

抱歉,好久沒有上論壇了,DS1302讀入的是BCD碼,要在LCD1602上顯示轉成ASSII碼
回復

使用道具 舉報

8#
ID:449323 發表于 2020-6-12 17:35 | 只看該作者
wbbb 發表于 2020-4-5 16:46
原理圖里面是空白的呀

抱歉,不知道是這個情況,我是在立創EDA上面畫的,導出到AD,沒想到導出是空白的
回復

使用道具 舉報

9#
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 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:449323 發表于 2020-6-12 17:52 | 只看該作者
wbbb 發表于 2020-4-5 16:46
原理圖里面是空白的呀

抱歉,確實是空白的,我又補發了我的原理圖和PCB供大家參考。
回復

使用道具 舉報

11#
ID:915731 發表于 2021-5-19 15:04 | 只看該作者
上了板子不顯示應該怎么處理咧
回復

使用道具 舉報

12#
ID:449323 發表于 2021-10-15 09:25 | 只看該作者
warisyin 發表于 2021-5-19 15:04
上了板子不顯示應該怎么處理咧

這個問題情況很多吧,首先排查硬件問題,自己做的板子可能有點問題,程序也需要和你的硬件放在一起調試的
回復

使用道具 舉報

13#
ID:982170 發表于 2021-11-18 18:18 | 只看該作者
那我用stc15w4k60s4程序,原理圖啥的是不是都一樣?

回復

使用道具 舉報

14#
ID:982170 發表于 2021-12-5 17:59 | 只看該作者
樓主,dht11的程序在哪啊?我只需要溫濕度的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文 | 免费看黄色国产 | 久久精品免费一区二区 | 久久99精品久久久97夜夜嗨 | 日韩成人一区 | 91亚洲精选 | 日韩免费视频 | 午夜激情网| 免费一级欧美在线观看视频 | 国产一区二 | 日韩精品一区在线观看 | 一级做a爰片性色毛片16 | 亚洲午夜三级 | 国产一级一级 | 欧美精品第一区 | 亚洲欧美成人影院 | 欧美黄a | 天堂一区在线 | 久热国产在线 | 精品久久免费 | 天天拍天天射 | 久久99久久99 | h在线看| 青青草在线播放 | 国产欧美在线播放 | 伊人影院99 | 国产精品毛片久久久久久 | 精品国产青草久久久久福利 | 久久美女网 | 欧美一极视频 | 神马九九 | 国产网站在线免费观看 | 国产一区二区黑人欧美xxxx | 伊人亚洲| av一级久久 | 日日日操 | 精品久久久久一区二区国产 | 欧美精品一区二区三区在线 | 色婷婷综合网站 | 中文字幕的av | 久久久久国产精品人 |