单片机学习小组
直播中

李子胡

8年用户 144经验值
私信 关注

51控制SIM900A模块接收短信不能读取

如题,用51可以控制SIM900A发短信,但是接收总是读取不了,是比较出了问题,还是中断保存函数出了问题,原子哥来帮帮忙!感谢[C] 纯文本查看 复制代码
/*作者:陈奕均时间:2015、3、4功能:实现GSM短信控制 51模块上的开关      open-灯全亮  ,close-灯全灭  *****************************************/#include #include#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=1rn"); //读取短信内容     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数组,遇到终止号将停止void Uart1Sends(uchar *str){  while(*str!='')  {   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 != ''; s_temp++){m_temp = s_temp;for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);if (*t_temp == '') return 1;}return 0;}/****************GSM初始化******************/void GSM_Iint(){  SerialInit();  Uart1Sends("AT+CSCS=\"GSM\"rn"); //设置GSM字符  Delay1ms(3000);  Uart1Sends("AT+CMGF=1rn"); //设置TEXT文本模式  Delay1ms(3000);  Uart1Sends("AT+CMGD=1,4rn");  //删除所有短信  Delay1ms(3000);  Uart1Sends("AT+CNMI=2,1rn");   //新消息自动提醒  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;  }}   本人QQ:328580842,谢了!

回帖(8)

李欣

2019-5-10 08:20:15
51+sim900a接收发送短信代码
[C] 纯文本查看 复制代码
/**************http://tpytongxin.taobao.com/****************/#include #include #include #include #define uint unsigned int#define uchar unsigned char***it Send_ENGLISH_key=P3^2;     //·?????TEXT????°??ü***it Send_CALLING_key=P3^3;     //?ò???°°??ü***it Send_DS18B20_key=P3^4;     //·?????°??ü***it Send_SMS_PDU_key=P3^5;     //·?????PDU????°??ü#define MAXCHAR 81uchar  aa[MAXCHAR];code uchar ATE0[]="ATE0rn";code uchar CREG_CMD[]="AT+CREG?rn";code uchar SMS_send[]="AT+CMGS=18rn";code uchar ATCN[]="AT+CNMI=2,1rn";code uchar CMGF0[]="AT+CMGF=0rn";code uchar CMGF1[]="AT+CMGF=1rn";code uchar CMGR[12]="AT+CMGR=1rn";code uchar CMGD[12]="AT+CMGD=1rn";#define CALL_YOU_TELNUMBER "ATD18622900000;rn"    //???????????????ú???? ????°?×???#define SEND_MESSA_TO_YOUR "at+cmgs=\"1862200000\"rn"    //???????????????ú???? ????°?×???#define SEND_MESSA_CONTENT "warning"***it JIDIANQI=P1^0;***it 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!='')    {        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;j50)    {        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++;    }}
举报

李开英

2019-5-10 08:32:02
我只能帮顶,51好多年没玩了。
举报

h1654155275.5879

2019-5-10 08:38:38
解决这个就有51控制sim900收发短信的程序了。
举报

刘桂兰

2019-5-10 08:47:05
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分