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

📄 gsm主控板.c

📁 单片机控制GSM模块实现短信收发。系统采用西门子解析模块TC35I与单片机通信
💻 C
字号:
#include<reg52.h>
//#include<stdio.h>
#include<string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit bCancel=P1^0;	//取消
sbit bCall=P1^1;	//拨号/接听
sbit bLed=P1^2;		//LED指示
sbit bPro=P1^3;		//编程指示
sbit bStart=P3^4;   //启动GSM
sbit bMusic=P3^5;	//提示音控制
sbit bScl=P3^6;  	//24c08 SCL
sbit bSda=P3^7;  	//24c08 SDA
sbit tmp=ACC^0;		// 
//uchar idata RsBuf[10];
//uchar idata RsPoint=0;
//uchar code AT_Tc35[]="AT+";     //连机
//uchar code Text_Tc35[]="CMGF=1";  //文本模式
//uchar code Read_Tc35[]="CMGR=";   //读信息
//uchar code Erase_Tc35[]="CMGD=";  //删除信息
//uchar code Send_Tc35[]="CMGS=";   //发送信息
//uchar code OVER[]=0x1a;//成组发送结束
//uchar code YinHao[]=22;
//uchar code AT_Code[]="OK";
//uchar code SK[]=">";
//uchar code Ask_No[]="+CMGR: 0,,0";
//uchar code ERROR[]="ERROR";
//uchar code Ask_Tc35[]="/";
//uchar code Creg_Tc35[]="CREG?";        //注册
bit startflag=0,flag1=0,flag2=0,flag3=0,buttonflag=0;
bit rwFlag=0,rFlag=0,wFlag,smsFlag=0;
uchar input=0x0f,output=0x0f;
uchar temp;
uchar bufP0=0,bufP1H=0,buf=0;//保存数据
uchar idata pdu2[]="5BA2538567094EBA975E6CD58FDB5165";
				  //12345678901234567890123456789012 
uchar idata pdu3[]="003053F7673A51FA73B04EE559160021";
uchar idata smsCenter_pdu[]="3108701905F0";
uchar idata Phone_pdu[]="3178603180F4";
uchar idata Phone[]="13870613084;\r";
//uchar smsAddr,smsAddress;
uchar idata rsBuf[]="abcdef";
uchar  sbuf,rsPoint;
uint time=0;
uchar idata rIndex=0,wIndex=0;
/******************** Function DefInition 函数定义 *************************/
//AT24C08读写
void delay1(uchar x)
{
   uint i;
   for(i=0;i<x;i++);
}
void Nops()
{
   uchar u=4;
   while(u--);
}
void I2C_Init()
{
   bScl=1; 
   Nops(); 
   bSda=1;
   Nops();
}
void I2C_Start()
{
   bSda=1;
   Nops(); 
   bScl=1;
   Nops();
   bSda=0;
   Nops(); 
   bScl=0; 
   Nops();
}
void I2C_Stop()
{
   bSda=0; 
   Nops();
   bScl=1; 
   Nops(); 
   bSda=1; 
   Nops();
}
void Writex(uchar j)
{
   uchar i,temp;
   temp=j;
   for (i=0;i<8;i++)
   {
      temp=temp<<1; 
	  bScl=0; 
	  Nops(); 
	  bSda=CY; 
	  Nops();
	  bScl=1; 
	  Nops();
   }
   bScl=0; 
   Nops();
   bSda=1;
   Nops();
}
uchar Readx()
{
	uchar i,j,k=0;
	bScl=0; 
	Nops(); 
	bSda=1;
	for (i=0;i<8;i++)
	{
	   	Nops(); 
		bScl=1;
	   	Nops();
	    if (bSda==1) j=1;
	    else j=0;
	    k=(k<<1)|j; 
		bScl=0;
	}
	Nops();
    return(k);
}
void ACK()
{
   uchar i=0;
   bScl=1;
   Nops();
   while ((bSda==1)&&(i<255))i++;
   bScl=0; 
   Nops();
}
uchar I2C_ReadOneByte(uchar addr,uchar address)
{
  	uchar i;
   	I2C_Start();
	Writex(addr-1);
   	ACK(); 
	Writex(address);
   	ACK(); 
	I2C_Start();
   	Writex(addr);
	ACK();
   	i=Readx(); 
	I2C_Stop();
   	delay1(10);
   	return(i);
}
void  I2C_ReadNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
	uchar i;
   	I2C_Start();
	Writex(addr-1);
   	ACK(); 
	Writex(address);
   	ACK(); 
	I2C_Start();
   	Writex(addr);
	ACK();
	*buf=Readx();
	buf++;
	I2C_Stop();
   	for(i=1;i<num;i++)
	{
		I2C_Start();
		Writex(addr);
		ACK();
		*buf=Readx();
		buf++;
		I2C_Stop(); //主应答<ack=1>
	}
   	delay1(10);
}

