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

📄 51

📁 51单片机典型模块开发
💻
📖 第 1 页 / 共 3 页
字号:
	for(i=0;i<12;i++)
	{
		if(Send_AT_Command(CHECK_PIN))			//如有收到回应进行分析收到的信息,//检查当前是否要输入PIN码	 
		{ 
			uart_buff[receive_count]=0;      	//receive_count接收 数组指针
			if(strsearch("READY")!=0)
			{
				chping=1;     					//准备好
				break;
			}
		}
		timer_S_cnt=0;							//秒计数变量清零
	}
	if(i>=11)
	{
		chping=0;								//准备标志位清0
	at_eer: 
		Send_AT_Command(RESET_TC35);			//复位TC35
		timer_S_cnt=0;							//秒计数变量清零
		Send_AT_Command(SMSS_ID);				//TC35i模块专用设置
	}
  	Send_AT_Command(SIM_ID);					//读出SIM卡设置
  	Send_AT_Command(AT_IPR);					//设置TC35的波特率
  	Send_AT_Command(REQUEST_MOD);				//请求模式
    timer_S_cnt=0; 								//秒计数变量清零
}

void  Sys_Init(void)							//话机启动的初始化程序,包含定时器,串口等
{
	TI=0;										//清串行接收发送中断标志位
	RI=0;		
	TH0 = 0xB8; 								//20ms的时钟基准
	TL0 = 0x00;
	TH1=0xfd;              						//波特率为9600
	TL1=0xfd;
	TMOD=0x21;									//定时器0 模式1  定时器1 模式2
	SCON=0x50;        							//串口通信选用方式1	 允许接收
	PCON=0x00;            						//不倍频,倍频0x80
	IE = 0x92;  								// EA XX ET2 ES ET1 EX1 ET0 EX0  1001 0010
	IP=0x02;  									//定时器0优先级高
	TR1=1;  									//使能定时器1
	TR0=1;  									//使能定时器0
	timer_20ms_cnt=0;							//20ms计数变量清0   0~49 
	receive_count=0;							//接收数组指针清0
	send_count=0xff;							//发送数组指针,表示禁止发送,可以接收			
}

void start(void)								//指示灯指示
{     
	uchar k;
	if(chinit==1&&chping==1)					//准备好  初始化完成
		LED=0;  								//初始化成功 LED亮 
	else										//初始化失败LED闪烁4次
	{ 
		for(k=0;k<4;k++)
		{
			LED=0;  
			delay1ms(1000);
			LED=1;
			delay1ms(1000);
		}
	}
} 


void delay1ms(uchar x)							//延时约1ms程序
{			   
	uchar  Time,Time1;
	for(Time=0;Time<x;Time++)
		for(Time1=0;Time1<120;Time1++); 
}
/*********************************************************************
 *                  C51中字符串函数的扩充                            *
 *********************************************************************/
uchar strsearch(uchar *ptr2)					//查字符串*ptr2在*ptr1中的位置

//本函数是用来检查字符串*ptr2是否完全包含在*ptr1中
//返回:  0  没有找到
//1-255 从第N个字符开始相同
{  
	uchar i,j,k;       							//i源地址,j小的地址 k中间变量
	if(ptr2[0]==0)        						//空 不需比较 返回
		return(0);
	for(i=0,j=0;i<MAX_TM-2;i++)       			//MAX_TM为号码存储器
	{
		if(uart_buff[i]==ptr2[j])				//第一个字符相同
		{						
			for(k=i;k<MAX_TM-2;k++,j++)
			{
				if(ptr2[j]==0)					//遇到空格 比较正确
					return(i+1);               	//返回值是整数,不含0 从第i+1个字符开始相同
				if(uart_buff[k]!=ptr2[j])       //后面的字符不相等 退出内层循环 再往后查找
					break;
			}
			j=0;       							//指向第1个字符
		}
	}
	return(0);									//没有找到返回:0  
}

void  Int_Timer0(void) interrupt 1 using 3		//定时器0 中断服务程序
{
	TH0 = 0xB8;
	TL0 = 0x00; 								//20ms的时钟基准
	timer_20ms_cnt++;  							//20ms计数变量加1  0~49  
	if(timer_20ms_cnt==50)						//20ms计数变量  0~49
	{    
		timer_20ms_cnt=0;						//20ms计数变量  0~49
		timer_S_cnt++;							//秒计数变量 1个数1s
	}                           
}
/*****************************************************************************
 *                   TC35 的命令列表,与中断服务程序                          *
 *****************************************************************************/
