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

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;    //将接收到的字符串存到缓存中
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<Buf1_Max;k++)      //将缓存内容清零
{
Uart1_Buf[k] = 0x00;
}
First_Int = 0;              //接收字符串的起始存储位置
}
/******************************************************************************* * 函数名 : Find
* 描述  : 判断缓存中是否含有指定的字符串
* 输⼊  :
* 输出  :
* 返回  : unsigned char:1 到指定字符,0 未到指定字符
* 注意  :
*******************************************************************************/
u8 Find(u8 *a)
{
if(strstr(Uart1_Buf,a)!=NULL)
return 1;
else
return 0;
}
/******************************************************************************* * 函数名 : Second_AT_Command
* 描述  : 发送AT指令函数
* 输⼊  : 发送数据的指针、发送等待时间(单位:S)
* 输出  :
* 返回  :
* 注意  :
*******************************************************************************/
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
{
u8 i;
u8 *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();
}室内wifi定位
/*******************************************************************************
* 函数名 : Set_Text_Mode
* 描述  : 设置短信为TEXT⽂本模式
* 输⼊  :
* 输出  :
* 返回  :
* 注意  :
*******************************************************************************/
void Set_Text_Mode(void)
{
Second_AT_Command("AT","OK",3);
Second_AT_Command("AT&F","OK",3);
Second_AT_Command("AT+CMGF=1","OK",3);
Second_AT_Command("AT+CSMP=17,167,2,25","OK",3);
Second_AT_Command("AT+CSCS=\"UCS2\"","OK",3);
}
/*******************************************************************************
* 函数名 : Send_Text_Sms
* 描述  : 发送PDU⽂本短信
* 输⼊  :
* 输出  :
* 返回  :
* 注意  :
*******************************************************************************/
void Send_Text_Sms(u8 *tel,u8 *txt)
{
Second_AT_Command(tel,">",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<Buf1_Max;k++)
{
if(Uart1_Buf[k] == ':')
{
if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明⽹络注册成功    {
i = 1;
i = 1;
break;
}
}
}
}
}
#ifndef __UART_H__
#define __UART_H__
#include "config.h"
void Uart1Init(void);
void UART1_SendData(u8 dat);
void UART1_SendString(char *s);
//串⼝1发送回车换⾏
#define UART1_SendLR() UART1_SendData(0X0D);\            UART1_SendData(0X0A)
#endif
`#include "uart.h"
void Uart1Init(void)  //9600bps@11.0592MHz
{
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;      //开串⼝中断
}
/*----------------------------
UART1 发送串⼝数据
-----------------------------*/
void UART1_SendData(u8 dat)
{
ES=0;    //关串⼝中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0;    //清除发送中断标志
ES=1;    //开串⼝中断
}
/*----------------------------
UART1 发送字符串
-----------------------------*/
void UART1_SendString(char *s)
{
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符
亮晶晶眼贴}
}
#include "delay.h"
u8 count_20ms;
/
/ 函数: void  delay_ms
// 描述: 延时函数。建筑防水剂
// 参数: ms,要延时的ms数, 这⾥只⽀持20*256ms. void delay_ms(u8 ms)
{

本文发布于:2024-09-23 05:22:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/126293.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:发送   缓存   字符串
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议