|
小弟在做红外防盗报警器时,接收端不能按要求工作(要求如下)恳请高手指点:
单片机晶振为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[] = "AT\0x0D\0x0A";
uchar code cmgf[] = "AT+CMGF=0\0x0D\0x0A";
uchar code size[] ="AT+CMGS=36\r";
uchar code duanxin[]="0891683108702505F011000B815128707088F00008A71660A87684623F95F45728906D53D751654FB5FF01FF01\x01a\0x0D\0x0A";
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)!= '\0')
{
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++;
}
|
|
|
|
|