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

📄 tc35i.c

📁 使用STC89c58RD+系列单片机控制手机收发短信息的原理、硬件电路、PDU数据格式和短信息发送/接收程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************本程序仅限学习交流***************************
*********************引用请注明作者 axin***************************
*************************文件名shijian.c***************************
*Copyright(C)2008 biti
*功能描述:GSM模块,发送短信,接收短信,转发短信
*作    者:axin
*日    期:2008-4-20
*QQ:35714796
*网    站:
********************本程序仅限学习交流****************************
********************引用请注明作者 axin***************************
*****************************************************************/

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define ATwaits			10
#define DWWwaits		10
#define Readwaits		10
#define Sendwaits		10

#define PDUType_OffSet	19
#define DCS_OffSet		35
#define UDL_OffSet		51
#define UD_OffSet		53
#define NewIdex_OffSet	12

#define	SCX				1
#define WangYafei		2
#define YuanYudong		3
#define YangZhengang	4
#define XianGuanwen		5		 
#define RsBuf_N			400

xdata	char RsBuf[RsBuf_N];	//定义串口接收数据缓冲区
uint 	RsPoint		=0;			//RsBuf[]坐标
uchar	UDL			=2;
char	*P_UD		=NULL;
char	*P_UDL		=NULL;
char 	*ReturnCommandOffSet;
char 	Index_Tc35[4]={0,0,0,0};
//\n0891..换行符'\10''\0'
char code Ask_Tc35[]={0x0a,0x30,0x38,0x00};
//定义转发号码
char code DialNum[][13]={ 
			{"3118009151F5"},   //0,13810019155 WangYafei
			{"3118618791F1"},   //1,13811678191 SCX
			{"3118009151F5"},   //2,13810019155 WangYafei
			{"3118614942F1"},   //3,13811694241 YuanYudong
			{"3117571722F3"},   //4,13717571223 YangZhengang
			{"3124261983F4"},	//5,13426291384 XianGuanwen
			};
//声明函数原型
void ClrBuf(uchar *p,uint size);
void UART_init(void);
void SendASC(uchar ASC);
void SendToTc35(uchar* p,uint Long);
void SendString(uchar* p);
void Bell(void);
void Send_AT(void);
void SetPdu(void);
void NumIn(uchar i);

char EraseMsg(uchar index);
char *ReadMsg(uchar index);
char TransmitPDU(char *dialnum);
char ReciveNewStatusReport();
char ReciveNewMsg();
char *TransmitMsg(char *m);
char *mystrstr(char *s, char *t);


//模式设置初始化串口
void UART_init(void){
	//初始化串行口和波特率发生器
	SCON =0x58;         //选择串口工作方式,打开接收允许
	TMOD|=0x20;         //定时器1工作在方式2,
	TH1  =0xfd;          //实现波特率9600(系统时钟11.0592MHZ)
	TR1  =1;             //启动定时器T1
	//ET1=1;
	ES=1;               //允许串行口中断
	PS=1;               //设计串行口中断优先级
	EA =1;              //单片机中断允许              //单片机中断允许
	}


/*********************发送-个ASCII********************************
*功    能: 串口发送ASCII码
*形    参: ASC
*返 回 值:
*备    注: 
*****************************************************************/
void SendASC(uchar ASC){
	bit es;
	es=ES;
	ES=0;//关闭中断
	TI=0;
	SBUF=ASC;
	while(!TI);
	TI=0;
	ES=es;
	}


/**********************发送-个数组********************************
*功    能: 串口发送数组命令到TC35,为指定长度
*形    参: uchar* p,数组首地址;		uchar Long为数组长度
*返 回 值:
*备    注: 
*****************************************************************/
void SendToTc35(uchar* p,uint Long){
	while(Long--){
    	SendASC(*p++);
  		}
	}
/**********************发送-个字符串******************************
*功    能: 串口发送数组命令到TC35,未指定长度
*形    参: uchar* p,字符串首地址;
*返 回 值:
*备    注: 
*****************************************************************/
void SendString(uchar* p){
	while(*p){
    	SendASC(*p++);
  		}
	}

//察除缓冲区
void ClrBuf(uchar *p,uint size){
	uint i;
	for(i=0;i<size;i++)*p++=0;
	}


