|
最近在弄51单片机控制TC35I的东东,买回TC35I后通过电脑和它连接,打电话,发短信都可以,就开始用51单片机控制TC35I,可是没有成功,还希望大家帮帮助,看看是什么问题!
程序如下:我想实现在功能是给TC35I发中文短信单片机会据短信内容作出相应动作,下面的程序只用了一个P1。0和P1。1端口,发“吃饭”两个字的短信的话,P1。0会吸合继电器,给TC35I打电话的时候,P1。1吸合继电器。若再发“吃饭”那P1。0继电器就断开,再打电话的话P1。0继电器断开
程序中对TC35I初始化后我让它给我打个电话表示初始化成功,但是TC35I什么都没做,很晕,希望大家可以帮帮我,感谢中
TC35I和单片机我是这样连接的,RXD TXD是直接对连的(交叉接它也没有反应),地线接地线。
程序如下,
#include<reg51.h>
#include<string.h>
sbit Race=P1^0;
sbit AIR=P1^1;
sbit START=P3^2; //启动端口
bit i=1,l=1; //main函数中的变量
unsigned char RsPoint=0; //接收缓存指针
unsigned char RsBuf[60]="\n"; //接收缓存数组
//延时函数
void delay(unsigned char n)
{
unsigned char i=204;
while(n--)
{
while(i--);
}
}
//51单片机初始化
void init51(void)
{
P1=0x00; //控制端端口初始化
TMOD=0X20;//定时器1,定时方式2
TH1=0XFD; //波特9600初始化
TL1=0XFD;
PCON=0X00; //波特不加倍
TCON=0X40;//定时器开始计数
SCON=0X50;//串口方式1,允许接收
IE=0X9;//EA=1,ES=1
}
//给TC35I发送ASC字符
void SendASC(unsigned char ASC)
{
bit es;
es=ES;
ES=0;
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
}
//给TC35I发信息
void SendToTC35(unsigned char *p,unsigned char n)
{
while(n--)
{
SendASC(*p++);
}
}
//打电话的子程序 拨通后可自动挂断
void Call(void)
{
unsigned char *p;
while(1)
{
SendToTC35("ATD15881084287;",15);
SendASC(0x0d); //回车
delay(2000);
p=strstr(RsBuf,"BUSY");
if(p!=NULL) //如果打通了后就延时一下,再挂机
{
SendToTC35("ATH",3);
SendASC(0x0d);//回车
break;
}
}
}
//TC51初始化设置
void initTC51i(void)
{
delay(1000);
SendToTC35("AT+CNMI=1,2,0,0,1",17); SendASC(0x0d);//有短信直接发给51
delay(1000);
SendToTC35("AT+CLIP=1",9); SendASC(0x0d);//来电显示
delay(1000);
SendToTC35("AT+CMGF=0",9); SendASC(0x0d);//中文短信
delay(1000);
Call();//初始化后回拔电话表示已完成
}
//串口中断
void com_init(void) interrupt 4 using 3
{
char *Ring;
if(RI)
{
RsBuf[RsPoint++]=SBUF;
if(RsPoint>=sizeof(RsBuf))
{
RsPoint=0;
}
Ring=strstr(RsBuf,",161,,,,0") ;//查询到有来电标志的话 挂机
if(Ring!=NULL)
{
delay(400);
SendToTC35("ATH",3);
SendASC(0x0d);
strcpy(RsBuf+(strlen(RsBuf)-9),"\n");//清除来电激活标志: ,161,,,,0
}
RI=0;
}
}
//主函数
void main(void)
{
unsigned char *pass;
init51();
initTC51i(); // 初始化
while(1)
{
delay(300);
pass=strstr(RsBuf,"505A996D");//做饭的UNICODE代码 查询接收的短信中有做饭的代码 接通继电器
if(pass!=NULL)
{
if(i==1) { Race =1; i=0; } //开p2.0继电器
else { Race =0; i=1; } //断p2.0继电器
Call();
strcpy(RsBuf,pass+8); //接收到的PDU串 8是命令的长度(如做饭8个unicode字符)48是短信无信息时的字符个数
RsPoint=strlen(RsBuf);
}
pass=strstr(RsBuf,"15881084287");//接收到指定的电话后 接通相应继电器
if(pass!=NULL)
{
if(l==1) { AIR=1; l=0; }
else { AIR=0; l=1; }
Call();
strcpy(RsBuf,pass+11); //接收到的PDU串 8是命令的长度(如做饭8个unicode字符)48是短信无信息时的字符个数
RsPoint=strlen(RsBuf);
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|