找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6563|回复: 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 单片机教程网

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