利用单片机实现远程电源控制

发布者:yunhui最新更新时间:2012-11-27 来源: 21IC 关键字:单片机  远程电源控制  89C2051 手机看文章 扫描二维码
随时随地手机看文章

    我单位有一无人值守的机房位于一高山山顶上,上山的路是600多级的台阶。因通信需要,有时要开关某些机器设备,操作上虽然简单,但要工作人员花10多分钟爬一趟山,不仅辛苦,而且拖延了时间。为解决此问题,本人利用89C2051单片机,设计了一遥控开关,在山下机房便可对山顶上的设备进行开关机。

一、 原理简介
    该方案的框图如下:
  
    山顶机房及山下机房各安装一块控制板,两者之间通过专线MODEM相连。山下控制板主要功能是:将操作人员的开关信息转换成指令,发送给山顶控制板,并根据山顶控制板发来的电源通断状态报告指令,以指示灯的形式显示给操作人员。山顶控制板主要功能是:通过控制继电器的吸放来控制设备的电源,该板在接收到山下控制板发来的开关电指令后,驱动继电器的吸放,并将继电器的反馈状态转换成指令,报告给山下控制板。两处的专线MODEM由本单位内部的光纤通信设备提供的音频线路连接。

二、山顶控制板
    山顶控制板所包括的主要元件有单片机芯片89C2051,电平转换芯片MAX232,电源模块。由于需遥控的通信设备使用-48V电源,山顶控制板也采用-48V。该板采用了一个成品开关电源模块,将-48V转换成+5V。芯片MAX232的功能是把单片机串口的TTL电平转换成MODEM的RS-232电平,使单片机能通过MODEM收发数据。2051单片机根据山下控制板发来的指令,通过P1_4脚控制线圈电压为5V的小继电器RY1的吸放,进而控制电源继电器RY2的吸放。电源继电器RY2为两组触点、24V线圈电压的大继电器,触点可承受较大电流。其中的一组触点用于控制设备电源的通断,接中间触点及常闭触点。继电器释放时,设备加电,继电器吸合时,设备关电。另外一组触点作为继电器动作后的反馈,接中间触点及常开触点,分别接地及2051的P1_7脚。当继电器RY2吸合时P1_7经继电器接地,为低电平,继电器释放时P1_7脚为高平(2051内部有上拉电阻)。单片机2051每秒钟检测一次P1_7脚是否接地,以此判定继电器是否吸合(即是否断开了设备的电源),随后将检测的结果转换成指令,通过MODEM向山下的控制板汇报,同时本身的断电指示灯也显示出设备的加断电状态。
    山顶控制板的电路图如下:
 
[page]

山顶控制板的程序如下:
#include "atmelAT89X51.H"
#define  SYN  \'Z\'    //来自山下控制板数据帧的同步字符

char countdown;      //时间计数

char TX_buf[3];      //发送缓冲区
char TX_len;         //发送字符串长度
char TX_num;       

