⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pt_gprs.c

📁 51单片机控制GM862 GPRS模块进行数据传输
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <reg52.h>
//===============================================================
#define  uchar unsigned char
#define  uint  unsigned int
//
//sbit  get_led=P0^1;            //接收指示灯      
//sbit  send_led=P0^2;           //发送指示灯
//sbit  over_led=P0^3;           //结束指示灯 
//sbit  er_led1=P0^4;          //错误指示灯
//sbit  er_led2=P0^5;          //错误指示灯
//sbit  er_led3=P0^6;          //错误指示灯
//sbit  er_led4=P0^7;          //错误指示灯
//================================================================
sbit AdrIn0 = P1^3;                 //子串口0、1、2接收地址
sbit AdrIn1 = P1^4;
sbit AdrOut0 = P0^6;                //子串口0、1、2发送地址
sbit AdrOut1 = P0^7;
sbit TTL_485 = P1^0;                //485控制
//================================================================
# define  OLEN   16               //发送缓冲区大小
uchar idata outbuf[OLEN];         //发送缓冲区
uchar idata *outlast=outbuf;      //最后由中断传输出去的字节位置
uchar idata *putlast=outbuf;      //最后放入发送缓冲区的字节位置
# define  ILEN    6               //接收缓冲区大小
uchar idata inbuf1[ILEN];         //接收缓冲区1
uchar idata inbuf2[ILEN];         //接收缓冲区2
uchar idata *inlast1=inbuf1;      //最后由中断进入接收缓冲区1的字节位置
uchar idata *inlast2=inbuf2;      //最后由中断进入接收缓冲区2的字节位置

uchar idata AT_BUFF[20];              //指令接收缓存    
uchar idata *inline=AT_BUFF;      //接收缓存的指针

uchar idata TIsign;               //中断向母串口发零以使母子串口波特率协调
uchar idata data_number1;         //接收的数据个数
uchar idata data_number2;         //接收的数据个数
uint  idata T0_10ms_count;           //定时器溢出计数      

bit bdata outbufsign;             //输出缓冲区非空标志    有=1
bit bdata inbufful1;              //输入缓冲区1满标志     满=1
bit bdata inbufful2;              //输入缓冲区2满标志     满=1

bit bdata OI;                     //子串口0、1选择标志量
bit bdata data_over1;             //一路数据接收完毕
bit bdata data_over2;             //二路数据接收完毕
   
//====================================================
void DelayUs(uint delay_Nus)     //延时N us
{
   while(delay_Nus)
       delay_Nus--;
}
//=====================================================
//串口中断
//=====================================================
serial() interrupt 4
{
 if(TI)
   {
    TI=0;
    if(outbufsign)                              //缓冲区满标志
    {
     if(TIsign==0)                                 //TIsign为零发数据
     {
      if(OI==0)                                  //如果发给串口0     .........PT...........
      {
	   TTL_485=0;
       AdrOut0=0;                                 //置串口0地址
       AdrOut1=0;
//	   TTL_485=0;                                //........................pt......................
       SBUF=*outlast;                             //未发送完继续发送
       outlast++;                                 //最后传出去的字节位置加一
       }
      else
      {
       AdrOut0=1;                                 //置串口1地址
       AdrOut1=0;
       SBUF=*outlast;                            //未发送完继续发送
       outlast++;                                //最后传出去的字节位置加一
       }
      TIsign=3;                                    //置发零个数标志量为三
      }
     else                                        //否则发零
      {
       AdrOut0=1;                                //置母串口地址
       AdrOut1=1;
       SBUF=0;                                   //发零
       TIsign--;
       }
     if(outlast==outbuf+OLEN) outlast=outbuf;    //地址到顶部回到底部
     if((putlast==outlast)&&TIsign==0) 
	  {
	   DelayUs(0x60);   //延时25us  .........................................................
	   TTL_485=1;            //...................pt..................................
	   outbufsign=0;         //数据发送完置发送缓冲区空标志
	   }

      }
    }
 if(RI)
   {
    RI=0;
     if(AdrIn0==0)                              //串口0接到数据          从PT获取
     {
      data_number1++;                           //个数加一
      if(data_number1>=1&&data_number1<=3)     //截取需要的数字串
      {
       *inlast1=SBUF;                            //放入数据
       inlast1++;                                //最后放入的位置加一
       }
	  
      if(inlast1==inbuf1+ILEN)                  //地址到顶部回到底部
       {
        inlast1=inbuf1;
        inbufful1=1;                            //接收缓冲区满置满标志
       }

	  if(data_number1==3)
	    {
		 inlast1=inbuf1;                         //...............................................
	     data_over1=1;                             //下位机接收结束
		 }
      }

      else                                      //串口1接到数据           从PC获取
       {
      data_number2++;                           //个数加一
      if(data_number2>=1&&data_number2<=6)       //截取需要的数字串
      {
       *inlast2=SBUF;                             //放入数据
       inlast2++;                                 //最后放入的位置加一
       }

      if(inlast2==inbuf2+ILEN)                    //地址到顶部回到底部
       {
        inlast2=inbuf2;
        inbufful2=1;                             //接收缓冲区满置满标志
       }

	  if(data_number2==6)                       //上位机接收结束
	   {
	    inlast2=inbuf2;                         //................................................
	    data_over2=1;
        }                     
      }




     }
}
//=====================================================
//放一串数据到发送缓冲区
//=====================================================
putbytes(unsigned char *outplace,unsigned char j)
{
 int i;
 for(i=0;i<j;i++)
 {
  *putlast=*outplace;                          //放字节进入缓冲区
  putlast++;                                   //入指针加一
  outplace++;                                  //字符串指针加一
  if(putlast==outbuf+OLEN)putlast=outbuf;      //指针到了顶部换到底部
  }
  if(!outbufsign){outbufsign=1;TI=1;}          //缓冲区开始为空,置为“有”标志,启动发送

 } 