void  Int_Uart(void) interrupt 4 using 3		//串口的中断程序
{  
	uchar F=0; 									//F 存对方号码数组指针
	if(TI)										//如果为发送中断
	{											//数据模式与命令方式共用		
		TI=0;									//清发送中断标志位
		if(send_count>=MAX_TM-5)  				//发送数组指针>5		
			send_count=0;						//发送数组指针清零,不再超过最大值 		
		if((uart_buff[send_count]==0))			//空		
		{ 										//应该检测命令结束代码,检测到时结束通信
			at_send_bit=1;						//发送完成标志 接收允许
			send_count=0xff;					//发送指针 达到是大值 		
			for(F=0;F<20;F++)     				//数组指针
			{
				uart_buff[F]=0;					//清除接收缓冲区
			}
			receive_count=0;					//接收数组指针清零
			return;
		}
		else
		{   
			if(uart_buff[send_count]<=0xB0)  	//发送数组指针		
				SBUF=uart_buff[send_count++];	
			if((uart_buff[send_count]==0))
			{  									//应该检测命令结束代码,检测到时结束通信
				at_send_bit=1;					//发送完成标志1 接收允许
				send_count=0xff;				//发送数组指针为0xff		
				for(F=0;F<20;F++)
				{		
					uart_buff[F]=0;				//清除接收缓冲区
				}		
			receive_count=0;   					//接收 数组指针清零
			return;
			}
		}
		receive_count=0;						//接收 数组指针清零
	}
	if(RI)										//接收中断	
	{ //命令方式
		RI=0;									//清接收中断标志位
		if(at_send_bit==0)     					//如果在发送时,不能接收
			return;
		if((send_count==0xff)&&(receive_count<MAX_TM-5))//发送数组指针	 接收数据指针	
		{//没有发送时才能进行接收 所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
			uart_buff[receive_count++]=SBUF;
		}
		else
		{//ACC=SBUF;
			return;
		}
		if(receive_count>=MAX_TM-5)				//接收 数组指针
		{  
			if(AT_Command_Type==SMS_CMGR)    	//读一个短信
			receive_count=0;					//接收数组指针清零
			else if(AT_Command_Type==SMONC_ID)	//当前发送的命令类型
			{   	
				AT_Command_Status=COMMAND_OK;	//命令发送正确.
				return;  
			}
			else
			{	
				receive_count=0;				//接收 数组指针清零
				AT_Command_Status=COMMAND_OK;	//命令发送正确.
				return;
			}
			receive_count=0;					//接收 数组指针清零
		}
		if((receive_count==2)&&(uart_buff[1]==0x0d))//没有包含为其他信息的命令返回
		{	//接收到一个命令回应,可能为,0-OK  1-CONNECT 2-RING 3-NO CARRIER 4-ERROR
       			//只返回OK
			uart_buff[receive_count]=0;
			if(uart_buff[0]=='0')
			{
				AT_Command_Status=COMMAND_OK;  //命令发送正确.
				//txd_rxd_bit=1;
			}
			if(uart_buff[0]=='2')				//电话呼入 
			{    
				AT_Command_Status=COMMAND_OK;  //命令发送正确.
				//txd_rxd_bit=1;
				ES=1;							//串口中断使能
				receive_count=0;				//接收 数组指针清0
				send_count=0xff;				//发送数组指针  不允许发送		
			}
			else if(uart_buff[0]=='4'||uart_buff[0]=='3')//错误指令和 无法接通
			{  
				AT_Command_Status=COMMAND_ERROR;//命令发送错误
			}
			else AT_Command_Status=COMMAND_UNKNOW;//不可识别的返回类型
			txd_rxd_bit=1;						//接收正确的指令标志
			uart_buff[receive_count]=0;
			return;
		}
		else if((uart_buff[receive_count-1]==0x0d)
   			  &&(receive_count>=3)
   			  &&(uart_buff[receive_count-3]==0x0a)
   		      &&((uart_buff[receive_count-2]=='0')))
			{  ///可能是包含为其他信息的命令返回
				uart_buff[receive_count]=0;			//RECEIV OK ANSWER, with some message
				AT_Command_Status=COMMAND_OK;     	//命令发送正确.
				txd_rxd_bit=1;						//接收正确的指令标志
			}
		else if(((AT_Command_Type==SMS_CMGS)||(AT_Command_Type==AT_COMMAND))&&(uart_buff[2]=='>'))
		{	//SMS 短信发送或AT 命令  第二个地址数据位>
			AT_Command_Status=COMMAND_OK;   	//命令发送正确. 
			txd_rxd_bit=1;						//接收正确的指令标志
			return;
		}
	}
}
//======================================================================
//========================进行SIM卡中的1到20条短信号码的读==============================================
//======================================================================
/* uchar READ_TEL(uchar r)							//进行SIM卡中的1到20条短信号码的读
{                								//读短信号码1-20个
    uchar i;
	para_temp[0]=(r/10)+0x30;					//第几条短信的十位
	para_temp[1]=(r%10)+0x30;					//第几条短信的个位 
	para_temp[2]=0x0d;							//回车
	for(i=3;i<=11;i++) 							//3~10为空
		para_temp[i]=0x00;
	Send_AT_Command(SMS_CMGR);					//读一个短信
	timer_S_cnt=0;								//秒计数变量清0
	send_count=0;								//发送数组指针清0		
	if(strsearch("CMGR: 0,,0"))					//+CMGR: 0,,0  没有短信返回
	{     	
		ES=1;									//串口中断使能									
		receive_count=0;						//接收 数组指针清0
		send_count=0xff;						//发送数组指针为0xff 不能发送
		RI=0 ;									//接收标志位清零
		return(FALSE);							//返回 FALSE 0
	}
	else if(uart_buff[1]==0x0d&&uart_buff[0]==0x34)//号码保存 回车???
	{           
		return(FALSE);							//返回 FALSE	0
	}
	else
	{  
		if(AT_Command_Status==COMMAND_ERROR)	//命令发送错误
			return(FALSE);						//返回 FALSE	0
		else 
			return(TRUE);						//返回 TRUE 1
	}
}
 */
