红外防盗 单片机 VS1838B GSM

2020-01-30 14:07发布

本帖最后由 拖拉机 于 2012-5-9 01:06 编辑

      小弟在做红外防盗报警器时,接收端不能按要求工作(要求如下)恳请高手指点
       单片机晶振为27.145MHZ
       发射端通过单片机T0工作在方式2发送2002微秒(154次13微秒)的38KHZ方波,接着发送6006微秒(154次×13微秒×3)的高电平,以此来驱动红外线发光二极管工作.
      接收端用VS1838B来接收发射端发射的信号,并把VS1838B的out引脚接到单片机上的P3^2引脚,通过外部中断0和定时器T0工作在方式2来计算out引脚上两次下降沿之间进入定时器中断的次数,如果进入定时器中断的次数不是600到625次之间(实际上应该是616次,允许有误差所以设置为600到625次之间)就通过GSM触发标志位flag来触发GSM发送短信(并点亮P1^7引出的LED灯,发送完了之后熄灭LED灯),否则不发送。下面是接收端单片机的程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag=0;  //发送短信标志位
uint count;        //接收到低电平时产生定时器中断次数
uint a;  //进入外部中断次数
sbit D=P1^7;
uchar code at[] =   "ATx0Dx0A";
uchar code cmgf[]   = "AT+CMGF=0x0Dx0A";
uchar code size[]  ="AT+CMGS=36 ";
uchar code duanxin[]="0891683108702505F011000B815128707088F00008A71660A87684623F95F45728906D53D751654FB5FF01FF01x01ax0Dx0A";

void chushihuaT0();   //定时器T0初始化
void   uart_int(void);          //串口初始化
void delay(uint z); //延时程序
void  send(uchar *tab); //GSM发送初始化
void main()
{       
        chushihuaT0();                                       
        count=0;
        EX0=1;   //开启外部中断 0
        IT0=1;   // 设置为下降沿触发方式                                          
        D=1;
        a=0;
                                                  
        uart_int();
        delay(500);
    send(at);
        delay(150);
        send(cmgf);                                       
        delay(150);
        while(1)
        {       
                if(flag==1)          //标志位为1就发送短信
            {                         
                    send(at);
                    delay(400);
                    send(cmgf);                               
                    delay(400);
                    send(size);
                    delay(400);
                    send(duanxin);          //发送短信
                        for(a=0;a<4;a++)
                        {
                                delay(1000);   //延时2秒
                         }
                        flag=0;        //发送完短信,把发送短信标志位清零,以便下次继续发送短信
                        D=1;  //发送完短信,发送短信指示灯灭
                }       
        }
}


void chushihuaT0(void)   //定时器T0初始化
{
        EA=1;       
        TMOD=0x02;
        ET0=1;
        TH0=227;
        TL0=227;
}

void   uart_int(void)          //串口初始化
{
        SCON   =   0x50;        //UART方式1:8位UART;   REN=1:允许接收
        PCON   =   0x00;   //SMOD=0:波特率不加倍
        TMOD   =   0x20;   //T1方式2,用于UART波特率
        TH1     =   0xFD;
        TL1     =   0xFD;   //UART波特率设置:9600
        TR1     =   1;
        ES=1;
}

void delay(uint z)        //延时程序
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);

}

void   send(uchar *tab) //GSM发送初始化
{
        while((*tab)!= '')
        {
            SBUF =*tab;
            while(TI ==0);
            TI = 0;
            tab++;   
         }
}

void waibu() interrupt 0    //外部中断 0
{                 
    a++;
        count=0;  //对低电平时的定时中断次数清零,以便对下个低电平重复操作
        TR0=1;          //当接收到下降沿时,开启定时器T0,开始计时
        while(a==2)          //判断两次下降沿之间进入定时器中断的次数
        {
            if(count>600&&count<625)
            {
                    flag=0;
            }
                else
                {
                        flag=1;        //准备发送短信
                        D=0;        //发送短信指示灯亮
                }
                a=0;
        }

               
}

void T0_time() interrupt 1           //定时器T0中断
{                                                    
        count++;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。