專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

51單片機串口控制繼電器

作者:樊曉軍   來源:樊曉軍   點擊數(shù):  更新時間:2014年06月08日   【字體:

實驗室有個項目,用到報警功能。比如當(dāng)溫度或應(yīng)力過高或者過低的時候啟動報警器,通過給串口發(fā)送一個命令來控制繼電器。不巧去年被我正負(fù)極接反燒了,最近開始搞單片機,哥苦心經(jīng)營,利用實驗室單片機學(xué)習(xí)板給搞定了,程序如下:

 
 
#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 ) //串口通信初始設(shè)定
{      
TMOD|=0x20;  //定時器中的方式控制寄存器TMOD,設(shè)置T1為工作模式2,當(dāng)TL1溢出時,TH1的值自動裝入TL1,TH1和TL1當(dāng)然都要賦值.TMOD前四位T1,后四位T0:GATE=0,C/T=0,M1=0,M0=01
TR1=1;       //定時器中的運行控制寄存器TCON,允許T1計數(shù)
TH1=0xfd;   //波特率9600
TL1=0xfd;
SCON  = 0x50 ;   //SM0=0;SM1=1;REN=1; UART為模式1,8位數(shù)據(jù),允許接收,
PCON |= 0 ;      //SMOD=1;波特率的問題。
IE|=0x90 ;       //中斷允許寄存器IE,P97,EA終端總允許標(biāo)志位,ES串行口中斷允許位
}
 
 
void jdq() interrupt 4{  //void 函數(shù)名() 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發(fā)送時的定時信號,也就是移位脈沖,由定時器1產(chǎn)生。不是定時器0。
{
init_serialcom();
Delay(10);
while(1);                                                                        
}
 
 
 
第一次獨立寫的,程序粗糙了點,但是完美運行。
 
發(fā)送:E5A1 104E,繼電器閉合   
          E5A1 114D,繼電器斷開  
這里控制用到了四個字節(jié),所以在中斷程序里面我定義了一個數(shù)組,最后判斷這四個字節(jié)是否都正確。如果一個字節(jié)的話更簡單。
 
下一步要用無線控制,等哥哥好消息吧
 
關(guān)閉窗口

相關(guān)文章