找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7692|回复: 6
打印 上一主题 下一主题
收起左侧

STC单片机制作可编程定时插座

  [复制链接]
跳转到指定楼层
楼主
学习单片机有一段时间了,除了做几个时钟当个摆设好像也没什么作品了。家里有些电器充电时间不能太长,如现在的手机有闪充功能的一般100分钟就能充满电。这样在晚上睡觉时让手机满血复活好像就有了困难(以前用的手机晚上总要充一晚上)。随想做个定时插座吧,就在做单片机数码管时钟的基础上改进。由于初始功能还不太完善,特意外接了串口下载接口!  本以为有现成装单片机的电路板能省点焊接功夫,没想到要改线路造成很多飞线,所以看起来很乱。还不如用洞洞板好!
运行过程:上电显示12:00---通过调时,调分按键设定时间---启动---开始倒计时,继电器吸合通电(运行中按键失效)---时间到继电器断开,数码管闪烁


单片机源程序:
  1. /********************************************************
  2. *********************************************************
  3. ***********        可编程定时插座       *****************
  4. ***********          初次完成程序日期:2017、3、28                   ******

  5. 程序:上电-K1,K2按键进行时分调整-K3启动(启动后按键将无效)
  6. -继电器闭合通电-开始倒计时-        倒计时结束继电器断开-完成周期

  7. ********************************************************/

  8. #include<reg51.h>
  9. #include<intrins.h>

  10. #define uchar unsigned char
  11. #define uint  unsigned int


  12. sbit s1=P3^2;
  13. sbit s2=P3^3;
  14. sbit s3=P3^4;                                 //    定义位使用端口 1,2,3,4段
  15. sbit s4=P3^5;
  16. sbit jd=P2^0;                                 //     继电器端口

  17. sbit k1=P1^1;                                 //     调时
  18. sbit k2=P1^2;                                 //     调分
  19. sbit k3=P1^3;                                 //     启动
  20. sbit GGD=P1^0;                                 //     按键公共端



  21. uchar code mum[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};        //  段码0~9
  22. uchar code display1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf} ;
  23. uchar code display2[]={0xfe,0xbf,0xf7,0xbf,0xfe,0xbf,0xf7,0xbf} ;
  24. uchar code display3[]={0xcf,0xf9,0xcf,0xf9,0xcf,0xf9} ;
  25. uchar code display4[]={0xfe,0xdf,0xef,0xf7,0xfb,0xfd} ;


  26. char sec=59,min=0,hour=12;                                                                                                //  定义全局变量 有符号字符型
  27. uint cnt;


  28. /***************************************************************************
  29. ***************  函数名:delay                  ****************************
  30. ***************  函数功能:延时函数             ****************************
  31. ***************  输入:                         ****************************
  32.                                  输出:
  33. ***************************************************************************/



  34. void delay(uchar x)                                                                                                                         //  延时函数
  35. {
  36.   uchar i,j;
  37.   for(;x>0;x--)
  38.   for(i=20;i>0;i--)
  39.   for(j=2;j>0;j--);
  40. }



  41. void delay1(uint x)
  42. {
  43.         uchar i,j;
  44.         for(;x>0;x--)
  45.         for(i=20;i>0;i--)
  46.         for(j=200;j>0;j--);

  47. }




  48. void shuma()
  49. {
  50.         uchar a,b,n,m,j,k;
  51.         s1=1;
  52.         s2=1;
  53.         s3=1;
  54.         s4=0;
  55.         while(1)
  56.         {
  57.        

  58.             for(a=0;a<6;a++)
  59.                 {
  60.                         for(n=0;n<6;n++)
  61.                         {
  62.                                 P0=display1[n];
  63.                                 delay1(15);       
  64.                         }
  65.                 }


  66.                 for(m=0;m<8;m++)
  67.                 {
  68.                         P0=display2[m];
  69.                         delay1(100);       
  70.                 }


  71.                 for(j=0;j<6;j++)
  72.                 {
  73.                         P0=display3[j];
  74.                         delay1(30);       
  75.                 }

  76.                 for(b=0;b<6;b++)
  77.                 {
  78.                         for(k=0;k<6;k++)
  79.                         {
  80.                                 P0=display4[k];
  81.                                 delay1(15);       
  82.                         }
  83.                 }
  84.        
  85.                
  86.         }


  87. }



  88. /***************************************************************************
  89. ***************  函数名:timeyx                  ****************************
  90. ***************  函数功能:时钟运行             ****************************
  91. ***************  输入:                         ****************************
  92.                                  输出:
  93. ***************************************************************************/



  94. void timeyx()                                                           //    时钟运行
  95. {


  96.       GGD=1;                                                                   //    按键公共端置高电平,运行中按键无效
  97.       sec--;
  98.       if(sec<0)
  99.       {
  100.           sec=59;
  101.               min--;
  102.               if(min<0)
  103.               {
  104.                    min=59;
  105.                    hour--;
  106.           
  107.               }


  108.       }

  109. }




  110. /***************************************************************************
  111. ***************  函数名:stop                 ****************************
  112. ***************  函数功能:继电器断开           ****************************
  113. ***************  输入:                         ****************************
  114.                                  输出:
  115. ***************************************************************************/



  116. void stop()                                                                                 //   时间到继电器断开
  117. {
  118.         if(hour==0&&min==0)                                                         //   判断时分为0时
  119.         {                                                                                       
  120.                 TR0=0;                                                                         //    定时器停止
  121.                
  122.                 jd=1;
  123.                 shuma();                                                                         //    继电器断开
  124.         }
  125. }

  126.        

  127. /***************************************************************************
  128. ***************  函数名:display                 ****************************
  129. ***************  函数功能:数码管显示           ****************************
  130. ***************  输入:                         ****************************
  131.                                  输出:
  132. ***************************************************************************/




  133. void display(uchar zm,uchar zh)                        //     显示函数
  134. {
  135.   
  136.   
  137.   
  138.   P0=mum[zm%10];
  139.   s1=0;
  140.   delay(10);
  141.   s1=1 ;

  142.   
  143.   P0=mum[zm/10];
  144.   s2=0;
  145.   delay(10);
  146.   s2=1;

  147.   
  148.   P0=mum[zh%10];
  149.   if(cnt>2000)                                                                 //     小数点闪烁
  150.   P0&=0x7f;                                                                         //     增加小数点显示
  151.   s3=0;
  152.   delay(10);
  153.   s3=1;

  154.   
  155.   P0=mum[zh/10];
  156.   s4=0;
  157.   delay(10);
  158.   s4=1 ;

  159.   }




  160. /***************************************************************************
  161. ***************  函数名:timeset                 ****************************
  162. ***************  函数功能:时间设置             ****************************
  163. ***************  输入:                         ****************************
  164.                                  输出:
  165. ***************************************************************************/


  166. void timeset()                                                                  //  时间设置
  167. {

  168.    if(k1==0)
  169.    {
  170.        delay(50);
  171.            if(k1==0)
  172.            {
  173.                hour--;
  174.                if(hour<0)
  175.                {
  176.                     hour=12;
  177.                  
  178.                }
  179.                while(k1==0)
  180.                display(min,hour);       
  181.            }
  182.    }


  183.             if(k2==0)
  184.             {
  185.                  delay(10);
  186.                  if(k2==0)
  187.                  {
  188.                       min--;
  189.                  
  190.                           if(min<0)
  191.                           {
  192.                                min=59;
  193.                                hour--;
  194.                   
  195.                           }
  196.                  
  197.                           while(k2==0)
  198.                           display(min,hour);       
  199.                  
  200.                  }
  201.         }
  202.        

  203.           display(min,hour);
  204.        
  205.                        
  206. }




  207. /***************************************************************************
  208. ***************  函数名:main                ****************************
  209. ***************  函数功能:主函数             ****************************
  210. ***************  输入:                         ****************************
  211.                                  输出:
  212. ***************************************************************************/




  213. void main()
  214. {
  215.   
  216.   uchar end=1;                                                   //  时间预设单次循环
  217.   TMOD=0x02;                                                  //   模式2 8位自动重装定时器
  218.   TH0=0x06;
  219.   TL0=0x06;
  220.   EA=1;
  221.   ET0=1;

  222.   GGD=0;                                                          //  按键公共端
  223.   jd=1;                                                                  //  继电器关闭
  224.   TR0=0;

  225.   P3=0xff;
  226.   while(1)
  227.   {
  228.              
  229.           timeset();
  230.           stop();
  231.           

  232.       while(end)                                                  //上电未按K3启动前一直在循环 达到预设目的
  233.       {
  234.    
  235.                 timeset();                                                  
  236.           if(k3==0)
  237.               {
  238.                         delay(20);
  239.                        if(k3==0)
  240.                        {
  241.                                  TR0=1;
  242.                                  jd=0;
  243.                                  end=0;
  244.                        }

  245.                            while(k3==0);
  246.               }
  247.        
  248.        
  249.       }
  250.   }
  251. }


  252. …………限于本文篇幅 余下代码请从51黑电子论坛下载附件…………

复制代码

下载:
源代码.rar (1.9 KB, 下载次数: 98)


评分

参与人数 1黑币 +100 收起 理由
admin + 100

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:157057 发表于 2017-5-2 14:12 | 只看该作者
有原理图没。。
回复

使用道具 举报

板凳
ID:102702 发表于 2017-5-2 15:36 | 只看该作者
建议楼主附个原理图
回复

使用道具 举报

地板
ID:62340 发表于 2017-5-12 10:44 来自手机 | 只看该作者
正想做一个,谢谢楼主!
回复

使用道具 举报

5#
ID:51306 发表于 2017-7-12 11:49 | 只看该作者
程序很美丽,发现个小问题,只要时倒进时到00,在按分立马15:59
回复

使用道具 举报

6#
ID:221185 发表于 2017-8-7 21:35 | 只看该作者
学习了,有图就好了。
回复

使用道具 举报

7#
ID:246817 发表于 2017-12-13 19:37 | 只看该作者
求原理图。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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