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

📄 410rt.c

📁 GSM通信系统的软件设计
💻 C
字号:
#include <c8051F410.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define buf_len 120
#define SYSCLK 24500000                 
#define uart_rate 9600                  

#define C_TMR1 -((SYSCLK/48)/2)/uart_rate
#define C_TMR0 -((SYSCLK/48)/1000)*20
/*
struct location
{
    uchar high;
	uchar low;
}location;
*/
sbit TC35_IGT = P1^6;
sbit TC35_PD = P1^5;
sbit PC_using=P2^6;

void ENA_WDT (void);
void SYSCLK_Init (void);
void GSM_PORT_Init (void);
void CKCON_Init (void);
void Uart0_Init (void);
void Port_Init (void);

void GSM_Init (void);
void delay_20ms (void);

void transmitte (void);                           //send information
void Read_sms(void);              //read a message
void Process_sms(void);                              //process a message;
void Send_sms(void);                                 //send a message;
void Del_sms(void);                                  //delete a message
void ini_buf(void);                                  //initial rec_buff  put_buf=get_buff;
void addbuffer(void);                                //add buffer;
uchar getbuffer(void);                               //get from buffer;

uchar code tr_buf[] = {"atd13488716723;\r\0"};
//uchar code del_msm[]={"AT+CMGD=10\r\0"};       //删短信
uchar code sd_ms[]={"AT+CMGS=\""};       //发信息
uchar code pho[]={"13488716723"};           //管理员号码
uchar data loca[12]={"AT+CMGR="};          //接信息
uchar xdata rec_buf[buf_len];              //循环数组
uchar xdata *get_pt=rec_buf;               //循环数组操作指针
uchar xdata *put_pt=rec_buf;               //循环数组加数值指针
uchar *data tr_point;                       //发送指针  
uchar xdata privacy[]={"123456 \0"};        //校验密码
uchar xdata content[30];                   //存储管理员发来的信息
//uchar xdata content1[]="";               //存储管理员发来的信息

uchar data alarms[32]="";                  //要发的警报信息
uchar data send_buff[25]="AT+CMGS=\"";    //发送缓冲区        

bit	TRANS_NEXT_BYTE_OK=0;
bit Recving_SMS=0;          //正在接受短信
bit SMS_EN=0;               //来短信头已接完;
bit IS_sending=0;           //正在发送信息
bit SMS_OK=0;               //消息内容已接完
bit CM_CMD=0;               //content已接到管理员的信息,通知主机取值
bit DEL_MS=0;               //删除短信
bit ALARM=0;               //有报警
bit CSD=0;                //标记 发送AT+CMGS="13488716723"<cr>后 接受到'>'
uint Rec_status=0;           //switch 接收状态
unsigned int  num=0;                  //接受消息头+CMTI: ,"SM",1的计数;
uchar temp;                 //接收媒介;
void main (void) 
{

	ENA_WDT ();
	GSM_PORT_Init ();
	SYSCLK_Init ();
	CKCON_Init ();
	Uart0_Init ();
	Port_Init ();

	GSM_Init ();

//	tr_point = tr_buf;

//	TRANS_NEXT_BYTE_OK = 1;

	ES0 = 1;

	EA = 1;
   // loca[0]='1';
  //  loca[1]='9';
 //   test
  //  DEL_MS=1;
	IS_sending=0; 
	PC_using=0;
///	ALARM=1;
	while (1)
	{
      if(!PC_using)
      {
		if (TRANS_NEXT_BYTE_OK) transmitte ();
        
		if (SMS_EN) Read_sms();       //read a message 
        if (SMS_OK) Process_sms();
	//	if (CM_CMD) ;            //加主机调用函数;  
        if (DEL_MS) Del_sms();          //del a message
        if(! Recving_SMS&&ALARM)Send_sms();
      } 
	}
}

void GSM_Init (void)
{
	uchar data i;
	TMOD |= 0x01;				//定时器0为模式1,16位
	TC35_IGT = 0;
	delay_20ms ();
	TC35_IGT = 1;
	delay_20ms ();
	TC35_IGT = 0;
	for (i=0;i<6;i++) delay_20ms ();
	TC35_IGT = 1;
	TR0 = 0;
	while (!TC35_PD);
	while (TC35_PD);
	while (!TC35_PD);
}

void delay_20ms (void)
{
	TR0 = 0;
	TH0 = C_TMR0 >> 8;			//设置定时器0的初始值,
	TL0 = C_TMR0;	
	TR0 = 1;					//启动定时器0
	TF0 = 0;
	while (!TF0);
}

void SYSCLK_Init (void)
{
	OSCICN |= 0x07;				//24500000hz
}

void GSM_PORT_Init (void)
{
	XBR1 |= 0x80;				//关闭弱上拉 
}

void Port_Init (void)
{  
	XBR1 |= 0x40;				//使能交叉矩阵,弱上拉 
}

void ENA_WDT (void)
{
	PCA0MD &= ~0x40;
}

void CKCON_Init (void)
{   
	CKCON |= 0x02;				//定时器1和2的触发时钟为 sysclk/48
}

void Uart0_Init (void)
{
	SCON0 = 0x50;				//8位数据,允许接收
	XBR0 |= 0x01;				//uart的tx,rx分配至p0.4及p0.5 
	P0MDOUT |= 0x10;			//uart的tx为推挽输出 
	TMOD |= 0x20;				//定时器1为模式2,8位自动重装
	TH1 = C_TMR1;				//设置定时器1的重装值,
	TL1 = C_TMR1;
	TR1 = 1;					//启动定时器1
	ES0 = 1;					//允许UART中断
}