/*void I2C_WriteOneByte(uchar addr,uchar address,uchar info)
{
   EA=0;
   I2C_Start();
   Writex(addr);
   ACK();
   Writex(address);
   ACK(); 
   Writex(info);
   ACK(); 
   I2C_Stop();
   EA=1;
   delay1(50);
}*/
//连续写
//num不大于16
void I2C_WriteNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
	uchar i;
   	EA=0;
   	I2C_Start();
   	Writex(addr);
   	ACK();
   	Writex(address);
   	ACK(); 
   	for(i=0;i<num;i++)
	{
		Writex(*buf); //发送数据*buf
		buf++;
		ACK();
	}
   I2C_Stop();
   EA=1;
   delay1(50);
}
/****************************************************************************/
void SyStem_Init()
{
	uchar i;
	I2C_Init();
	//加载短消息和对方号码
	for(i=0;i<12;i++)
	{
		smsCenter_pdu[i]=I2C_ReadOneByte(0xa3,64+i);
	}for(i=0;i<12;i++)
	{
		Phone_pdu[i]=I2C_ReadOneByte(0xa3,76+i);
	}
	for(i=0;i<11;i++)
	{	
		Phone[i]=I2C_ReadOneByte(0xa3,107+i);
	}

	input=I2C_ReadOneByte(0xa3,118);//加载默认输入值
	output=I2C_ReadOneByte(0xa3,119);//加载默认输出值

}
/****************************************************************************/
//延迟函数
void Delay(uchar n)
{
	uchar i=204;
	while(n--)
	{
		while(i--);
	}
}
/****************************************************************************/
//启动GSM模块即使GSM的IGT保持100ms以上的低电平
void Start_GSM()
{
	bStart=0;
	Delay(120);
	bStart=1;
}
/****************************************************************************/
//发送一个ASCII
void SendASC(uchar ASC)
{
	bit es;
	es=ES;//
	ES=0;//关闭串行中断
	TI=0;
	SBUF=ASC;
	while(!TI);
	TI=0;
	ES=es;
}
/****************************************************************************/
//发送AT命令到TC35I
void SendCmdToTc35i(uchar *p)
{
	uchar len;
	len=strlen(p);
	while(len--)
	{
		SendASC(*p++);
	}
}

/****************************************************************************/
//向电脑发送34个字节的字符串
//连机时使用
Send_TO_PC(uchar i)
{
	uchar j;
	if(i<8)
	{
		I2C_ReadNByte(0xa1,i*32,rsBuf+1,32);
	}
	if(i>=8)
	{
		I2C_ReadNByte(0xa3,(i-8)*32,rsBuf+1,32);		
	}
	for(j=0;j<33;j++)
	{
		SBUF=rsBuf[j];
		while(!TI);
		TI=0;
		Nops();
	}
}	
/****************************************************************************/
//将
//连机时使用
Write_To_2408(uchar i)
{
	if(i<8)
 	{
		I2C_WriteNByte(0xa0,i*32,rsBuf+1,16);
		I2C_WriteNByte(0xa0,i*32+16,rsBuf+17,16);
	}
	if(i>=8)
 	{
		I2C_WriteNByte(0xa2,(i-8)*32,rsBuf+1,16);
		I2C_WriteNByte(0xa2,(i-8)*32+16,rsBuf+17,16);
	}
}
/****************************************************************************/
//删除接收缓冲区RsBuf内的信息
/*void ClrStr(uchar *p)
{
	uchar len,i;
	len=strlen(p);
  	for(i=0;i<len;i++)
 	{              
	 	*p++=0;  
    }
}
/****************************************************************************/
//删除sim卡内短信息
/*void  EraseMsg(uchar index)
{
    SendCmdToTc35i("AT+CMGD=");
    SendASC(index);//指出第几个
    SendASC(0x0d);
    ES=1;
}
/****************************************************************************/
//读取短信息

