【串口通信】待完善

/******************************
工程名  :短信控制LED
1 先用USB转TTL模块测试模块好用,并修改波特率到9600(AT+IPR=9600)再用单片机调试
2 51单片机晶振 11.0592MHz,12M不可以用  
3 如果模块无开机自启动电路,需要先按接线图中说明进行开机
手机发送“onled”点亮LED;
手机发送“offled”熄灭LED;
*******************************/

#include "string.h"
#include	"reg51.h"
#define Buf1_Max 200 					       //串口1缓存长度
sfr AUXR = 0X8E;
xdata unsigned char Uart1_Buf[Buf1_Max];
unsigned char Times=0,First_Int = 0,shijian=0;
bdata unsigned char Flag;            //定时器标志位
sbit Timer0_start =Flag^0;	         //定时器0延时启动计数器
sbit RUNING_LED = P1^2;					     //运行指示灯
sbit LED  			= P1^3;					     //控制指示灯
unsigned char count_20ms;

void UART1_SendData(unsigned char dat){
	ES=0;					
	SBUF=dat;			
	while(TI!=1);	
	TI=0;					
	ES=1;					
}


void UART1_SendString(char *s){ 
	while(*s)
		UART1_SendData(*s++);
}
void UART1_SendLR(void) {
	UART1_SendString("\r\n");
}

void DELAY_MS (unsigned int a){
    unsigned int i;
    while ( --a != 0 )    {
        for (i=0;i<=600;i++);
    }
}


void Uart1Init(void)		//[email protected]
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		  //设定定时初值
	TH1 = 0xFD;		  //设定定时器重装值
	ET1 = 0;		    //禁止定时器1中断
	TR1 = 1;		    //启动定时器1
  ES=1;					  //开串口中断
}

void Uart1() interrupt 4{
    if (RI)    {
      RI = 0;                           //清除RI位
			Uart1_Buf[First_Int] = SBUF;  	  //将接收到的字符串存到缓存中
			First_Int++;                			//缓存指针向后移动
			if(First_Int > Buf1_Max)      		//如果缓存满,将缓存指针指向缓存的首地址
				First_Int = 0;
    }

}

void Timer0_ISR() interrupt 1{
	static unsigned char Time_count=0; 
	TR0=0;                     //关定时器
	TL0 = 0x00;		             //重设定时器初值
	TH0 = 0xB8;		             //重设定时器初值
	Time_count++;             
	if(Time_count>=50)	{
		Time_count = 0;
		RUNING_LED =!RUNING_LED;
	}
	if(count_20ms) count_20ms--;            //20ms延时计数器
	if(Timer0_start) Times++;
	if(Times > (50*shijian))	{
		Timer0_start = 0;
		Times = 0;
	}
	TR0=1;                     //开定时器
}

void Timer0Init(void)	{	//20毫秒@11.0592MHz
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//
	TMOD |= 0x01;		//设置定时器模式,16位定时器
	TL0 = 0x00;		  //设置定时器初值
	TH0 = 0xB8;		  //设置定时器初值
	TF0 = 0;		    //清TF0标志
	TR0 = 1;		    //定时器0开始计时
	ET0 = 1;    	  //使能定时器0中断
	EA=1;	          //开总中断
}

void CLR_Buf1(void){
	unsigned int k;
	for(k=0;k<Buf1_Max;k++)     //将缓存内容清零
	Uart1_Buf[k] = 0x00;
	First_Int = 0;              //接收字符串的起始存储位置
}

unsigned char Find(unsigned char *a)   {             //查找字符串
  if(strstr(Uart1_Buf,a)!=NULL)
	    return 1;
	else
			return 0;
}

void Second_AT_Command(unsigned char *b,unsigned char *a,unsigned char wait_time)         
{
	unsigned char i;
	unsigned char *c;
	c = b;										//保存字符串地址到c
	CLR_Buf1(); 
  i = 0;
	while(i == 0) {
		if(!Find(a))  {          //查找需要应答的字符
			if(Timer0_start == 0)		{
				b = c;							//将字符串地址给b
				for (b; *b!='\0';b++)	
				UART1_SendData(*b);
				UART1_SendLR();	
				Times = 0;
				shijian = wait_time;
				Timer0_start = 1;
		   }
    }
 	  else	{
			i = 1;
			Timer0_start = 0;
		}
	}
	CLR_Buf1(); 
}
void Set_Text_Mode(void) { //设置短信为TEXT文本模式
	Second_AT_Command("ATE0","OK",3);										  //取消回显	
	Second_AT_Command("AT+CNMI=3,2,0,0,0","OK",3);				//新短信直接输出
	Second_AT_Command("AT+CMGF=1","OK",3);								//TEXT模式	
	Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);	//所有操作都在SIM卡中进行	
}


void Check_New_Message(void)   { //检查是否有新信息,并执行信息内容指令
	unsigned char temp=0;
	if(strstr(Uart1_Buf,"AA")!=NULL)  { 		//若缓存字符串中含有"+CMT"就表示有新的短信
		DELAY_MS(300);//等待数据全部接收完成
		if(strstr(Uart1_Buf,"BB")!=NULL)	{
			LED =!LED;
		}
		if(strstr(Uart1_Buf,"offled")!=NULL)
		{
			LED = ~LED;
		}
		CLR_Buf1();
		//Second_AT_Command("AT+CMGD=1,4","OK",3);//删除短信
	}
}


void Wait_CREG(void) { //等待模块注册成功
	unsigned char i;
	unsigned char k;
	i = 0;
	CLR_Buf1();
  while(i == 0)        			
	{
		CLR_Buf1();      
		UART1_SendString("AT+CREG?");  //查询模块网络注册状态
		UART1_SendLR();
		DELAY_MS(1000);  					
		for(k=0;k<Buf1_Max;k++) {
		if(Uart1_Buf[k] == ':')  {
			if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')){  //表明网络注册成功
				i = 1;LED=!LED;
				break;
			}
		}
	 }
  }
}

void main(void){
	Timer0Init();  //初始化定时器0
	Uart1Init();    //初始化串口9600
	Wait_CREG();    //查询等待模块注册成功
	Set_Text_Mode();//设置短信为TEXT模式
  Second_AT_Command("AT+CMGD=1,4","OK",3);//删除卡上所有短信
	while(1)	{ 
		Check_New_Message();
	}
}



//9600波特率
//AT+CREG?
//AT+CREG?
//AT+CREG?  --> :11111111
//ATE0
//ATE0
//ATE0     --> OK
//AT+CNMI=3,2,0,0,0    --> OK
//AT+CMGF=1        --> OK
//AT+CPMS="SM","SM","SM"     --> OK
//AT+CMGD=1,4     --> OK
//--> AABB 
//--> AABB
//--> AABB


本文出自 “魂斗罗” 博客,谢绝转载!

你可能感兴趣的:(郁闷【串口通信】)