OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9688|回复: 8

51控制SIM900A模块接收短信,无法读取下!

[复制链接]

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
发表于 2015-3-9 22:08:45 | 显示全部楼层 |阅读模式
5金钱
如题,用51可以控制SIM900A发短信,但是接收总是读取不了,是比较出了问题,还是中断保存函数出了问题,原子哥来帮帮忙!感谢
[mw_shl_code=c,true]/* 作者:陈奕均 时间:2015、3、4 功能:实现GSM短信控制 51模块上的开关 open-灯全亮 ,close-灯全灭 *****************************************/ #include <reg51.h> #include<string.h> #define uchar unsigned char #define uint unsigned int #define FOSC_110592M //单片机晶振 //uchar SIM900A_CMTI[]="+CMTI"; uchar SIM900A_OPEN[]="open"; uchar SIM900A_CLOSE[]="close"; char read_data[70]={1,1,1,1}; // 保存串口接收到的信息 uchar receiveready; void Delay1ms(uint c); //延时 void SerialInit(); //初始化串口 void Uart1Send(uchar c); // void Uart1Sends(uchar *str); //串口发送指令 void GSM_Iint(); //GSM初始化 void receive_ready(void); //判断是否接收到短信 这个感觉有问题 char *LookFor_Str(uchar *s, uchar *t); //对比短信内容 void main() { P1=0x01; GSM_Iint(); P1=0x02; Delay1ms(1000); while(1) { P1=0x04; //程序达到 指示灯 Uart1Sends(read_data); //发送到 电脑 检测 read_data receive_ready(); //等待短信到来,如到来 receiveready=1 if(receiveready) { uchar *p; P1=0x08; Uart1Sends("AT+CMGR=1\r\n"); // 读取短信内容 Delay1ms(3000); // p=strstr(read_data,SIM900A_OPEN); // if(p!=NULL) // {P1=0XFF;Delay1ms(3000); } // p=strstr(read_data,SIM900A_CLOSE); // if(p!=NULL) // {P1=0x00; } } } } /************1毫秒延时*******/ void Delay1ms(uint c) { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /********************串口初始化*****/ void SerialInit() { TMOD=0x20;//定时器1模式2:10位自动重装 //补充:SIM900A的接收串口能自动识别 2400-115200 //#ifdef FOSC_12M //这里根据晶振大小设置不同的数值初始化串口 // TH1=0xf3; //装入初值,波特率:2400 // TL1=0XF3; //#else TH1=0xFD; //装入初值,波特率:9600 TL1=0XFD; //#endif TR1=1; //打开定时器 /**********SCON=0X50;********/ SM0=0; //设置串行通讯工作模式,10为一步发送,波特率可变,又定时器1的溢出率控制 SM1=1; // 同上,溢出一次发送一位 REN=1; // 串行接受允许位(先设置SM0,SM1再开) EA=1; // 总中断 ES=1; // 串行口中断 } /***************发送数据函数 Uart1Send*******/ void Uart1Send(uchar c) { SBUF=c; while(!TI);//等待发送信号(TI=1)出现 TI=0; } //串行口连续发送char数组,遇到终止号\0将停止 void Uart1Sends(uchar *str) { while(*str!='\0') { SBUF=*str; while(!TI); TI=0; str++; } } /*******************************************/ //查找字符串,在s中查找t //返 回 值: s_temp(t在s中的位置)成功 0失败 char *LookFor_Str(uchar *s, uchar *t) { uchar *s_temp; uchar *m_temp; uchar *t_temp; if (s == 0 ||t == 0) return 0; for (s_temp = s; *s_temp != '\0'; s_temp++) { m_temp = s_temp; for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++); if (*t_temp == '\0') return 1; } return 0; } /****************GSM初始化******************/ void GSM_Iint() { SerialInit(); Uart1Sends("AT+CSCS=\"GSM\"\r\n"); // 设置GSM字符 Delay1ms(3000); Uart1Sends("AT+CMGF=1\r\n"); //设置TEXT文本模式 Delay1ms(3000); Uart1Sends("AT+CMGD=1,4\r\n"); //删除所有短信 Delay1ms(3000); Uart1Sends("AT+CNMI=2,1\r\n"); //新消息自动提醒 Delay1ms(3000); } void receive_ready(void) //检测是否有短信来。 { uchar i,p; p=LookFor_Str(read_data,"CMTI"); if(p) //如果有新短信(TI)来,模块会通过串口向单片机发送字符串,如果收到CMTI: { // 此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1 receiveready=1; P1=0x10; Delay1ms(3000); } else { P1=0x20; Delay1ms(3000); for(i=0;i<70;i++) { read_data=0x00; } } } /*************串口中断接受数据 存入read_data[70]*****/ void Serial_interrupt() interrupt 4 { int i=0; EA=0; if(RI) { if(i<70) { read_data[i++]=SBUF; } RI=0; EA=1; } } [/mw_shl_code]
本人QQ:328580842,谢了!

