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