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

📄 gsb._c

📁 单片机控制GSM22来工作
💻 _C
字号:
//包含所需头文件
#include <ioM16v.h>
#include <macros.h>


/*------宏定义------*/




#include "12864.h"
#define Rcv_cap 100        //缓冲内容不能超过200个,搜索时不会先前搜

const uchar L[4] = {0x80,0x90,0x88,0x98};
uchar Rcv[Rcv_cap+1] = "ab";      //若缓冲足够变大,要改动程序
//const uchar AT[] = "AT\r";
//const uchar Settxt[] = "AT+CMGF=1\r";
uchar Sendtxt[] = "AT+CMGS=\"15986929180\"\r";
uchar Content[] = "How are you?\x1a";
uchar Phone[20] = "";         //11+4+4+1
uchar CPBW[35] = "AT+CPBW=1,\"";
uchar i_Rcv = 0;
uchar flagend = 0;
uchar key;
uchar pbefore = 0;
uchar pnext;
 uchar Stc1[] = "GSM 发信息中....";
 uchar Stc2[] = "电话簿:";
 uchar Stc3[] = "1.发送短信";
 uchar Stc4[] = "2.打电话";

 
 
//端口初始化
void port_init(void)
{
 PORTA = 0x0f;
 DDRA  = 0x0f;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00;
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}
/* 
//串口通信初始化
void usart_init(void)//9600
{
 UCSRB = 0x00;//禁止中断
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x33;
 UBRRH = 0x00;
 UCSRB = 0x98;
}*/
 
//串口通信初始化
void usart_init(void)
{
 UCSRB = 0x00;//禁止中断
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x03;
 UBRRH = 0x00;
 UCSRB = 0x98;
}
void init_devices(void)
{
 CLI(); //禁止所有中断
 //cpu_init(); 
  //delay_nms(200); 
 //lcm_init(); 
 port_init();
 lcd12864_init(); 
 usart_init();
 SEI();//开全局中断
}

//串行接收结束中断服务程序
#pragma interrupt_handler usart_rx_isr:12
void usart_rx_isr(void)  
{ 
	uchar temp;
	temp = UDR;
   if(i_Rcv>(Rcv_cap-1))
   {
    i_Rcv=0;   
   }
   if((temp!=0x0d)&&(temp!=0x0a)) //
   {
    flagend = i_Rcv;
	Rcv[i_Rcv] = temp;
	i_Rcv++;
   }
   //flagend = i_Rcv;
}


uchar ISok(uchar *msure)
{
 
 if((flagend-1)>flagend)
 {
  if((Rcv[flagend]==msure[1])&&(Rcv[Rcv_cap-1]==msure[0])) //大写
   return 1;
  else
   return 0;
 }
 else if((Rcv[flagend]==msure[1])&&(Rcv[flagend-1]==msure[0]))
  return 1;
 else
  return 0;
}

void USART_Transmit( unsigned char *T)
{ 

  uchar i = 0;
  while(T[i])           //length--,循环length次
  {
   while ( !( UCSRA & (1<<UDRE)) )
   ;
   UDR = T[i];
   i++;
  }
  
}

void sendcmd(uchar *command,uchar *msure,uint t)    //可以改进,用do while()
{static i=0;//用于观察发送AT指今的情况
 while(!ISok(msure))
 {    
	  i++;
	  display_Num(1,0,i,3);
  USART_Transmit(command);
  delay_nms(t);
 }
 i=0;
 //display(1,Rcv,0);
}


void clearf(void)         //为下一次写指令做准备
{
 uchar i;
 i = flagend - 1;
 if(i<flagend)
 {
  flagend = i;
 }
 else
  flagend = Rcv_cap-1;
}

void read(uchar *porm ,uchar *num)  //CMGR,CPBR,num有7个字符
{
 uchar C[] = "AT+C   =       \r";     //等号后7个空
 uchar i;
 i_Rcv = 0;
 C[4] = porm[0];
 C[5] = porm[1];
 C[6] = porm[2];
 for(i=0;i<7;i++)
 {
  C[8+i] = num[i];
 }

 sendcmd(C,"OK",3000);
 clearf();
}
//发信息
void sendsms(void)
{
 uchar C[] = "AT+CMGS=\"           \"\r";     //等号后7个空
 uchar i;
 i_Rcv = 0;
 for(i=0;i<11;i++)
 {
  C[9+i] = Phone[i];
 }
 sendcmd(C,"\x3e\x20",500);
 clearf();
 sendcmd(Content,"OK",5000);
 clearf();
}

void call(void)
{
 uchar C[] = "ATD           \x3b\r";     //等号后7个空
 uchar i;
 i_Rcv = 0;
 for(i=0;i<11;i++)
 {
  C[3+i] = Phone[i];
 }
 sendcmd(C,"OK",2000);
 clearf();
}  

void find1(uchar pos)  //AT+CPBR=1,2+CPBR: 1,"6651177",129,"HOME"+CPBR: 2,"13760029591",129,"LI"
{                         
 uchar i = 0;
 //pos +=4;
 while(Rcv[pos++]!=0x22);
 while(Rcv[pos]!=0x22)
 {
  Phone[i++] = Rcv[pos];
  pos++;
 }
}

/*
void rtelbook(void)
{
 uchar num[] = "0000001";
 clearline(1);
 display_String(0,0,Stc2);
 while(key!=15)
 {
  
  if((key==13)&&(num[6]>'1'))
  {
   num[6]--;
  }
  else if((key==14)&&(num[6]<'9'))
  {
   num[6]++;
  }
  if(key!=30)
  {
   read("PBR",num);
   find1(0);
   
   display(1,0,Phone,0);
   
  }
  key = key_scan();
  if(key==10)
  {
   clearline(0);
   clearline(1);
   display_String(0,0,Stc3);
   display_String(1,0,Stc4);
   while(key!=15)
   {
    key = key_scan();
	if(key==1)
	{
	 sendsms();
	}
	else if(key==2)
	{
	 call();
	}
   }
  }
 }
 clearline(0);
 clearline(1);
}
*/
void clearline(uchar i)
{
 ;
}

//主函数
void main(void)
{init_devices();
 /*uint i=5,j=65530;
 
display_Num(0,0,1-2,5);*/
 sendcmd("ATE0\r","OK",500);
 clearf();
 sendcmd("AT+CMGF=1\r","OK",500);
 clearf();
  display_String(0,0,Stc1);
 while(1) 
 	{sendsms();
	delay_nms(10000);
	 //key = key_scan();
	 
    /* if(key==10)
	 {
      rtelbook();
	 }*/
	
    } 
                 
} 

⌨️ 快捷键说明

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