专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机串口控制继电器

作者:樊晓军   来源:樊晓军   点击数:  更新时间:2014年06月08日   【字体:

实验室有个项目,用到报警功能。比如当温度或应力过高或者过低的时候启动报警器,通过给串口发送一个命令来控制继电器。不巧去年被我正负极接反烧了,最近开始搞单片机,哥苦心经营,利用实验室单片机学习板给搞定了,程序如下:

 
 
#include<reg52.h>
#define uchar unsigned char
sbit JDQ=P3^7;         //继电器接P3.7
sbit FMQ=P3^6;
sbit LED=P0^0;
sbit LEDra=P0^1;
sbit LEDar=P0^2;
uchar dat[4];
int i=0;
 
 
void Delay(unsigned int ii) //1mS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++)
{;}
}
 
 
void init_serialcom( void ) //串口通信初始设定
{      
TMOD|=0x20;  //定时器中的方式控制寄存器TMOD,设置T1为工作模式2,当TL1溢出时,TH1的值自动装入TL1,TH1和TL1当然都要赋值.TMOD前四位T1,后四位T0:GATE=0,C/T=0,M1=0,M0=01
TR1=1;       //定时器中的运行控制寄存器TCON,允许T1计数
TH1=0xfd;   //波特率9600
TL1=0xfd;
SCON  = 0x50 ;   //SM0=0;SM1=1;REN=1; UART为模式1,8位数据,允许接收,
PCON |= 0 ;      //SMOD=1;波特率的问题。
IE|=0x90 ;       //中断允许寄存器IE,P97,EA终端总允许标志位,ES串行口中断允许位
}
 
 
void jdq() interrupt 4{  //void 函数名() interrupt 4
EA=0;     
if(RI)
{
RI=0;
if(i<4)
{
dat[i] = SBUF;
i++;
  
if(dat[2]==0x10 && dat[0]==0xE5 && dat[1]==0xA1 && dat[3]==0x4E)   //E5A1 104E
  JDQ=0;//吸合
     LED=0;//P0口LED亮
  LEDra=1;
     LEDar=1;
}
else if(dat[2]==0x11 && dat[0]==0xE5 && dat[1]==0xA1 && dat[3]==0x4D) //E5A1114D
  {
  JDQ=1; //释放
     LED=1; //P0口LED灯灭
  LEDra=1;
     LEDar=1;
  }
    else
    {
    LEDra=0;
       LEDar=0;
    LED=1;
    }
if(i>=4)i=0;else;
}
EA=1;
}
 
 
main()      //串口方式1发送时的定时信号,也就是移位脉冲,由定时器1产生。不是定时器0。
{
init_serialcom();
Delay(10);
while(1);                                                                        
}
 
 
 
第一次独立写的,程序粗糙了点,但是完美运行。
 
发送:E5A1 104E,继电器闭合   
          E5A1 114D,继电器断开  
这里控制用到了四个字节,所以在中断程序里面我定义了一个数组,最后判断这四个字节是否都正确。如果一个字节的话更简单。
 
下一步要用无线控制,等哥哥好消息吧
 
关闭窗口

相关文章