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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

自制51單片機定時器,控制USB口通斷電 附源碼和電路

[復制鏈接]
跳轉到指定樓層
樓主
這幾天放寒假,又因為xx宅家里無所事事

考率到學校宿舍的廁所沒有裝排氣扇,每次有人方便后下個人要等非常長的時間才敢進去……

為此,我萌生了在宿舍廁所裝個排氣扇的想法。。

宿舍廁所沒有插座,排氣扇的供電只能用電池解決,這里采用18650鋰電池供電

考慮到會有人上完廁所會像忘關燈一樣忘記關排氣扇,導致電池電量白白耗盡。

為避免這種情況發生

我設計了一個定時器,用于控置USB口的通斷電

↓↓


功能:
1、靠下的一排燈表示剩余的時間(一個燈5分鐘,最多30分鐘倒計時),靠上的黃燈閃爍表正在倒計時
2、右下角的按鍵鏈接著充電寶的升壓板,按一下啟動電源,按兩下開關充電寶開發板上的應急燈
3、啟動電源后默認兩盞燈亮(10分鐘倒計時)
4、中間靠右的按鍵是“時間+”鍵,按一下新點亮一盞燈(加5分鐘),最多亮6盞
5、中間靠左的按鍵是“時間-”鍵,按一下熄滅一盞燈(減5分鐘),最后一盞不會滅(最少設置5分鐘倒計時)
6、左邊的鍵是計時鍵,設置好時間按下開始倒計時,靠上的黃燈閃爍,USB口供電。時間一到斷電,所有燈熄滅。

現在還沒返校,目前只做好了板,等開學再把風扇裝上

注:

風扇自然是用帶USB插頭的5v小風扇



因為是用鋰電池供電(3.7V),所以需要一塊升壓板將電壓升至5V給單片機和小風扇使用

正好家里有一塊以前從充電寶上拆下來的升壓兼鋰電池保護板



用以前剪下的元件引腳引出,架在萬能板上

       

附1
電路原理圖


圖片里一個開關的網絡標簽是接的是Power,連接的是充電寶的開發板

附2:源代碼
  1. #include <reg51.h>      //此文件中定義了51單片機的一些特殊功能寄存器

  2. typedef unsigned char u8;    //對數據類型聲明定義
  3. typedef unsigned int u16;
  4. #include <intrins.h>

  5. u16 j;   //時間寄存器

  6. sbit LED1=P2^0;   //5(分鐘)
  7. sbit LED2=P2^1;   //10
  8. sbit LED3=P2^2;   //15
  9. sbit LED4=P2^3;   //20
  10. sbit LED5=P2^4;   //25
  11. sbit LED6=P2^5;   //30

  12. sbit Go=P0^7;     //開始·停止鍵
  13. sbit Time2=P0^6;  //時間-
  14. sbit Time1=P0^5;  //時間+
  15. sbit KEY=P0^4;    //繼電器觸發控制端
  16. sbit LED7=P0^3;   //計時燈

  17. void delay(u16 x)      //延時函數,x=1時,大約延時10us
  18. {
  19.         while(x--);
  20. }

  21. void InitTimer1()      //定時器初始化函數
  22. {
  23.         TMOD=0x10;    //使用定時器1
  24.         TH1=0xFC;     //裝入初值,1000ms后觸發中斷
  25.         TL1=0x18;
  26.         EA=1;        //打開總中斷
  27.         ET1=1;       //定時器1中斷允許
  28. }

  29. void key()      //按鍵判斷函數
  30. {
  31.         if(Go==0)       //啟動鍵
  32.         {
  33.                 delay(1000);    //消抖
  34.                 if(Go==0)
  35.                 {
  36.                         if(P2!=0xff)   //如果P2口接的LED至少有一盞亮起
  37.                         {
  38.                                 if(KEY==1)   //如果繼電器常開端未閉合
  39.                                 {
  40.                                         KEY=0;       //繼電器常開端閉合,USB口上電
  41.                                         j=0;         //時間寄存器歸零
  42.                                         TR1=1;       //定時器開始計時
  43.                                 }
  44.                                 else    //如果繼電器常開端已經閉合(按鍵被重復按下)
  45.                                 {
  46.                                         KEY=1;   //繼電器回常閉端
  47.                                         LED7=1;  //計時燈滅
  48.                                         TR1=0;   //關閉定時器
  49.                                 }
  50.                         }
  51.                 }
  52.                 while(!Go);
  53.         }
  54.         if(Time1==0)   //時間+
  55.         {
  56.                 delay(1000);  //消抖
  57.                 if(Time1==0)
  58.                 {
  59.                         if(P2==0xc0)  //如果6盞燈全亮
  60.                         {
  61.                                 P2=0xc0;  //那就讓它全亮吧(防止被移位)
  62.                         }
  63.                         else
  64.                         {
  65.                                 P2=P2<<=1;  //移位,新的燈被點亮
  66.                         }
  67.                 }
  68.                 while(!Time1);
  69.         }
  70.         if(Time2==0)   //時間-
  71.         {
  72.                 delay(1000);  //消抖
  73.                 if(Time2==0)
  74.                 {
  75.                         if(P2==0xfe)  //如果只剩下一盞燈亮
  76.                         {
  77.                                 P2=0xfe;  //最后一盞燈不能滅(防止被移位)
  78.                         }
  79.                         else if(P2==0xc0)  //因出現未知BUG(燈全亮時運行右移函數鍵會直接滅兩個燈)故加此代碼
  80.                         {
  81.                                 P2=0xe0;  //強行滅一燈
  82.                         }
  83.                         else
  84.                         {
  85.                                 P2=P2>>1|80;  //移位,新的燈被點亮
  86.                         }
  87.                 }
  88.                 while(!Time2);
  89.         }
  90. }

  91. void timer()   //計時函數
  92. {
  93.         if(j==300)     //5分鐘計時
  94.         {
  95.                 if(P2!=0xff)    //如果還有至少一盞燈亮
  96.                 {
  97.                         if(P2==0xc0)  //因出現未知BUG(燈全亮時運行右移函數鍵會直接滅兩個燈)故加此代碼
  98.                         {
  99.                                 P2=0xe0;  //強行滅一燈
  100.                                 j=0;  //時間寄存器歸零
  101.                         }
  102.                         else if(P2!=0xfe)  //所亮的燈數在一盞以上
  103.                         {
  104.                                 P2=P2>>1|80;   //關閉一盞燈
  105.                                 j=0;  //時間寄存器歸零

  106.                         }
  107.                         else   //只剩一盞燈亮
  108.                         {
  109.                                 if(j==300)   //最后5分鐘
  110.                                 {
  111.                                         KEY=1;   //繼電器回常閉端
  112.                                         LED7=1;  //計時燈滅
  113.                                         TR1=0;   //關閉定時器
  114.                                         j=0;     //時間寄存器歸零
  115.                                         P2=0x7f; //關閉最后一盞燈
  116.                                 }
  117.                         }
  118.                 }
  119.                 else
  120.                 {
  121.                         KEY=1;   //繼電器回常閉端
  122.                         LED7=1;  //計時燈滅
  123.                         TR1=0;   //關閉定時器
  124.                         j=0;     //時間寄存器歸零
  125.                 }
  126.         }
  127. }

  128. void main()
  129. {
  130.         LED1=0;   //初始設置兩個LED亮起
  131.         LED2=0;
  132.         InitTimer1();    //定時器初始化
  133.         while(1)
  134.         {
  135.                 key();     //按鍵判斷
  136.                 timer();   //時間判斷
  137.         }
  138. }

  139. void Timer1Interrupt() interrupt 3
  140. {
  141.         u16 i;
  142.         TH1=0xFC;    //重裝初值
  143.         TL1=0x18;
  144.         i++;
  145.         if(i==1000)
  146.         {
  147.                 i=0;
  148.                 j++;      //時間寄存器(1S)
  149.                 LED7=~LED7;   //計時燈
  150.         }
  151. }