/*uchar ReadMsg(uchar index)
{
    uchar *p,i;
    uchar Buf[40];  
   	SendCmdToTc35i("AT+CMGF=1\r");
	Delay(10);
   	SendCmdToTc35i("AT+CMGR="); 
    SendASC(index);//指出第几个
    SendASC(0x0d);
    ES=1;            //必须中断
    Delay(200);
	//-----------------------------
    p=strstr(rsBuf,"ERROR");
    if (p !=NULL) return 0;
   //-----------------------------
    p=strstr(rsBuf,"+CMGR:0,,0");//无信息
    if (p !=NULL) return 0;
    //--------------------------
    p=strstr(rsBuf,"/");//20个字节后是MSG
    if (p ==NULL) return 0;
    //---------------------------------------
    p=p+21;
    //-----------------------------------
    for (i=0;i<strlen(Buf);i++)
    {
        Buf[i]=*p++;
    }
    //-----------------------------------
  	p=strcpy(rsBuf,Buf);    //放回RsBuf
    return 1;
}
/****************************************************************************/
//发送短消息
void Send_SMS(uchar *p)
{

	uchar tmp=0;
	ES=0;
	SendCmdToTc35i("AT+CMGF=0\r");
	Delay(50);
	SendCmdToTc35i("AT+CMGS=38\r");
	TH0=0x4C;
	TL0=0;
	time=0;
	TR0=1;
	while(1)
	{
		tmp=SBUF;
		RI=0;
		if(tmp==0x3e||tmp==0x41)
			break;
		if(time>100)
		{
			time=0;
			TR0=0;
			break;
		}
	}
	SendCmdToTc35i("089168");
	SendCmdToTc35i(smsCenter_pdu);
	SendCmdToTc35i("11000B81");
	SendCmdToTc35i(Phone_pdu);
	SendCmdToTc35i("0008A7188BF76CE8610FFF1A");
	SendCmdToTc35i(p);
	SendASC(0X1A);
}
/****************************************************************************/
//读取P1口的低四位
//将P1口的低四位存入buf
void ReadP1(void)
{
	uchar t;
	t=P1;
	t=t&0xF0;
	t=_cror_(t,4);
	buf=t;
}
/****************************************************************************/
//串口初始化
//89C51在11.0592MHz下以9600Bs的波特率工作*/
void uart_init(void) 
{
	SCON=0x50;		//SM1=1,REN=1.UART工作于模式1,并允许接收
	TMOD=0x21;		//TIMER1工作于模式2,TIMER0工作于模式1,
	PCON&=0x7f;		//SMOD=0;
	TH1=0xFD;		//9600bs
	TR1=1;			//开定时器1
}
/****************************************************************************/
//LED闪烁
void Led_SS(uchar n)
{
	n=n*2;
	while(n--)
	{
		bLed=!bLed;
		Delay(100);
   	}
}
/****************************************************************************/
void Music(uchar n)
{
	bMusic=0;
	while(n--)
	{	
		Delay(64);//Delay(64);
	}
	bMusic=1;
}
/****************************************************************************/
//外部中断0处理函数
void Intr0_int(void) interrupt 0 
{
	uchar i,n=0;
	EX0=0;
	Delay(10);
	ReadP1();
	if(buf==4)
	{
		Music(4);
		startflag=1;
		flag2=0;
		flag3=0;
		bufP1H=0;	
	}
	else if(buf==2)
	{
		Music(1);
		startflag=0;
		flag2=0;
		flag3=0;
		bufP1H=0;	
	}
	else
	{
		if(buf==bufP1H)
		{
			flag2=0;
		}
		else
		{
			flag2=1;
			bufP1H=buf;
		}
		if(flag2)
		{
			switch (buf)
			{
				case 3:{n=0;	break;}
				case 5:{n=1;	break;}
				case 7:{n=2;	break;}	
				case 9:	{n=3;	break;}	
				case 10:{n=4;	break;}	
				case 11:{n=5;	break;}
				case 12:{n=6;	break;}	
				case 13:{n=7;	break;}	
				case 14:{n=8;	break;}
				case 15:{n=9;	break;}
				default:{n=9; 	break;}
		   }
			if(n<8)
			{
				for(i=0;i<32;i++)
				{
					pdu2[i]=I2C_ReadOneByte(0xa1,n*32+i);	
				}
			}
			else
			{
				for(i=0;i<32;i++)
				{
					pdu2[i]=I2C_ReadOneByte(0xa3,(n-8)*32+i);	
				}
			}
			flag3=1;
			flag2=0;
		}		
		
	}
	EX0=1;
}
/****************************************************************************/
void T0_intsvr(void)  interrupt 1
{
	TH0=0x4C;		//Timer0产生50ms的中断
	TL0=0;
	time++;
}
/****************************************************************************/
void serial_int()interrupt 4
{
	if(RI)
	{
		sbuf=SBUF;
		RI=0;
		if(bPro)
		{
        /*	rsBuf[rsPoint++]=sbuf;    
        	if (rsPoint >100) 
        	{		
            	rsPoint=0;
        	}    //数据处理*/
			
		}
		else
		{
			if(rwFlag)
			{
				if(rFlag)//读标志
				{
					if(sbuf<15)
					{	
						rIndex=sbuf;
						rsBuf[0]=sbuf;
						Send_TO_PC(rIndex);
					}
					rFlag=0;
					rwFlag=0;
				}
				if(wFlag)//写标志
				{
					rsBuf[rsPoint++]=sbuf;
					if(rsPoint>33)
					{	
						wIndex=rsBuf[0];
						if(wIndex<15)
						{
							Write_To_2408(wIndex);//	Write_To_2408(rsBuf[0]-0x30);
							SBUF=wIndex;
							while(!TI);
							TI=0;
							rsPoint=0;
							rwFlag=0;
							wFlag=0;
						}
					}
				}
			}
			else
			{
				if(sbuf==0xAA)
				{
					rwFlag=1;
					wFlag=1;
					rsPoint=0;
					I2C_ReadNByte(0xa1,0,rsBuf,1);
				}
				if(sbuf==0xBB)
				{
					rwFlag=1;
					rFlag=1;
				}
			}
		}
	
	}
	if(TI)
	{
		TI=0;
	}
}
	
