51单片机控制SMI800Cgsm模块发送中文短信

使用AT89C51单片机控制SMI800Cgsm模块发送中文短信。使用STM32发送短信敬请等待。。。

#include "config.h"
#include "string.h"
#include "delay.h"
#include "uart.h"
#define Buf1_Max 200 					  //串口2缓存长度
xdata u8 Uart1_Buf[Buf1_Max];
u8 Times=0,First_Int = 0,shijian=0;
bdata u8 Flag;//定时器标志位
sbit Timer0_start =Flag^0;	//定时器0延时启动计数器
static u8 *telnum="AT+CMGS=\"00310035003300330035003900370037003300380036\"";//电话号码的Unicode转码,可修改
static u8 *text="4FE153D190016D4B8BD5";										  //短信内容,可修改

/*************	本地函数声明	**************/
void Timer0Init(void);  //定时器0初始化
void CLR_Buf1(void);    //清除串口2接收缓存
u8 Find(u8 *a);         //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time); //发送AT指令函数
void Set_Text_Mode(void);//设置短信模式PDU
void Wait_CREG(void);   //查询等待模块注册成功
void Send_Text_Sms(u8 *tel,u8 txt);//发送一条中文短信
/*************  外部函数和变量声明*****************/


/*******************************************************************************
* 函数名 : main 
* 描述   : 主函数
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 串口波特率是9600,GPRS模块默认波特率是115200,需要自己通过串口助手修改
				   为9600方可使用。 
*******************************************************************************/
void main(void)
{
	Timer0Init();  //初始化定时器0
	EA=1;	//开总中断
	Uart1Init();    //初始化串口9600
	Wait_CREG();    //查询等待模块注册成功
	Set_Text_Mode();//设置短信为PDU模式
	Send_Text_Sms(telnum,text);//发送一条短消息
	while(1)
	{
		;
	}
	
}

/*******************************************************************************
* 函数名 : Uart1 
* 描述   : 串口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;
			}
    }
    if (TI)
    {
        TI = 0;                 //清除TI位
    }
}
/*******************************************************************************
* 函数名 : Timer0_ISR
* 描述   : 定时器0中断服务入口函数,20ms中断一次
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
	static u8 Time_count=0;
  TL0 = 0x00;		  //重置定时器初值
	TH0 = 0xB8;		  //重置定时器初值	
	TR0=0;//关定时器
	Time_count++;
	if(Time_count>=50)
	{
		Time_count = 0;
	}
	if(count_20ms) //20ms延时计数器
		count_20ms--;
	if(Timer0_start)
	Times++;
	if(Times > (50*shijian))
	{
		Timer0_start = 0;
		Times = 0;
	}
	TR0=1;//开定时器
}
/*******************************************************************************
* 函数名 : Timer0Init
* 描述   : 定时器0初始化,20ms定时
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
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中断
}
/*******************************************************************************
* 函数名 : CLR_Buf1
* 描述   : 清除串口2缓存数据
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
void CLR_Buf1(void)
{
	u16 k;
	for(k=0;k",3); //发送电话号码
	UART1_SendString(txt);     //发送短信内容
	UART1_SendData(0X1A);          //发送结束符
}

/*******************************************************************************
* 函数名 : Wait_CREG
* 描述   : 等待模块注册成功
* 输入   : 
* 输出   : 
* 返回   : 
* 注意   : 
*******************************************************************************/
void Wait_CREG(void)
{
	u8 i;
	u8 k;
	i = 0;
	CLR_Buf1();
  while(i == 0)        			
	{
		CLR_Buf1();        
		UART1_SendString("AT+CREG?");//查询模块网络注册状态
		UART1_SendLR();
		delay_ms(250);  						
	    for(k=0;k

你可能感兴趣的:(51单片机控制SMI800Cgsm模块发送中文短信)