//..................................................
//定时器T0中断
//..................................................
void timer0_ISR(void)interrupt 1
{
 T0_10ms_count++;                              //溢出次数加一
 TL0=0x00;
 TH0=0xB8;                                     //置初值
 
}
//..................................................
void  getDatas()        //数据接收函数 
{ 
 uchar data_over=0;
   T0_10ms_count=0;
//         get_led=0;      //开接收指示灯
		      RI=0;      //置接收位清零
  do{
     while(!RI)
     {
      if(T0_10ms_count==3000)  //超过30秒,亮错误指示灯
      {
//       er_led1=0;        //初始化错误指示灯关
//	   er_led2=0;
//	   er_led3=0;
//	   er_led4=0;
     data_over=1;       //结束数据接收
           break;       //跳出  
//       while(1){};        //............................
       }
     };
             RI=0;

     *inline=SBUF;

	 if(*inline==0x0A&&*(inline-1)==0x0D)                           //接收结束条件判断  指令
	    {
		 if(*(inline-2)=='K'||*(inline-2)=='R'||*(inline-2)=='T')
		  {
		   if(*(inline-3)=='O'||*(inline-3)=='C'||*(inline-3)=='E')
		   data_over=1;
		   }
		 }
	   
     inline++;
                           //数据判断
    }while(data_over!=1);  //数据已接完
        
   inline=AT_BUFF;     //接收指针回缓存首址
  DelayUs(0x09C4);     //延时10ms   115200byte/s  70us/byte,可延时150个字节
//        get_led=1;     //关接收指示灯

}
//..................................................
//向串口发送一个字节的数据
//.................................................
void sendData(uchar c)
{ 
  uchar i;
  AdrOut0=1;                                 //置串口1地址
  AdrOut1=0;

  SBUF=c;
  while(!TI);
  TI=0;

  AdrOut0=1;                                //置母串口地址
  AdrOut1=1;

  for(i=0;i<3;i++)
  {
   SBUF=0;                                   //发零
   while(!TI);
   TI=0;
  }
}
//....................................................
//向串口发送一串数据
//....................................................
void sendDatas(uchar *outline)
{
  int i;
//  send_led=0;        //开发送指示灯
  DelayUs(0x04E2);   //延时5ms 
  for(i=0;*outline!=0;i++)
   {
    sendData(*outline);
    outline++;
    }
//  send_led=1;        //关发送指示灯
}
//......................................................
//十六进制字符串转化为十六进制  "B0"=>0xB0
//......................................................
void ASCII_OXXX(uchar *changeline)
{
 uchar i=0;
 while(i<6)
 {
  switch(*changeline)
   { 
    case '0':
	         if(i%2==0)                         //字符高位转化为十进制
			 *changeline=0*16;
			 if(i%2!=0)                         //字符低位转化为十进制
              {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+0;  //高低位相加,存放与某一位置,本例中六字符十六进制字符串转化为三字符十六进制
               if(i==3)
               *(changeline-2)=*(changeline-1)+0;
               if(i==5)
               *(changeline-3)=*(changeline-1)+0;
               }
			 break;
	case '1':
	         if(i%2==0)
			 *changeline=1*16;
			 if(i%2!=0)
              {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+1;
               if(i==3)
               *(changeline-2)=*(changeline-1)+1;
               if(i==5)
               *(changeline-3)=*(changeline-1)+1;
               }
			 break;
	case '2':
	         if(i%2==0)
			 *changeline=2*16;
			 if(i%2!=0)
			  {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+2;
               if(i==3)
               *(changeline-2)=*(changeline-1)+2;
               if(i==5)
               *(changeline-3)=*(changeline-1)+2;
               }
			 break;
	case '3':
	         if(i%2==0)
			 *changeline=3*16;
			 if(i%2!=0)
		       {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+3;
               if(i==3)
               *(changeline-2)=*(changeline-1)+3;
               if(i==5)
               *(changeline-3)=*(changeline-1)+3;
               }
			 break;
	case '4':
	         if(i%2==0)
			 *changeline=4*16;
			 if(i%2!=0)
			   {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+4;
               if(i==3)
               *(changeline-2)=*(changeline-1)+4;
               if(i==5)
               *(changeline-3)=*(changeline-1)+4;
               }
			 break;
	case '5':
	         if(i%2==0)
			 *changeline=5*16;
			 if(i%2!=0)
		       {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+5;
               if(i==3)
               *(changeline-2)=*(changeline-1)+5;
               if(i==5)
               *(changeline-3)=*(changeline-1)+5;
               }
			 break;
	case '6':
	         if(i%2==0)
			 *changeline=6*16;
			 if(i%2!=0)
			   {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+6;
               if(i==3)
               *(changeline-2)=*(changeline-1)+6;
               if(i==5)
               *(changeline-3)=*(changeline-1)+6;
               }
			 break;
    case '7':
	         if(i%2==0)
			 *changeline=7*16;
			 if(i%2!=0)
			   {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+7;
               if(i==3)
               *(changeline-2)=*(changeline-1)+7;
               if(i==5)
               *(changeline-3)=*(changeline-1)+7;
               }
			 break;
	case '8':
	         if(i%2==0)
			 *changeline=8*16;
			 if(i%2!=0)
			   {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+8;
               if(i==3)
               *(changeline-2)=*(changeline-1)+8;
               if(i==5)
               *(changeline-3)=*(changeline-1)+8;
               }
			 break;
	case '9':
	         if(i%2==0)
			 *changeline=9*16;
			 if(i%2!=0)
			   {
               if(i==1)
			   *(changeline-1)=*(changeline-1)+9;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -