89C52单片机控制TC35i模块短信收发问题解决

需积分: 7 0 下载量 69 浏览量 更新于2024-09-14 收藏 3KB TXT 举报
"M22模块在C51单片机控制下的短信收发与电话拨打" 在嵌入式系统中,使用单片机控制GSM模块进行短信收发和电话拨打是一项常见的任务。在这个场景中,用户正在尝试用89C52单片机控制M22模块(可能是GSM模块TC35i)来实现自动化操作。然而,用户遇到了问题,即程序可以拨打电话,但无法成功发送短信。以下是对这个系统和相关知识点的详细解释: 1. **C51编程**: C51是为8051系列单片机设计的一种高级语言,它基于标准C,并添加了一些针对8051硬件的特殊指令和函数。在提供的代码中,可以看到`#include<reg52.h>`和`#include<intrins.h>`,这些头文件包含了89C52单片机的寄存器定义和内联函数,使得可以直接操作硬件。 2. **GSM模块**: M22模块,可能是TC35i,是一款GSM/GPRS模块,用于实现无线通信功能,如短信收发和电话拨打。这些模块通常通过串行接口(如UART)与微控制器连接,进行AT命令通信。 3. **AT命令集**: AT命令是GSM模块的通用命令语言,用于设置模块参数、进行通信操作等。在代码中,可以看到一些预定义的字符串常量,如`AT+CMGS`用于短信发送,`ATD`用于拨打电话,这些都是AT命令的一部分。 4. **中断服务程序**: `void GSM_OK int() interrupt 4 using 1`是一个中断服务例程,当串行接口的接收中断RI被触发时,这个例程会处理接收到的数据。它将接收到的字符存储到数组`ok[]`中,并在接收到特定字符(如'00',可能表示GSM模块的确认响应)时清空数组。 5. **延迟函数**: 代码中包含两个延迟函数,`delay(uint ms)`和`delay_Xms(uint t)`,它们用于在执行过程中插入适当的时间延迟,确保命令的正确执行。 6. **串行通信**: 代码中的`Print_Char()`和`Print_Str()`函数用于向串行接口发送字符和字符串,这是与GSM模块交互的关键部分。`SBUF`是串行数据缓冲区的寄存器,`TI`是发送中断标志位。 7. **硬件控制**: 代码定义了多个sbit变量,如`D10LED`、`SW4`等,用于直接控制单片机的输入/输出引脚,这些引脚可以连接到LED、开关或其他硬件设备,以提供用户界面或状态指示。 8. **问题诊断**: 用户提到短信发送失败,这可能是由于多种原因,例如AT命令格式错误、波特率设置不正确、短信模式未正确设置(代码中的`AT+CMGF=0`是设置短信为PDU模式)、GSM模块与单片机的通信问题等。为了解决这个问题,需要检查AT命令的正确性,确保模块已正确初始化,同时检查串行通信的稳定性。 通过以上分析,我们可以看到一个典型的C51单片机控制GSM模块的系统架构,以及在实际应用中可能出现的问题和调试方法。要使短信发送功能正常工作,需要对硬件连接、串行通信、AT命令的使用等方面进行细致的检查和调试。