復制代碼

聲明:

       制作過程可能發生意外,特別提醒實驗者注意安全
         
       本人完全出于業余愛好撰寫該文,由于能力有限疏漏乃至錯誤在所難免,歡迎大家指正

全部資料51hei下載地址:

定時排氣扇.rar (781.66 KB, 下載次數: 35)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:935837 發表于 2021-6-10 09:23 來自手機 | 只看該作者
兄弟 我有點想要你這個東西
回復

使用道具 舉報

板凳
ID:437129 發表于 2024-11-15 09:56 | 只看該作者
老師您好,按照您的程序做了,倒計時結束,最后一個等燈滅掉后計時燈還會一直閃爍,繼電器也不會釋放,等多長時間都是這樣,測試了很多次都是一樣,麻煩您指導。謝謝!
回復

使用道具 舉報

地板
ID:437129 發表于 2024-11-15 09:58 | 只看該作者
我是直接下載的附件壓縮包程序,程序和您網頁上的一模一樣。
回復

使用道具 舉報

5#
ID:437129 發表于 2024-11-15 10:00 | 只看該作者
計時燈和繼電器更換到單片機其它口也是一樣的。
回復

使用道具 舉報

6#
ID:345506 發表于 2024-12-7 15:06 | 只看該作者
動手能力挻強的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97日日碰人人模人人澡分享吧 | 日本在线播放一区二区 | 欧美日韩中文在线 | 男人天堂久久 | 欧州一区二区三区 | 一区二区三区视频在线观看 | 91视频一区二区 | 国产精品一区二区欧美黑人喷潮水 | 国产一区二区毛片 | 视频一区二区三区中文字幕 | 成人一区二区三区 | 九九国产在线观看 | 春色av| 99亚洲国产精品 | 91 在线| 免费网站在线 | 你懂的免费在线 | 99精品一区二区三区 | av中文字幕在线观看 | 欧美一二区 | 91精品国产综合久久香蕉麻豆 | 国产一区二区视频在线观看 | 中文字幕一区二区三区日韩精品 | 久久黄色网 | 夜夜爽99久久国产综合精品女不卡 | 国产成人精品免高潮在线观看 | 国产精品国产成人国产三级 | 欧美国产一区二区 | 成人不卡在线 | 日韩不卡一区二区 | 日日日日日日bbbbb视频 | 色噜噜狠狠色综合中国 | 91性高湖久久久久久久久_久久99 | 精精国产视频 | 91在线电影| 精品一区二区久久久久久久网站 | 国产成人精品午夜 | 日韩国产免费观看 | 欧美一区二区三区在线看 | 中文字幕av亚洲精品一部二部 | 日韩在线观看精品 |