char RX_buf[3];      //接收缓冲区
char RX_len;         //接收字符串长度
char RX_num;      
char CRC(char *buf,char len)        //校验码生成函数
{char i,temp;
  temp=0;
  for(i=0;i  return(temp);
}

void timer0_int() interrupt 1         //定时器0的中断服务程序
{ TL0=0x00;   TH0=0x0A6;
  countdown--;
  if(countdown==0 || countdown==20)    
       P1_0=!P1_0;              //控制CPU运行指示灯的秒闪
       
  if(countdown!=0) return;
  countdown=40;   //过了一秒钟
  P3_7=P1_7;      //检测电源继电器的吸放状态,并驱动P3_7的指示灯
  if(P1_7)  TX_buf[1]=0x13;     //高电平,电源继电器已释放,设备电源接通
  else      TX_buf[1]=0x31;    //接地,电源继电器已吸合,设备电源中断
  TX_buf[2]=CRC(TX_buf,2);    //生成校验码
  TX_num=0;
  SBUF=TX_buf[0];            //向山下控制板报告继电器的吸放状态
}
void serial_int() interrupt 4        //串口中断服务程序
{ if(TI)                        //发送触发了中断
   { TI=0;    TX_num++;
     if(TX_num     }
  else                         //接收触发了中断
   { RI=0;    RX_buf[RX_num]=SBUF;
     if(RX_num==0 && RX_buf[RX_num]!=SYN)
       return;                  //在接收的数据中搜索同步字符
     RX_num++;
     if(RX_num==RX_len)       //收完一条指令
     { RX_num=0;
       if(RX_buf[RX_len-1]==CRC(RX_buf,RX_len-1)) //检查校验码是否正确
          { if(RX_buf[1]==0x13)   P1_4=1;   //释放小继电器RY1及电源继电器RY2
            if(RX_buf[1]==0x31)   P1_4=0;  //吸合小继电器RY1及电源继电器RY2
           }
      }
    }
}

void main()
{  IE=0x92;
   TMOD=0x21;               //定时器1:模式2,定时器2:模式1
   TL1=253;     TH1=253;     // 9600波特率
   TR1=1;                    //启动定时器1
   SCON=0x50;                //串口:模式1

   TL0=0x00;    TH0=0x0A6;   //定时器0定时0.025秒
   TR0=1;                    //启动定时器0
   countdown=40;              //1秒=0.025*40
   P1_4=1;                    //释放继电器RY1、RY2

   TX_buf[0]=0x7E;   TX_len=3;
   RX_num=0;        RX_len=3; 

   while(1) ;
}

三、 山下控制板
    山下控制板的电路图如下所示,所包括的主要元件有单片机芯片89C2051,电平转换芯片MAX232,7805稳压芯片。芯片MAX232的功能是把单片机串口的TTL电平转换成MODEM的RS-232电平,使单片机能通过MODEM收发数据。需要对山上设备进行开关电操作时,先把连接在2051单片机P1_7脚的断电开关拨到“开”或“关”的位置,然后连续按下K1按键,直到L1、L2、L3三个操作指示灯全亮,接着按一下K2按键,L1、L2、L3指示灯全灭,此时2051单片机检查P1_7脚的电平,如果是低电平,则向山顶控制板发断电指令,如果是高电平,则向山顶控制板发加电指令。K1、K2的其它按键组合均不使单片机发送加断电指令。这里采取断电开关与按键相结合的控制方式,目的是为了防止意外的开关操作,提高安全性。MODEM通信正常的情况下,山下控制板每秒钟收到一次山顶控制板发来的加断电状态报告。当接收到状态报告后,经单片机分析,如果是断电状态,则P1_5脚输出低电平,点亮断电指示灯,P1_3脚输出高低脉冲,驱动蜂鸣器告警提示;如果是加电状态,断电指示灯灭,蜂鸣器静音。如果连续3秒钟收不到山顶控制板的状态报告,断电指示灯将作秒闪、蜂鸣器告警,提示操作人员检查MODEM线路是否正常。
 
[page]

山下控制板的程序如下:
#include "atmelAT89X51.H"
#define  SYN   0x7E   //山顶控制板发来数据帧的同步字符

char countdown;      //时钟计数
char TTL;           //通信中断的时间门坎值,设置为3秒
bit  link_error;      //通信中断标志
bit  power_on;      //山上设备是否加电的标志
bit  km;            //按键消抖动标志
bit  kp;            //按键操作已处理标志
char TTW;          //发送指令前的时间计数

char TX_buf[3];      //发送缓冲区
char TX_len;         //发送指令长度
char TX_num;         //当前发送的字符序号

char RX_buf[3];      //接收缓冲区
char RX_len;         //接收指令长度
char RX_num;        //当前接收的字符序号

char CRC(char *buf,char len)    //校验码生成函数
{char i,temp;
  temp=0;
  for(i=0;i  return(temp);
}

void timer0_int() interrupt 1    //定时器0的中断服务函数
{ bit key1,key2;

  TL0=0x00;   TH0=0x0A6;
  countdown--;
  if(countdown==0 || countdown==20)
    { P1_6=!P1_6;            //CPU运行指示灯秒闪
      if(link_error)
         P1_5=!P1_5;        //通信中断,断电指示灯秒闪
      else
       { if(power_on)   P1_5=1;    //设备加电,断电指示灯灭
         else          P1_5=0;    //设备关电,断电指示灯亮
        }
     }

  if(power_on && !link_error)        //当设备加电且通信正常
     P1_3=0;                     //关闭蜂鸣器
  else                           //当设备断电或通信中断
    { if(countdown==0)   P1_3=0;   //蜂鸣器告警
      if(countdown==5)   P1_3=1;
      if(countdown==10)  P1_3=0;
      if(countdown==15)  P1_3=1;
     }

  key1=P3_4;  key2=P3_5;
  if(key1==1 && key2==1)  {  km=0;kp=0;  }   //两个按键均没有按下
  else
   { if(km==0)   km=1;             //设消抖动标志
  else
     { if(kp==0)
        { kp=1;
          if(key1==0)              //按键K1被按下
            TTW=(TTW+1)%4;      //计算K1连续按下的次数
          if(key2==0)              //按键K2被按下
           { if(TTW==3)           //如果K1已被连续按了三次
              { if(P1_7)    TX_buf[1]=0x13;    //发加电指令
                else        TX_buf[1]=0x31;    //发关电指令
                TX_buf[2]=CRC(TX_buf,2);
                TX_num=0;   SBUF=TX_buf[0];
               }
             TTW=0;    //不管K1已按下几次,K2按下后复位TTW计数器
            }
         }
      }
    }
 
  if(countdown!=0)   return;
  countdown=40; 

  if(TTL==0)  link_error=1;    //TTL减到0,表示通信中断
  else        TTL--;         //每隔1秒对TTL作减1操作
}

void serial_int() interrupt 4       //串口中断服务程序
{ if(TI)
   { TI=0;    TX_num++;
     if(TX_num     }
  else
   { RI=0;    RX_buf[RX_num]=SBUF;
     if(RX_num==0 && RX_buf[RX_num]!=SYN)
       return;                   //在接收到的数据中搜索同步字符

     RX_num++;
     if(RX_num==RX_len)       //接收到一完成指令
     { RX_num=0;
       if(RX_buf[RX_len-1]==CRC(RX_buf,RX_len-1))   //检查校验
         { if(RX_buf[1]==0x13)  power_on=1;       //加电状态
           if(RX_buf[1]==0x31)  power_on=0;      //断电状态
           TTL=3; link_error=0;        //通信正常,重置TTL值
          }
      }
    }
}

void main()
{  IE=0x92;
   TMOD=0x21;                  //定时器1:模式2,定时器0:模式1
   TL1=253;        TH1=253;     //9600波特率
   TR1=1;                       //启动定时器1
   SCON=0x50;                   //串口:模式1

   TL0=0x00;      TH0=0x0A6;    //定时器0定时0.025秒
   TR0=1;                        //启动定时器0
   countdown=40;                  //1秒=0.025秒*40

   TTL=3;                       //连续3秒收不到报告,表示通信中断
   TTW=0;
   km=0;         kp=0;
   link_error=1;    power_on=1;
   TX_buf[0]=\'Z\';  TX_len=3;
   RX_num=0;     RX_len=3; 

   while(1)
    { if(TTW==0)   { P3_7=1; P1_0=1; P1_1=1; }
      if(TTW==1)   P3_7=0;
      if(TTW==2)   P1_0=0;
      if(TTW==3)   P1_1=0;
     }
}

四、MODEM通信线制作
    单片机2051与MODEM之间的串口通信电缆只用RX、TX、GND三根线,其他的握手信号均没有使用,但在制作MODEM一端的接头时应要按下图制作:
 

关键字:单片机  远程电源控制  89C2051 引用地址:利用单片机实现远程电源控制

上一篇:12864点阵液晶显示模块与51单片机的接口及程序设计
下一篇:基于80C552和DME2000的噪声测量自动定位装置设计

推荐阅读最新更新时间:2024-03-16 13:14

恩智浦的150MHz LPC1800 MCU具有高的ARM Cortex-M3性能
恩智浦半导体NXP Semiconductors N.V. (Nasdaq: NXPI)今天宣布推出业界最高性能的ARM® Cortex™-M3微控制器。LPC1800的低功耗优化设计使其在极低频率到150Mhz范围内最大发挥Flash或RAM的性能。此性能为大量要求严苛的应用提供了最大的连接和带宽选择。灵活的双单元256位宽Flash存储器支持并行读、写操作,可保存“黄金副本”,防止重新编程中出现失误,也可以简单地作为单存储单元使用。LPC1800也支持两种最新外设:灵活四路SPI接口和可配置定时器子系统。 恩智浦半导体副总裁、微控制器产品线总经理Geoff Lees表示,“LPC1800为ARM Cortex-M
[单片机]
恩智浦的150MHz LPC1800 <font color='red'>MCU</font>具有高的ARM Cortex-M3性能
基于单片机PIC18F4550的USB接口设计
引言   USB是一种快速的、双向同步传输的、廉价并可以进行热插拔的串行接口。利用USB总线技术,开发适用于科学研究和工业牛产的各种仪器仪表设备,借以取代传统计算机测控系统中采用串行RS232或并行接口的仪器仪表设备,使计算机测控系统更加高效实时,方便灵活。   利用USB总线的数据采集方案有两种,一种是采用普通单片机加上专用的USB通信芯片。该方案可充分利用开发人员原有的硬件资源和软件知识,开发成本较低,但系统的设计和调试较为麻烦,且电磁兼容性差,容易造成主机不能识别USB设备。另一种是利用具有USB接口功能的单片机。使用这些专用芯片构成的数据采集系统电路设计简单,调试方便,电磁兼容性好。然而,目前大部分具有USB功能的单片机都
[单片机]
基于<font color='red'>单片机</font>PIC18F4550的USB接口设计
HT46R22单片机在电磁炉功率控制中的应用
摘要:介绍了电磁炉的基本工作原理,并提出了一种采用HT46R22单片机实现电磁炉功率稳定输出的功率控制方法,最后简单介绍了该方法的软硬件设计过程。 关键词:电磁炉;HT46R22;功率控制 引言 近年来,随着环保和节能意识的逐步提高,一种新兴的"绿色的厨具"--电磁炉正在家庭中普及。它改变了传统的明火烹调方式,利用电磁感应原理,使电流通过内置的线圈时产生磁场,磁场内的磁力线感应到铁制器皿,产生无数高速运动的小涡流,涡流产生的巨大循环能量转换为有效热能,使锅具自行高速加热,最终直接加热食物。电磁炉的热效率达到90%以上,同时它无烟无灰,无污染,不升高室温,不产生一氧化碳等有害物质,安全环保。电磁炉还采用了微电脑控制,能够随意控
[单片机]
烧录Hex文件到Silabs单片机
通常我们会用烧录器EC5或者EC6在Silabs IDE下载程序 但是有很多人会比较习惯用Keil生成Hex文件再烧录 其实这也是可以的 Silabs也提供了下载的工具 路径:C:SiLabsMCUUtilitiesProduction Programmer 下面有个exe文件:MCUProductionProgrammer.exe 打开后在program menu 下面有个config programming information 选项 进去如下所示 part number 处选择单片机型号,Hex file location选择hex文件所在位置 accept setting后 program d
[单片机]
8051单片机的中断响应过程解析
8051的CPU在每个机器周期期间,顺序采样每个中断源,CPU在下一个机器周期按优先级顺序查询中断标志,如查询到某个中断标志为1,将在下一个机器周期期间按优先级来进行中断处理。在下列任一种情况存在时,中断申请将被封锁。 1、CPU正在执一个同级或高级的中断服务程序2、当前机器周期不是当前指令周期的最后一个机器周期,即要保证把当前指令执行完。 CPU响应中断, 由硬件自动将相应的中断矢量地址装入程序程序计数器PC,转入该中断服务程序进行处理。 对于有些中断源,CPU在响应中断后会自动清除中断标志,如定时器溢出标志TF0,TF1,以及部中断标志IE0,IE1。 而有些中断标志,不会自动清除,只能由用户用户软件清除,如串
[单片机]
用C51编写单片机延时函数
参考了 51单片机 Keil C 延时程序的简单研究 ,自己也亲身测试和计算了一些已有的延时函数。 这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us. 参考了 51单片机 Keil C 延时程序的简单研究 后,我们可知道, 在Keil C中获得最为准确的延时函数将是 void delay(unsigned char t) { while(--t); } 反汇编代码如下: 执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,在不计算调用delay()所需时间的情况下,具体时间延时如下: t Delay Time (us) 1 2 1+2 =4
[单片机]
用C51编写<font color='red'>单片机</font>延时函数
[单片机框架][DFU] Dfu升级例子 带crc校验+超时机制+led指示灯+芯片加锁+芯片自擦
自动检测剩余空间是否支持备份升级,防止升级失败变砖。 /******************************************************************************** * @file main.c * @author jianqiang.xue * @Version V1.0.0 * @Date 2021-04-03 * @brief NULL ********************************************************************************/ /* Includes -------------------
[单片机]
ZiLOG的8位MCU用于PC电视调谐卡,增强遥控功能
ZiLOG公司在推进8位集成微控制器和通用远程处理方案技术革新的同时,又宣布了与Hauppauge Computer Work公司的战略伙伴关系。Hauppauge公司是个人电脑数字视频、电视和信息广播接收机类产品的开发和生产商。在合作计划中ZiLOG的Z8 Encore! F08闪存微控制器系列将会使Hauppauge公司的WinTV-PVR-150型板卡先进的遥控功能得到进一步的增强。 WinTV-PVR是一款便于安装的个人电脑电视调谐卡,它使消费者可以通过他们的电脑观看、暂停或录制有线电视和卫星电视。消费者无需购买新的多媒体娱乐电脑就可以廉价快捷地在已有的电脑上收看电视或享受其它娱乐功能。 除了为Hauppauge公司提
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved