|
TC35和电脑通信良好,但是通过51单片机控制发送短信总是不成功!
看很多帖子说是电平不匹配的问题,51单片机是5V供电。
TXD,RXD分别接单片机的TXD,RXD。用电阻分压,不知道可不可一。
下面贴出原理图和实验程序,请大家看看有没有什么问题,谢谢!!!
/**********************************************
发送中文短信,内容是固定。
GSM_TC35_中文短信发送程序测试
程序功能:发中文短信
晶振:11.0592M
日期:2010-12-13
**********************************************/
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1 = P0^1; //按键定义,当按键按下,则发送短信
char code num[] = "15072718697F";//要接收短信的号码
char code sms[] = "5929751F82F14FCAFF0C795D4F60751F6D3B61095FEBFF01";//短信内容:"天生英俊,祝你生活愉快!"Unicode码
char code str1[] = "AT\n"; //发送AT,握手指令
char code str2[] = "AT+CMGF=0\n"; //定义发送的短信为PDU格式,即短信内容为中文
char code str3[] = "AT+CSCS=GSM\n"; // 使用GSM字符集
char code str4[] = "AT+CSMP=17,167,0,8\n"; //长度
char code str5[] = "AT+CMGS=";
char code str6[] = "0891683110702105F011000D9168"; //短信信息中心号码设置
char code str7[] = "000800";
void Serial_Init(void); //声明串口初始化函数
void Delay_ms(uint time); //声明延时函数
void Send_PDU_Message(char num[], char sms[]); //声明给指定号码发送PDU模式短信息函数
//=====主函数=====//
void main(void)
{
Serial_Init();
TI = 1;
while(1)
{
if (key1 == 0)
{
Delay_ms(20);
if (key1 == 0)
{
Delay_ms(20);
Send_PDU_Message(num, sms);
}
}
}
}
//=====串口初始化函数=====//
void Serial_Init(void)
{
SCON = 0X50; //串口:方式1,允许发送和接收
TMOD = 0x20; //定时器1:模式2,8位自动重装模式,用于产生波特率
TH1 = 0XFD; //11.0592MHZ晶振,设置波特率为9600
TL1 = 0XFD;
TR1 = 1; //开启定时器1
}
//=====延时函数=====//
void Delay_ms(unsigned int time)
{
unsigned int i;
for (; time>0; time--)
{
i=1500;
while(i--);
}
}
//=====串口中断=====//
/*void Serial_Int() interrupt 4
{
ES = 0;
if(TI)
{
TI = 0;
}
if(RI)
{
RI = 0;
}
} */
//=====中文短信内容发送函数=====//
//=函数功能:给指定号码发送中文短信。num[]=接收端号码;Sms[]=发送中文内容的Unicode编码
//=
//=
//==============================//
void Send_PDU_Message(char num[], char sms[])
{
uchar i;
printf("%s", str1); //发送握手指令
Delay_ms(200);
printf("%s", str2); //设置为PDU模式,适合发送短信内容为中文
Delay_ms(200);
printf("%s", str3); //使用GSM字符集
Delay_ms(200);
printf("%s", str4); //设置PDU模式参数,8为使用Unicode编码
Delay_ms(200);
printf("%s", str5);
printf("%d\n", strlen(sms)/2+15); //字节长度,与实际短信内容长度有关
Delay_ms(200);
printf("%s", str6); //一开始发送的字符,包括短信中心号码等,这部分一般都是固定不变的,可以不用管它
for (i=0; i<6; i++) //然后接收短信的电话号码再两位两位分别调换位置
{
printf("%c%c", num[2*i+1], num[2*i]);
}
printf("%s", str7); //固定字符
printf("%02x", strlen(sms)/2); //中文短信内容字数
printf("%s\x1a", sms); //发送内容的Unicode编码字符串+(CTRL+Z)
Delay_ms(200);
}
![](http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_604394NZS9A3.jpg)
原理图 (原文件名:00.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|