//============================================
//==========       读写短信程序
//====================================================
/* void read_sms(void)								//读写短信程序
{    
	uchar  i,r,j,t;
	for(r=1;r<20;r++)							//读第1~19个短信
	{
		num_tmp1=r;								//读短信号码参数
		if(READ_TEL(r)!=1)						//读第r个短信  at+cmgr=1~19  读指令
		{    
			if(strsearch("+CMTI:"))     		//是否有新短信
				return;
			continue;
		}//TEL_temp[18]  读出对方号码
		t=2; 
		i=0;
		for(j=15;j<25;j++)
		{
			if((uart_buff[j]==0x22)&&(uart_buff[j+1]==',')&&(uart_buff[j+2]==0x22))  // "," 
				break;
		}
		j=j+3;
		if(uart_buff[j]=='+') 
			j=j+3;
		for(;j<40;j++)
		{   
			if(uart_buff[j]==0x22)   			// "
				break;
			para_temp[t++]=uart_buff[j];		//读取号码
			TEL_temp[i++]=uart_buff[j];			//暂存在对方号码区域
		}
		TEL_temp[i++]=0x0d ;					//换行 空格
		TEL_temp[i++]=0x00 ;
		para_temp[t++]=0x0d;					//换行 空2格
		para_temp[t++]=0x00;
		para_temp[t++]=0x00;

		//---------------手机号码设置-------------
		if((i=strsearch("CHN")))
		{  
			system_server=SYS_ALARM;   			//处于报警时间设置系统状态
			return;
		}	  
		else if((i=strsearch("RED")))
		{  
			system_server=SYS_NUMSAVE;  		//系统状态 号码保存 
			return;
		}
		else if((i=strsearch("GRE")))
		{  
			system_server=SYS_FEE;				//系统状态
			return;
		}
		else
		{
			para_temp[0]=(num_tmp1/10)+0x30;	//暂存的第几条短信号十位 ///num_tmp1读短信号码参数
			para_temp[1]=(num_tmp1%10)+0x30;	//暂存的第几条短信号个位 
			para_temp[2]=0x0d;					//回车
			para_temp[3]=0x00;					//空格
			Send_AT_Command(SMS_CMGD);   		//删除没有用的短信 
			timer_S_cnt=0; 						//秒计数变量清0
			for(i=10;i<=MAX_TM-3;i++)
			{    
				uart_buff[i]=0;					//清零
			}
			Send_AT_Command(SIM_ID);			//合体组合  ATE0 ATV0 AT+CMGF=1 AT+CNMI=2,1
			return;
		}
	}
} */

⌨️ 快捷键说明

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