/***********************发送联机指令******************************
*功    能: 串口发送数组命令到TC35,"AT",
*形    参: 
*返 回 值:
*备    注: 测试GSM模块是否连接正确
*****************************************************************/
void Send_AT(void){
  uchar *p,i=ATwaits;
	while(i--){
    	SendString("AT\r");
		//****************************等待应答"OK"
    	ES=1;    //必须中断
    	delayms_100ms();
    	p=mystrstr(RsBuf,"OK");
    	if(p!=NULL) {
			zhushi lcd_disp_str("GSM module is OK",1);
			zhushi lcd_disp_str("Will contimue!  ",2);
			delayms_1000ms();delayms_1000ms();
			zhushi lcd_disp_str("                ",1);
			zhushi lcd_disp_str("                ",2);
			break;
			}
		zhushi lcd_disp_str("No GSM connected",1);delayms_1000ms();
		zhushi lcd_disp_str("                ",1);
		}
}


//删除短信息
char EraseMsg(uchar index)
{
 uchar i=10;
 char *p;
 	ES=1;
	SendString("AT+CMGD=");		//向tc35i发送删除指令"AT+CMGD="//
	if(index)NumIn(index);		//如果index不为0输入index,//
	else SendString(Index_Tc35);//否则输入Index_Tc35//
	SendASC('\r');				//向tc35i发送回车指令//
 	while(i--)
	{	//***等待应答"OK"***//
    	delayms_1000ms();
    	p=mystrstr(RsBuf,"OK");
    	if(p!=NULL)    {
			zhushi lcd_disp_str("EraseMsg finish!",1);
			delayms_1000ms();
			return 1;
			}
	}
	zhushi lcd_disp_str("EraseMsg ufinish",1);
	delayms_1000ms();
	return 0;
}


//将数字转换成字符输出
void NumIn(uchar i){
	//数字小于10
	if(i>=0&&i<=9){
		SendASC(i+48);
		}
	//数字小于100
	else if(i<=99){
		SendASC(i/10+48);
		SendASC(i%10+48);
		}
	//数字大于100
	else {
		SendASC(i/100+48);
		SendASC(i%100/10+48);
		SendASC(i%10+48);
		}
	}
//将信息索引转换成数字存入Index_Tc35
void GetNewIndex(void){
	if(*(ReturnCommandOffSet+NewIdex_OffSet)>=0x30&&*(ReturnCommandOffSet+NewIdex_OffSet)<=0x39)
		Index_Tc35[0]=*(ReturnCommandOffSet+NewIdex_OffSet);
	else Index_Tc35[0]=0;
	if(*(ReturnCommandOffSet+NewIdex_OffSet+1)>=0x30&&*(ReturnCommandOffSet+NewIdex_OffSet+1)<=0x39)
		Index_Tc35[1]=*(ReturnCommandOffSet+NewIdex_OffSet+1);
	else Index_Tc35[1]=0;
	Index_Tc35[2]=0;Index_Tc35[3]=0;
	}

/***********************定位自己**********************************
*功    能: 给服务台10658204发送请求信息,定位自己
*形    参: 
*返 回 值: 信息数据内容首地址,从UDL开始
*备    注: 1 发送成功  0 发送失败
*****************************************************************/
char RequestDWW()//发送定位命令
{ uchar i=DWWwaits;
  uchar j=Sendwaits;
  uchar *p;
	RsPoint=0;
	ClrBuf(RsBuf,8);
	ES=1;
	//发送信息,数据长度为15
	SendString("AT+CMGS=15\r");

	while(i--){
		delayms_1000ms();
		p=mystrstr(RsBuf,">");//////Get">"
		if(p!=NULL)
			{
			SendString("00310008A1015628400000A703C4EB15\x1a\r");
			//delayms_100ms();
			while(j--){
				//delayms_100ms();
				p=mystrstr(RsBuf,"OK");
				if(NULL!=p){
					//成功发送
					zhushi lcd_disp_str("Request finish! ",1);
					zhushi delayms_1000ms();
					//zhushi lcd_disp_str("                ",1);
					//RsPoint=0;
					//ClrBuf(RsBuf,8);
					return 1;
					}
				zhushi lcd_disp_str("wait send DWW...",1);
				zhushi delayms_1000ms();
				//zhushi lcd_disp_str("                ",1);
				}
		}
		zhushi lcd_disp_str("No   \">\"        ",1);
		zhushi delayms_1000ms();
		zhushi lcd_disp_str("              ",1);
	}
return 0;
}

/***********************读取信息**********************************

⌨️ 快捷键说明

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