void Uart0_ISR (void) interrupt 4
{
	if (RI0)
	{
		RI0 = 0;
        switch(Rec_status)
        {
          case 0:
                 temp=SBUF0;
                 switch(num)
                 {
                   case 0:
                          if(temp=='+') 
                          {
                             ++num;
                             Recving_SMS=1;        //index receiving  a message
                          }else
                             num=0;
                          break;
                   case 1:
                          num=(temp=='C') ? ++num : 0;break;
                   case 2:
                          num=(temp=='M') ? ++num : 0;break;
                   case 3:
                          num=(temp=='T') ? ++num : 0;break;
                   case 4:
                          num=(temp=='I') ? ++num : 0;break;
                   case 5:
                          num=(temp==':') ? ++num : 0;break;
                   case 6:
                         if(temp==',') 
                              ++num ;
                         break;
                   case 7:
				          num++;
						  loca[8]=temp;
                          break;
				   case 8:
						  if(temp!=0x0d)
						  {
						      loca[9]=temp;
							  loca[10]='\r';
							  loca[11]='\0';
						  }
						  else
						  {
						      loca[9]='\r';
							  loca[10]='\0';
						  } 
  						  num++;
						  break;
				   case 9:
 				         if(temp==0x0a)
				             SMS_EN=1;          //标识有信息,通知接收
						 break;
				         
                 }  // the end of inner switch
			    break; 
		 case 1:  break;	
         case 2:
		        addbuffer();
				if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&& 
				    (*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
					(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
					(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
				 {
				     //SMS_EN=0;           //不再调用 Read_sms();
				     SMS_OK=1;
 					 Recving_SMS=0;
					 Rec_status=0;
                 }
		        break;
  	     case 3:
		        break;	
 	     case 4:
		        addbuffer();
      
			    if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&& 
				    (*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
					(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
					(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
				 {
				     Rec_status=0; 
                 }
		        break;	
   		case 5:
		        addbuffer();
				if((*(&rec_buf+(put_pt - &rec_buf + buf_len)%buf_len)=='\x20')&&(*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='>'))
				{
				    ALARM=1;
				    CSD=1;
                    Rec_status=0;
				}
		        break;
	    case 6:
		        addbuffer();
			    if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&& 
				    (*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
					(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
					(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
				 {
				     Rec_status=0; 
                 }
 		        break;				                                              
	   }          //  the end of outer switch
	}
	if (TI0)
	{
		TI0 = 0;
		TRANS_NEXT_BYTE_OK = 1;
	}
}
//read a message to buffer;
void Read_sms()
{  
   if(!IS_sending)
  {
   SMS_EN=0; 
   ini_buf();                //初始化buffer
  // SMS_EN=0;               // 在读完数据再 清零
   Rec_status=2;
   //loca[6]='R';
   tr_point=loca;
   TRANS_NEXT_BYTE_OK = 1;
  }	
}

void Process_sms()
{
   unsigned char rr;
   unsigned int i=0;
   SMS_OK=0;
   getbuffer();
   getbuffer();
   do
   {
      rr=getbuffer();
   }while(getbuffer()!='\x0a' || rr!='\x0d');                               
  
   for(i=0;i<6;i++)
   {
      if(getbuffer()!=privacy[i])
	     break;
   }
   if(i==6)
   {
      strcpy(content,"");          //清空
      i=0;
	  rr=getbuffer();
	  while(rr!=0x0d)
	  {
	     content[i++]=rr;
		 rr=getbuffer();
	  }
	  CM_CMD=1;
   }
   DEL_MS=1;
}
//delete a message 

void Del_sms(void)
{
   
   /*
   loca[8]='2';
   loca[9]='5';
   loca[10]='\r';
   loca[11]='\0';
   */
  if(!IS_sending)
  {
   DEL_MS=0;
   ini_buf();                //clear  buffer;
   Rec_status=4;
   loca[6]='D';
   tr_point=loca;
   TRANS_NEXT_BYTE_OK = 1;
  }	
}

void Send_sms()
{  
  
   if(!IS_sending)
   { 
       ini_buf();
       if(!CSD)
	   {
	    ALARM=0;
	    Rec_status=5;
       // tr_point="AT+CMGS=\"13488716723\"\r";
	    strcat(send_buff,pho);
		strcat(send_buff,"\"\r");
	    tr_point=send_buff;
 	    TRANS_NEXT_BYTE_OK = 1;
		}else
		{
		  CSD=0;
		  ALARM=0; //清零
	      Rec_status=6;
 		  ini_buf();
		  //tr_point="abcdefg\x1a";
		  strcat(alarms,"\x1a");
          tr_point=alarms;
		  TRANS_NEXT_BYTE_OK = 1;
		}
   }
   /*
   ALARM=0;
   tr_point="AT+CMGS=\"13488716723\"\rabcdefghijk\x1a\0";
   TRANS_NEXT_BYTE_OK = 1;
   */
}
//发送信息
void transmitte (void)
{   
    IS_sending=1;
	TRANS_NEXT_BYTE_OK = 0;	
	if (*tr_point != '\0')
	{
		SBUF0 = *tr_point;
		tr_point++;		
    }
    else
      IS_sending=0;
}

void ini_buf()
{
 get_pt=rec_buf;
 put_pt=rec_buf;
}

void addbuffer()
{
   put_pt++;
   put_pt=rec_buf+(put_pt-rec_buf)%buf_len;
   if(put_pt!=get_pt)
       *put_pt=SBUF0; 
   else
   {
     put_pt--;
	 put_pt=rec_buf + (put_pt + buf_len - rec_buf) % buf_len;
   }
}

uchar getbuffer()
{
  if(get_pt!=put_pt)
  {
     get_pt++;
	 get_pt=rec_buf + (get_pt - rec_buf) % buf_len;
	 return *get_pt;
  }
  else
  return '@';
} 

⌨️ 快捷键说明

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