void main(void)
{
  
	uchar i;//*p;
	P2=0x00;
	EA=0;
	bMusic=1;
	startflag=0;
	Led_SS(5);
	Start_GSM();//启动GSM模块
	uart_init();
	SyStem_Init();
	P2=output;
	ES=1;
	EX0=1;
	EX1=1;
	TI=1;
	Delay(200);
	Delay(200);
	//Send_AT();//发送AT连机命令

	SendCmdToTc35i("ATE\n");
	EA=1;
	Music(2);
//	EraseMsg(1);
	while(1)
	{
		EX0=1;
		temp=P0;
		if(startflag)//
		{
			if(flag3)
			{
				Music(2);
				Send_SMS(pdu2);
				Music(2);
				flag2=0;
				flag3=0;
			}
			if(temp!=input)
			{
				temp=temp^input;
				if(temp==bufP0)
				{
					flag1=0;
				}
				else
				{
					flag1=1;
					bufP0=temp;
				}
				if(flag1)
				{
					Music(2);
					for(i=0;i<8;i++)
					{
						ACC=temp;
						if(tmp)
						{
							pdu3[3]=i+0x31;
						}
						temp=_cror_(temp,1);
					}
					Send_SMS(pdu3);
					Music(3);
				}
			}
		}
		if(!bCancel)
		{
			Delay(50);
			if(!bCancel)
			{
				SendCmdToTc35i("ATH\r");
				Delay(200);
			}
		}
		if(!bCall)
		{
			Delay(50);
			if(!bCall)
			{
				SendCmdToTc35i("ATD");
				SendCmdToTc35i(Phone);
				Delay(200);
			}
		}
	/*	if(smsFlag)
		{
			ReadMsg(1);
		}
		if(rsPoint>7)
		{
			p=strstr(rsBuf,"RING");
			if(p!=NULL)
			{	
				ClrStr(rsBuf);
				rsPoint=0;
				bLed=0;
			}
			p=strstr(rsBuf,"NO CARRIER");
			if(p!=NULL)
			{	
				ClrStr(rsBuf);
				rsPoint=0;
				bLed=1;
			}
			p=strstr(rsBuf,"+CMTI:");
			if(p!=NULL)
			{	
				ClrStr(rsBuf);
				rsPoint=0;
				bLed=1;
			}*/
		//}
	}
}

⌨️ 快捷键说明

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