找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智能插座源码与PCB电路原理图设计资料

  [复制链接]
跳转到指定楼层
楼主
搞了好久搞出来的基于51单片机设计的智能插座实物图:


Altium Designer画的智能插座原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机程序源码如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar code LED_table[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
  4. sbit JDQ=P3^7;           //继电器(高电平不充电,低电平充电)
  5. sbit Beep=P3^5;            //蜂鸣器
  6. sbit key=P3^2;                //按键
  7. sbit GREEN=P3^0;        //充电完成指示灯
  8. sbit YELLOW=P3^1;        //充电中指示灯
  9. /*------------------------------------------------------------*/
  10. /*------------------------程序说明----------------------------*/
  11. /*---本程序运行在AT89C2051中----------------------------------*/
  12. /*---时间设置步长为一小时-------------------------------------*/
  13. /*---可以根据需要更改变量K的判断值修改时间步长----------------*/
  14. /*---上电后先循环点亮定时时间指示灯并且蜂鸣器响,完成初始化---*/
  15. /*---每按一下按键,则定时时间增加一个时间步长-----------------*/
  16. /*---充电过程中黄色指示灯闪烁表示正在充电---------------------*/
  17. /*---充电完成则点亮绿色指示灯,关闭黄色指示灯表示充电完成-----*/
  18. /*---充电完成后可以重新通过按键设置定时时间-------------------*/
  19. /*------------------------------------------------------------*/
  20. timer60ms(uchar i)                  //60ms定时器
  21. {
  22.   
  23.   unsigned char k;
  24.   for(k=0;k<i;k++)
  25.   {
  26.     TH0=(65536-60000)/256;
  27.         TL0=(65536-60000)%256;
  28.         ET0=1;
  29.         EA=1;
  30.         TR0=1;

  31.   }
  32. }
  33. delay1ms(unsigned int z)
  34. {
  35.   unsigned int x,y;
  36.         for(x=z;x>0;x--)
  37.                 for(y=114;y>0;y--);
  38. }
  39. /*--------------------------子函数------------------------------*/
  40. uchar i;
  41. unsigned int t = 0;
  42. unsigned int k = 0;
  43. unsigned int m = 0;
  44. CSH()//初始化
  45. {
  46.    for(i=0;i<8;i++)
  47.    {
  48.      P1=LED_table[i];
  49.          delay1ms(150);
  50.    }
  51.    Beep=1;GREEN=0;YELLOW=0;
  52.    delay1ms(300);
  53.    Beep=0; P1=0xff; GREEN=1; YELLOW=1;   
  54. }

  55. /*--------------------------主函数------------------------------*/
  56. main()
  57. {
  58.    TMOD=0x01;
  59.    JDQ = 1;        //闭合继电器,开始充电。
  60.                                 //此代码不写也可以,单片机默认上电输出高电平
  61.         YELLOW = 0; //点亮充电指示灯
  62.    CSH();
  63.    EA=1;                //CPU开放中断
  64.         EX0=1;                //允许INT0中断
  65.         IT0=1;            //打开外部中断0

  66.         timer60ms(1);        //定时器T0初始化

  67.         
  68.         t=1;                //上电默认充电一小时


  69.         while(1)
  70.         {
  71.       if(t==0)                                 //定时充电已结束
  72.                   P1 = 0xff;                //关闭充电时间指示灯
  73.           else
  74.                   P1=LED_table[t-1];//点亮充电时间指示灯

  75.           /*---充电过程中黄色指示灯闪烁---*/
  76.           if(m > 4)                //每300ms充电指示灯闪烁一次
  77.           {                                //这里没用m==5去做条件判断,是因为蜂鸣器响的延时时间过程中,会使m>5
  78.                                         //当m>5后,==去判断,此处代码将不会再被执行
  79.                                         //坛友可以修改此处代码看一下实验现象就明白了
  80.                                         //PS:也可以用m==5去做条件判断,只需每次蜂鸣器响后将m重新赋值为0。详见下面注释掉的程序代码
  81.                   m = 0;
  82.                   YELLOW = ~YELLOW;        //取反实现闪烁
  83.           }
  84.          
  85.           if(k==30000)                        //半小时时间到
  86.       {
  87.            k = 0;
  88.                    /*---每减去一小时,蜂鸣器响一下---*/
  89.            t-=1;                        //减去一小时
  90.                    Beep = 1;                //蜂鸣器响一下,提示时间流逝一小时
  91.            delay1ms(500);
  92.            Beep = 0;
  93. //                   m = 0;                        //这句代码非常关键  因为在蜂鸣器响的这段时间延时为500ms,而充电指示灯闪烁的时间间隔为300ms,500ms>300ms,
  94.                                                         //代表时间间隔的m已经大于5,如果此时不将m置0,充电指示灯将不再闪烁
  95.                   
  96.            if(t==0)                        //定时时间已到
  97.            {
  98.                TR0 = 0;        //停止定时器
  99.                TH0 = (65536-60000)/256;   //高8位赋值
  100.                TL0 = (65536-60000)%256;   //低8位赋值
  101.                            
  102.                            JDQ = 0;          //断开继电器,停止充电
  103.                            GREEN = 0;        //充电完成指示
  104.                            YELLOW = 1;        //关闭充电指示灯
  105.                            P1 = 0xff;        //关闭充电时间指示灯
  106.                            
  107.                Beep = 1;        //蜂鸣器响一下,提示充电完成
  108.                delay1ms(1000);
  109.                Beep = 0;
  110.            }
  111.                    else                                //定时时间还没有到,则继续显示剩余的定时时间
  112.                    {
  113.                            P1=LED_table[t-1];        //点亮充电时间指示灯
  114.                    }
  115.        }
  116.         }
  117.    
  118.    
  119. }

  120. /*---定时器T0中断函数---*/
  121. void Timer0() interrupt 1
  122. {
  123.         TH0=(65536-60000)/256;        //赋初值
  124.         TL0=(65536-60000)%256;
  125.         k++;                                        //用于一小时定时的变量+1
  126.         m++;                                        //用于300ms定时的变量+1
  127. }
  128. /*---外部中断函数---*/
  129. void Int0() interrupt 0        //按键操作
  130. {
  131.           delay1ms(50);                        //延时去抖
  132.           if(key==0)                        //有键按下
  133.           {
  134.                 Beep = 1;                //蜂鸣器响一声,作为按键音
  135.                 delay1ms(100);
  136.                 Beep = 0;        
  137.         
  138.                 t+=1;                        //按下按键一次,则增加一小时
  139.                 if(t>8)                        //8次一个循环
  140.                         t = 1;
  141.                
  142.                 P1=LED_table[t-1];        //点亮时间指示灯
  143.                 GREEN =  1;                        //关闭充电完成指示灯
  144. //                m = 0;                                //为了使充电指示灯重现闪烁
  145.                
  146.                 TR0=0;        //停止定时器
  147.                
  148.                 TH0=(65536-60000)/256;          //高8位赋值    重新赋初始值
  149.                 TL0=(65536-60000)%256;          //低8位赋值
  150.                 TR0=1;        //启动定时器        

  151.                 JDQ = 1;//闭合继电器,开始充电
  152. ……………………

  153. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
充电定时器.zip (3.34 MB, 下载次数: 132)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:472070 发表于 2019-1-23 14:57 | 只看该作者
楼主,麻烦补充补充一点这个作品功能的用法和展示,这样感兴趣的朋友会更多。

我看这个标题很感兴趣,但点进来看不知道你这个咚咚怎么用了
回复

使用道具 举报

板凳
ID:611470 发表于 2020-5-26 14:51 | 只看该作者
这个是干什么滴
回复

使用道具 举报

地板
ID:5501 发表于 2021-4-25 10:39 | 只看该作者
本帖最后由 shgdd520com 于 2021-4-25 15:32 编辑

  if(k==30000)                        //半小时时间到   
请教下楼主,这个K=30000 是什么意思,定时器定时的是60ms ,这个30000 是怎么计算的呢 timer60ms(uchar i)                  //60ms定时器
{

  unsigned char k;
  for(k=0;k<i;k++)
  {
    TH0=(65536-60000)/256;
                TL0=(65536-60000)%256;
                ET0=1;
                EA=1;
                TR0=1;
  }
}

这定时器配置 初始化 有for 循环 要反复执行初始化吗?

回复

使用道具 举报

5#
ID:71233 发表于 2021-4-26 13:40 | 只看该作者
智能在哪里?应该是一般的电源定时开关吧!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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