最佳答案

查看完整内容[请看2#楼]

51+sim900a接收发送短信代码 [mw_shl_code=c,true]/**************http://tpytongxin.taobao.com/****************/ #include <reg52.h> #include <intrins.h> #include <string.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char sbit Send_ENGLISH_key=P3^2; //·?????TEXT????°??ü sbit Send_CALLING_key=P3^3; //?ò???°°??ü sbit Send_DS18B20 ...
学习!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-3-9 22:08:46 | 显示全部楼层
51+sim900a接收发送短信代码

[mw_shl_code=c,true]/**************http://tpytongxin.taobao.com/****************/ #include <reg52.h> #include <intrins.h> #include <string.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char sbit Send_ENGLISH_key=P3^2; //·?????TEXT????°??ü sbit Send_CALLING_key=P3^3; //?ò???°°??ü sbit Send_DS18B20_key=P3^4; //·?????°??ü sbit Send_SMS_PDU_key=P3^5; //·?????PDU????°??ü #define MAXCHAR 81 uchar aa[MAXCHAR]; code uchar ATE0[]="ATE0\r\n"; code uchar CREG_CMD[]="AT+CREG?\r\n"; code uchar SMS_send[]="AT+CMGS=18\r\n"; code uchar ATCN[]="AT+CNMI=2,1\r\n"; code uchar CMGF0[]="AT+CMGF=0\r\n"; code uchar CMGF1[]="AT+CMGF=1\r\n"; code uchar CMGR[12]="AT+CMGR=1\r\n"; code uchar CMGD[12]="AT+CMGD=1\r\n"; #define CALL_YOU_TELNUMBER "ATD18622900000;\r\n" //???????????????ú???? ????°?×??? #define SEND_MESSA_TO_YOUR "at+cmgs=\"1862200000\"\r\n" //???????????????ú???? ????°?×??? #define SEND_MESSA_CONTENT "warning" sbit JIDIANQI=P1^0; sbit FENGMINGQI=P1^1; uchar a,j=0,flag=0; int g_timeout=0; void delay(uint ms)// ???±×????ò { uchar i; while(ms--) { for(i=0;i<120;i++); } } /*********************************************************** ??????????Print_Char ??????????·???????×?·? ????????:ch ???????????? ***********************************************************/ Print_Char(uchar ch)//·???????×?·? { SBUF=ch; //?????????? while(TI!=1); //????·????ê±? TI=0; //?í?????? } /*********************************************************** ??????????Print_Str ??????????·???×?·??® ????????:*str ???????????? ***********************************************************/ Print_Str(uchar *str)//·???×?·??® { while(*str!='\0') { Print_Char(*str); delay(2); str++; } } /*********************************************************** ??????????Ini_UART ???????????®???????????¨?±?÷?????? ????????:?? ???????????? ***********************************************************/ Ini_UART(void)//?®???????????¨?±?÷?????? { SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr //UART??????1??8???????????í???? TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload //?¨?±?÷1??????2,8??×?????×° PCON |= 0x80 ; //SMOD=1; TH1 = 0xFA ; //Baud:19200 fosc="11".0592MHz TL1=0xFA; IE |= 0x90 ; //Enable Serial Interrupt TR1 = 1 ; // timer 1 run TI=1; ES=1; } void clearBuff(void) { for(j=0;j<MAXCHAR;j++) { aa[j]=0x00; } j=0; } void led(int i) { P2 |= i; delay(20); P2 &= ~i; delay(20); P2 |= i; delay(20); P2 &= ~i; } int Hand() { delay(10); if(strstr(aa,"OK")!=NULL) //?ì???????ú?????é?????? { g_timeout=0; return 1; } if(g_timeout>50) { g_timeout=0; return -1; } g_timeout++; return 0; } void AT(void) { clearBuff(); Print_Str(ATE0); delay(50); while(strstr(aa,"OK")==NULL) { delay(50); led(0x01); clearBuff(); Print_Str(ATE0); } led(0x02); Print_Str(ATCN); delay(50); while(1) { clearBuff(); Print_Str(CREG_CMD); delay(50); if(((aa[9]=='0')&&(aa[11]=='1'))||((aa[9]=='0')&&(aa[11]=='5'))) { clearBuff(); led(0x08); break; } else { clearBuff(); led(0x04); delay(50); } } } void send_english() { P2=0XFF; clearBuff(); Print_Str(CMGF1); delay(100); led(0x01); Print_Str(SEND_MESSA_TO_YOUR); delay(300); led(0x02); Print_Str(SEND_MESSA_CONTENT); //·????????? delay(10); Print_Char(0x1A); //·????á??·??? delay(10); led(0x04); clearBuff(); delay(3000); delay(3000); } void send_call() { clearBuff(); delay(100); Print_Str(CALL_YOU_TELNUMBER); //?ò???° clearBuff(); delay(3000); delay(3000); } void main() { Ini_UART(); //???????®?? AT(); //?????????é delay(10); Send_ENGLISH_key=1; //·?????TEXT????°??ü Send_CALLING_key=1; //?ò???°°??ü Send_DS18B20_key=1; //·?????°??ü Send_SMS_PDU_key=1; //·?????PDU????°??ü clearBuff(); Print_Str(CMGD); delay(50); while(Hand()==0); clearBuff(); Print_Str(CMGF1); delay(30); Print_Str(ATCN); delay(30); send_english(); while(1) { //////////////////////////////////////////////////////////////////////// if(Send_ENGLISH_key==0) //·?????TEXT????°??ü { send_english(); } else if(Send_CALLING_key==0) //?ò???°°??ü { send_call(); } else if(Send_SMS_PDU_key==0) { } if(strstr(aa,"RING")!=NULL) { FENGMINGQI=0; delay(2); clearBuff(); } else { FENGMINGQI=1; } if(strstr(aa,"+CMTI")!=NULL) //????????+CMTI×?·? { clearBuff(); Print_Str(CMGF1); delay(50); while(Hand()==0); clearBuff(); Print_Str(CMGR); //????1???????????? delay(100); if(strstr(aa,"k11")!=NULL) { JIDIANQI=0; } else if(strstr(aa,"k10")!=NULL) { JIDIANQI=1; } clearBuff(); Print_Str(CMGD); delay(50); while(Hand()==0); clearBuff(); } //////////////////////////////////////////////////////////////////////// } } void ser() interrupt 4 { if(RI==1) { aa[j]=SBUF;//?ü???????ü????×é RI=0; //?í?????????????? j++; } } [/mw_shl_code]

学习!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-3-9 23:09:20 | 显示全部楼层
我只能帮顶,51好多年没玩了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
 楼主| 发表于 2015-3-9 23:11:06 | 显示全部楼层
解决这个就有51控制sim900收发短信的程序了。
学习!
回复

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-30 13:39:51 | 显示全部楼层
回复【4楼】q27488:
--------------------------------
 看到了继电器和蜂鸣器,这个是只是GSM的代码吗
大家共勉~
回复

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-30 14:07:08 | 显示全部楼层
好像不能用啊···大神,给我指点指点
大家共勉~
回复

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2015-9-20 15:56:54 | 显示全部楼层
注释是火星语言?
我是一只菜鸟,但我会大鹏展翅
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-9-28 14:18:32 | 显示全部楼层
中断不进吗?
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2015-9-29 20:37:31 | 显示全部楼层
你在receive—ready中调用了lookfor—str函数,那个函数是不是只能检测到一位数据,能直接找到字符串吗???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表