一、前言
本項目利用51單片機和SIM800C GSM模塊實現短信發(fā)送功能。短信作為一種廣泛應用的通信方式,在許多領域具有重要的作用,如物聯網、安防系統(tǒng)、遠程監(jiān)控等。通過將51單片機與SIM800C GSM模塊相結合,可以實現在各種應用場景下的短信通信功能。
本項目的核心組件是51單片機,是一種低成本、低功耗的單片機,廣泛應用于嵌入式系統(tǒng)開發(fā)。利用51單片機的串口功能來控制SIM800C GSM模塊的通信。SIM800C是一款功能強大的GSM模塊,支持GSM/GPRS通信,具有發(fā)送和接收短信的能力。
在本項目中,搭建51單片機和SIM800C GSM模塊的硬件連接。使用C語言編寫程序,在51單片機上實現與SIM800C的通信控制。通過串口通信向SIM800C發(fā)送AT指令,實現短信的發(fā)送功能。
為了實現短信發(fā)送功能,需要熟悉SIM800C的AT指令集,了解如何設置短信參數、編寫短信內容并發(fā)送。還需要處理SIM800C返回的響應,以確保短信發(fā)送的成功與否。
二、SIM800C硬件介紹
SIM800C是一款功能強大、靈活可靠的GSM/GPRS模塊,廣泛應用于各種通信和控制場景,尤其在物聯網應用中能發(fā)揮重要作用。通過合理使用SIM800C的AT指令,可以輕松實現短信發(fā)送和收取等功能。
2.1 SIM800C的特點
【1】支持多種通信方式:SIM800C支持GSM、GPRS、SMS、MMS、TCP/IP等通信方式,可以實現語音通話、短信收發(fā)、數據傳輸等功能。
【2】大量接口:SIM800C提供了UART、SPI和I2C等接口,方便與其他設備進行通信和控制。
【3】低功耗設計:SIM800C具有低功耗模式,在待機時能夠極大地減少電力消耗。
【4】小巧的尺寸:SIM800C模塊體積小巧,便于嵌入各種設備中。
【5】豐富的工作溫度范圍:SIM800C適用于廣泛的工作溫度范圍,可在惡劣的環(huán)境條件下正常工作。
2.2 使用場景
SIM800C的使用場景廣泛,主要包括以下幾個方面:
【1】物聯網應用:SIM800C可以通過GPRS進行數據傳輸,用于物聯網設備的遠程監(jiān)控、遠程控制、數據采集和傳輸等。
【2】安防系統(tǒng):SIM800C可以用于報警系統(tǒng),通過短信或語音通知用戶有關安全事件的信息。
【3】遠程控制應用:通過SIM800C模塊,可以實現遠程控制設備,比如遠程開關、門禁系統(tǒng)等。
【4】移動支付終端:SIM800C可以與移動支付系統(tǒng)集成,實現移動支付終端的功能。
2.3 AT指令介紹
SIM800C使用AT指令進行通信和控制。
下面是一些常用的與短信相關的AT指令:
【1】AT+CMGF:設置短信模式,用于選擇短信的格式。例如,AT+CMGF=1表示以文本模式發(fā)送和接收短信。
【2】AT+CMGS:發(fā)送短信。需要指定接收方的電話號碼,并在輸入結束后按Ctrl+Z(ASCII碼為0x1A)表示短信內容輸入完成。例如,AT+CMGS="+123456789"表示發(fā)送短信給號碼+123456789。
【3】AT+CMGR:讀取短信??梢宰x取已存儲在模塊中的已接收短信,返回包括發(fā)送方號碼和短信內容在內的信息。
【4】AT+CMGD:刪除短信。用于刪除指定索引處的短信。例如,AT+CMGD=1表示刪除索引為1的短信。
【5】AT+CNMI:設置新短消息指示??梢耘渲媚K在接收到新短信時給出通知,以便及時處理。
三、代碼實現
3.1 STC89C52硬件配置
【1】串口:STC89C52共有兩個串口,分別是UART0和UART1??梢杂糜谂c其他設備進行異步串行通信。
【2】定時器:STC89C52共有三個定時器,分別是Timer0、Timer1和Timer2??梢杂糜诋a生定時中斷、計時等功能。
【3】GPIO:STC89C52具有32個I/O口,每個I/O口可以配置為輸入或輸出。其中,P0口(Port 0)和P2口(Port 2)上的引腳可以作為UART0的GPIO引腳使用,而P3口(Port 3)上的引腳可以作為UART1的GPIO引腳使用。
串口對應的GPIO口編號如下:
【A】UART0:
- TXD:對應P0.0口
- RXD:對應P0.1口
【B】UART1:
- TXD:對應P3.1口
- RXD:對應P3.0口
在STC89C52中,UART0的TXD引腳對應P0.0口,RXD引腳對應P0.1口;UART1的TXD引腳對應P3.1口,RXD引腳對應P3.0口。
3.2 短信發(fā)送代碼實現
#include <reg52.h>
// 定義SIM800C的串口引腳
sbit SIM_RX = P3^0; // SIM800C的串口接收引腳
sbit SIM_TX = P3^1; // SIM800C的串口發(fā)送引腳
// 定義波特率常量
#define BAUDRATE 9600
// 定義發(fā)送函數
void sendATCommand(char* command) {
// 發(fā)送AT指令
for (int i = 0; command[i] != '?'; i++) {
SBUF = command[i];
while (TI == 0); // 等待發(fā)送完成
TI = 0; // 清除發(fā)送完成標志
}
}
// 主函數
void main() {
// 初始化串口
TMOD = 0x20; // 設置定時器1為模式2
TH1 = 256 - BAUDRATE / 9600; // 設置波特率
TL1 = TH1;
TR1 = 1; // 啟動定時器1
SCON = 0x50; // 設置串口為模式1,允許接收
// 發(fā)送AT指令初始化SIM800C模塊
sendATCommand("ATrn"); // 發(fā)送AT指令,檢測模塊是否正常
sendATCommand("AT+CMGF=1rn"); // 設置短信模式為文本模式
sendATCommand("AT+CNMI=1,2,0,0,0rn"); // 設置接收新短信時的提示方式
// 發(fā)送短信
sendATCommand("AT+CMGS="+1234567890"rn"); // 設置短信接收號碼
sendATCommand("Hello, this is a test message.x1A"); // 發(fā)送短信內容,以Ctrl+Z作為結束符
while (1);
}
3.3 短信發(fā)送、電話撥打功能-封裝子函數
#include <reg51.h>
// 定義串口1的引腳連接
sbit UART1_TX = P3^1;
sbit UART1_RX = P3^0;
// 初始化串口1
void UART1_Init() {
TMOD |= 0x20; // 設置定時器1為模式2(8位自動重載)
SCON = 0x50; // 設置串口1為工作方式1,并允許接收
TH1 = 0xFD; // 設置波特率9600,對應12MHz晶振
TL1 = 0xFD;
TR1 = 1; // 啟動定時器1
}
// 發(fā)送一個字符到串口1
void UART1_SendChar(unsigned char c) {
SBUF = c;
while(!TI); // 等待發(fā)送完成
TI = 0; // 清除發(fā)送標志
}
// 發(fā)送字符串到串口1
void UART1_SendString(const unsigned char *str) {
while (*str) {
UART1_SendChar(*str++);
}
}
// 發(fā)送AT指令到SIM800C模塊
void SIM800C_SendATCommand(const unsigned char *atCmd) {
UART1_SendString(atCmd);
UART1_SendChar('r');
UART1_SendChar('n');
}
// 發(fā)送短信
void SIM800C_SendSMS(const unsigned char *phoneNumber, const unsigned char *message) {
SIM800C_SendATCommand("AT+CMGF=1"); // 設置為文本模式
// 等待回復
// ...
SIM800C_SendATCommand("AT+CMGS="");
UART1_SendString(phoneNumber); // 接收方手機號
UART1_SendChar('"');
UART1_SendChar('r');
UART1_SendString(message); // 短信內容
UART1_SendChar(0x1A); // 發(fā)送Ctrl+Z結束短信
}
// 撥打電話
void SIM800C_MakeCall(const unsigned char *phoneNumber) {
SIM800C_SendATCommand("ATD"); // 撥號命令
UART1_SendString(phoneNumber); // 目標手機號
UART1_SendChar(';'); // 發(fā)送分號以撥號
}
void main() {
UART1_Init(); // 初始化串口1
// 等待SIM800C模塊初始化完成
// ...
// 發(fā)送短信
SIM800C_SendSMS("手機號", "短信內容");
// 撥打電話
// SIM800C_MakeCall("目標手機號");
while(1);
}
代碼中需要將"手機號"和"目標手機號"填充為實際的電話號碼。