永发信息网

关于GSM与52单片机通讯问题

答案:1  悬赏:60  手机版
解决时间 2021-03-27 02:18
  • 提问者网友:沦陷
  • 2021-03-26 19:21
关于GSM与52单片机通讯问题
最佳答案
  • 五星知识达人网友:一袍清酒付
  • 2021-03-26 20:47
#include
#include
#include

//#define buf_max 72//定义缓存长度为72
sbit KEY1 = P0^0; //按键1,拨打电话
sbit KEY2 = P0^1; //按键2,挂断电话
sbit KEY3 = P0^2; //按键3,接听电话
sbit KEY4 = P0^3; //按键4,发送一条英文短信息
sbit KEY5 = P0^4; //按键5,发送一条中文短信息
//sbit LED1 = P2^0; //第一个指示灯
//sbit LED2 = P2^1; //第二个指示灯
//sbit LED3 = P2^2; //第三个指示灯
//sbit LED4 = P2^3; //第四个指示灯
//sbit IGT = P2^4; //点火信号线
//unsigned char code trec_buf[buf_max];//定义接收缓存
char code num[]="13101601289F"; //定义要拨打的电话号码,拨打其它电话在这时修改
char code sms[]="6E295EA6FF1A003300350043"; //"温度:35C"的Unicode码,发送其它中文,可在这里修改

char code str1[]="AT\n"; //定义字符串1
char code str2[]="AT+CMGF=0\n"; //定义字符串2
char code str3[]="AT+CSCS=GSM\n"; //定义字符串3
char code str4[]="AT+CSMP=17,167,0,8\n"; //定义字符串4
char code str5[]="AT+CMGS="; //定义字符串5
char code str6[]="0891683110901105F011000D9168"; //定义字符串6
char code str7[]="000800"; //定义字符串7

char code str8[]="AT\n"; //定义字符串8
char code str9[]="AT+CMGF=1\n"; //定义字符串9
char code str10[]="AT+CSCS=GSM\n"; //定义字符串10
char code str11[]="AT+CSMP=17,167,0,0\n"; //定义字符串11
char code str12[]="AT+CMGS=13101601289\n"; //定义字符串12
char code str13[]="Hello world!!"; //定义字符串13
char code str14[]="\x1a"; //定义字符串14

void Serial_Init(void); //声明串口初始化函数
void GSM_Call(unsigned char *num); //声明拨打指定电话函数
void GSM_Hang(void); //声明挂电话函数
void GSM_Answer(void); //声明接电话函数
void Delay_ms(unsigned int time); //声明延时函数
void GSM_Sent_Text_Message(void); //声明给指定号码发送TEXT模式短信息函数
void GSM_Sent_PDU_Message(char num[],char sms[]); //声明给指定号码发送PDU模式短信息函数



void main(void)
{
Serial_Init(); //调用串口初始化函数
TI = 1;
while(1)
{

if(KEY1==0) //如果是按键1按下,则给13101601289 这个号码打电话
{
Delay_ms(20);
while(KEY1==0);
{
Delay_ms(20);
GSM_Call(num);
}
}

if(KEY2==0) //如果是按键2按下,则挂断电话
{
Delay_ms(20);
while(KEY2==0);
{
Delay_ms(20);
GSM_Hang();
}
}
if(KEY3==0) //如果是按键3按下,则接听电话
{
Delay_ms(20);
while(KEY3==0);
{
Delay_ms(20);
GSM_Answer();
}
}
if(KEY4==0) //如果是按键4按下,则向13101601289 发送一条英文信息
{
Delay_ms(20);
while(KEY4==0);
{
Delay_ms(20);
GSM_Sent_Text_Message();
}
}
if(KEY5==0) //如果是按键5按下,则向13101601289 发送一条中文信息
{
Delay_ms(20);
while(KEY5==0);
{
Delay_ms(20);
GSM_Sent_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
//ES = 1; //开启串口中断
//EA = 1; //开启全局中断
}



void Serial_Int() interrupt 4
{
ES=0; //关串口中断,防止中断嵌套
if(TI) //如果是发送中断,则不做任何处理
{
TI = 0; //清除发送中断标志位
}
if(RI) //如果是接送中断,则进行处理
{
RI = 0; //清除接收中断标志位
}
ES = 1; //开启串口中断
}


void Delay_ms(unsigned int time)
{
unsigned int i;
for(;time>0;time--)
{
i=1500;
while(i--);
}
}



void GSM_Call(unsigned char *num)
{
printf("ATD");
printf("%s;\n",num);
Delay_ms(100);
}


void GSM_Hang(void)
{
printf("ATH\n");
Delay_ms(100);
}


void GSM_Answer(void)
{
printf("ATA\n");
Delay_ms(100);
}


void GSM_Sent_Text_Message(void)
{
printf("%s",str8); //以下几个为GSM的AT串口指令,设置短信发送类型
Delay_ms(200);
printf("%s",str9); //设置为TEXT模式,适合发送短信内容为英文
Delay_ms(200);
printf("%s",str10); //使用GSM字符集
Delay_ms(200);
printf("%s",str11); //设置TEXT模式参数
Delay_ms(200);
printf("%s",str12); //设置接收端电话号码
Delay_ms(200);
printf("%s",str13); //具体发送的内容在此修改
printf("%s",str14); //结束符,相当于键盘的CTRL+Z
Delay_ms(200);
}



void GSM_Sent_PDU_Message(char num[],char sms[])
{
unsigned char 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); //一开始发送的字符,包括短信中心号码等,这部分一般都是固定不变的,可以不用管它
//strcat(num,"F"); //在接收端号码后面补F,使之成为12位字符
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);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