新手入门
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2015-5-20
- 在线时间
- 0 小时
|
5金钱
本人买了一块TC35I模块(程序中用的是TC35),想利用开发板设计一个防盗报警的毕设。程序如下,能生成hex文件。但不知道如何连接实物图,准确的说是TC35I与单片机之间只需连TXD,RXD,GND这几个引脚吗???那么该系统里传感器有改接单片机哪个引脚???因为程序中好像把P3^0定义为光电传感器的输出信号端了。还望大神能帮我看看,感激不尽。
程序功能:是入室开门触发光电传感器输出信号电平取反,51单片机IO口识别并触发TC35向客户端间隔1min发送报警短信,若客户端未及时回复短信系统默认客户未发现已收到短信,触发TC35拨打客户手机
#include <reg52.h>
#include <intrins.h>
#include <string.h> //字符串处理函数
#include <stdio.h> //文件类型指针
#define uint unsigned int
#define uchar unsigned char
#define RxIn 90 //定义接收的数组长度为90
uchar idata SystemBuf[RxIn]; //储存出口接收数据
uchar code AT[]="AT"; //握手信号
uchar code ATE[]="ATE"; //关回显
uchar code AT_CNMI[]="AT+CNMI=2,1";//设置这组参数来了新信息直接显示到串口,不作存储 uchar code AT_CSCA[]="AT+CSCA=\"+8618860905485\"";//设置服务中心号码 AT+CSCA=\"+8613010360500\"
uchar code AT_CMGF[]="AT+CMGF=1";//设置短信的格式为text格式
uchar code AT_CSCA[]="AT+CSCA=\"+8613800391500\"";//设置服务中心号码
uchar code godphone[11]="18236882422";//客户端号码
uchar code AT7[]={0x41,0x54,0x2B,0x43,0x4D,0x47,0x53,0x3D};//AT+CMGS= 即发送短信客户端号码指令 eg:AT+CMGS=13771992474 回车 发送
uchar code AT12[]={0x41,0x54,0x44,0x3E};//ATD> 即拨打客户端电话指令 eg:呼叫13973292929,则为ATD13973292929
uchar code warning[]="warning! if you get it, please send get it to me";
uchar Rx=0;
uchar i;
uchar rec_flag=0;
uchar flag=0;
sbit sig=P3^0; //检测信号源的高低电平
void Delay_ms(uint ms)// 延时子程序
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void sendchar(uchar ch)//发送单个字符
{
SBUF=ch; //送入缓冲区,SBUF串口的缓冲寄存器
while(TI!=1); //等待发送完毕
TI=0; //软件清零 ,串口通信工作原理
}
void sendstring(uchar *str)//通过串口发送字符串
{
while(*str!='\0') //"\0"的ASCII码为0,作为字符串结束打的标志
{
sendchar(*str);
Delay_ms(2);
str++;
}
sendchar(0x0D);
sendchar(0x0A);
}
void senddata(uchar dat) /*发送数据函数*/
{
SBUF =dat;
while(!TI);
TI = 0;
}
void mingling(uchar zijie,uchar *p) /*发送数组函数*/
{
uchar m;
for(m=0;m<zijie;m++)
{
senddata(p[m]);
}
}
void clearBuff(void) //清空
{
for(Rx=0;Rx<RxIn;Rx++)
{
SystemBuf[Rx]=0x00;
}
Rx=0;
}
/*void Start_GSM(void)
{
IGT=0;
Delay_ms(1000);
IGT=1;
Delay_ms(1000);
} */
void UART_init (void) /*对串口进行初始化*/
{
TMOD=0x20; //选择定时器1,T1方式2,用于UART波特率
PCON=0x00; ///波特率不加倍
SCON=0x50; //串行工作方式1允许串行接收
TH1=0xFD; //实验板上晶振位11.0592MHZ,选择波特率为9600
TL1=0xFD; //在相应计数器上赋值
EA=1; //总中断开启
ES=1; //串行中断开启
TR1=1; //开启定时器1
}
void receive() interrupt 4 using 1 //通过中断,单片机串口接收TC35回复的数据
{
if(RI) //RI为接收中断标志
{
if(Rx<RxIn)
{
SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}
void GSM_INIT(void) /*初始化TC35模块*/
{
LOOP:
Delay_ms(1000);
sendstring(AT);
Delay_ms(1000);
sendstring(ATE);
Delay_ms(1000);
sendstring(AT_CNMI);
Delay_ms(1000);
sendstring(AT_CSCA);
Delay_ms(1000);
clearBuff();
sendstring(AT_CMGF);
Delay_ms(1000);
if((SystemBuf[2]=='O')&&(SystemBuf[3]=='K')) //判断是否模块初始化成功,成功的话模块会回复"OK"给单片机
{ //如果单片机没有收到OK,就继续发送初始化指令/
clearBuff();
}
else
{
clearBuff();
goto LOOP;
}
}
void receivedmessage_flag(void) /*接收短信准备*/
{
if((SystemBuf[5]==0x54)&&SystemBuf[6]==0x49) //如果有新短信来,模块会通过串口向单片机发送字符串, TI
{ // 此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1
rec_flag=1;
}
else
{
clearBuff();
}
clearBuff();
}
void call(void)
{
uint x;
mingling(3,AT12);
for(x=0;x<11;x++)
{
senddata(godphone[x]);
}
senddata(0x3b);//打电话的时候需要在电话号面跟随一个分号
senddata(0x0D);//回车
}
void sendmessage(void)
{
uint x;
mingling(8,AT7);
for(x=0;x<11;x++)
{
senddata(godphone[x]);
}
senddata(0x0D);
Delay_ms(100);
sendstring(warning);
}
void main()
{
//Start_GSM();
Delay_ms(10000);
UART_init();
GSM_INIT();
while(sig==1&&flag==0)
{
while(rec_flag==0&&i<3)//flag=1表示客户端已看到发送过去的短信并回复了get it;系统未收到回复短信则默认客户端没发现收到的短信
//当对客户端发送第三次短信时若有回复flag=1 i=3;若无回复则flag=0 i=3
{
sendmessage();
Delay_ms(60000);
receivedmessage_flag();
i=i+1;
}
if(rec_flag==0&&i==3)
{
call();
}
i=0;
flag=1;
}
} |
|