?? 串口短信c51代碼示例.txt
字號(hào):
/*
//*********************************************************
//程序: 串口通信示例程序
//編制: 蘇建陽 2008-3-9
//*********************************************************
說明:
本文是單片機(jī)通過串口與Modem等外部設(shè)備通信的示例,
因?yàn)椴煌膯纹瑱C(jī)和開發(fā)環(huán)境會(huì)有差異,要按照實(shí)際硬件進(jìn)行修改。
中斷方式工作邏輯:
建立自己的發(fā)送、接收緩存存儲(chǔ)區(qū)gcRx0Buf,gcTx0Buf及其指針*gpRx0、*gpTx0
配置端口和UART波特率,設(shè)置串口接收發(fā)送中斷、總中斷。
發(fā)送開始向發(fā)送存儲(chǔ)區(qū)gcTx0Buf寫字符串,軟件置TI觸發(fā)串口中斷(否則不會(huì)進(jìn)入中斷,需要定時(shí)查詢)。
發(fā)送中斷里將下一個(gè)字符送發(fā)送端口,直到發(fā)送結(jié)束
接收到字符放入接收字符串等待處理(51較慢注意接收時(shí)不要占用太多時(shí)間)
等待超過一定時(shí)間沒有新數(shù)據(jù)就結(jié)束(可以進(jìn)行數(shù)據(jù)處理了,但是不要在中斷里做太多事)
//********************************************************
*/
//#include <MCS51.h>
#include<reg52.h>
unsigned char xdata gcRx0Buf[128]; //串口0接收緩存
unsigned char data *gpRx0 = gcRx0Buf; //接收緩存指針
unsigned char xdata gcTx0Buf[128]; //串口0發(fā)送緩存
unsigned char xdata *gpTx0 = gcTx0Buf; //發(fā)送緩存指針
unsigned char data gcRx0Busy; //接收忙
unsigned char data gcTx0Busy; //發(fā)送忙
/************************************************************
程序: CpuSet
功能: 設(shè)置CPU、端口、UART波特率和中斷
參數(shù): 無
返回:
描述:
修改:
************************************************************/
void CpuSet()
{//按照自己的CPU設(shè)置端口和UART波特率和中斷
/*
//8052
TR1=1;
SM0=0;
SM1=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=1;
REN=1;
PCON=0x80;
*/
//--------------中斷設(shè)置-----------------
/*
8051 中斷優(yōu)先級(jí)寄存器IP。 其操作控制為標(biāo)準(zhǔn)8051 方式,
中斷入口地址仍然如下:
0 INT0 :0003H 外部中斷
1 T0 :000BH 定時(shí)/計(jì)數(shù)器T0 溢出中斷
2 INT1 :0013H 外部中斷INT 1
3 T1 :001BH 定時(shí)/計(jì)數(shù)器T1 溢出中斷
4 UART:0023H 串行口中斷UART
*/
EA = 1; //開放中斷,IE 的EA 位,總中斷允許設(shè)置
}
/************************************************************
程序: Uart0Int (串口0中斷)
功能: 接收中斷的數(shù)據(jù)緩存到gcRx0Buf,發(fā)送中斷將gcTx0Buf數(shù)據(jù)到串口
參數(shù): 無
返回:
描述: 程序分兩部分,1接收,2發(fā)送.
修改:
************************************************************/
void Uart0Int(void) interrupt 4 //中斷的寫法要按照開發(fā)軟件要求寫
{ char C;
if (RI) //接收有數(shù)據(jù)
{ C = SBUF; //讀取緩存到變量備用(有些CPU讀后將清除緩存)
RI = 0; //接收中斷標(biāo)志清零
if (C > 0) //判斷接收的數(shù)據(jù)是否有效(不要直接讀取CPU的緩存)
{ *gpRx0 = C; //保存到接收緩存串
gpRx0 ++; //準(zhǔn)備接收下一個(gè)數(shù)據(jù)
*gpRx0 = 0; //結(jié)尾
gcRx0Busy = 127; //置超時(shí)處理標(biāo)志,超時(shí)將認(rèn)為接收結(jié)束
}
}
if (TI) //發(fā)送中斷
{ TI = 0; //發(fā)送中斷標(biāo)志清零
if (*gpTx0 > 0) //判斷發(fā)送結(jié)尾
{ SBUF = *gpTx0; //取一個(gè)字符發(fā)送寫到端口
gcTx0Busy = 255; //置超時(shí)處理標(biāo)志,超時(shí)將認(rèn)為發(fā)送失敗結(jié)束
gpTx0 ++; //指向下一個(gè)空位
}
else
{ gpTx0 = gcTx0Buf; //指針到串頭
*gpTx0 = 0; //標(biāo)記成空串
}
}
}
/************************************************************
程序: Main
功能: 主程序
參數(shù): 無
返回:
描述:
修改:
************************************************************/
void Main()
{ int iDelay = 0;
CpuSet(); //設(shè)置工作環(huán)境
//逐步發(fā)送下面的AT命令,注意模塊休眠后第一個(gè)命令不會(huì)正常應(yīng)答要發(fā)2遍
strcpy(gcTx0Buf,"AT+CMGF=1\r\n"); //準(zhǔn)備要發(fā)送的數(shù)據(jù)
//strcpy(gcTx0Buf,"AT$NOSLEEP=1\r\n");//M22,M23,M23G用
//strcpy(gcTx0Buf,"AT+CSCS=\"GSM\"\r\n"); //GSM通信
//strcpy(gcTx0Buf,"AT+CSMP=17,168,0,0\r\n"); //通信參數(shù)
//strcpy(gcTx0Buf,"AT+CNMI=2,2\r\n"); //可選來信提示方式
//strcpy(gcTx0Buf,"AT+CSMP=AT+CSQ\r\n");//測(cè)試天線信號(hào)強(qiáng)度
//strcpy(gcTx0Buf,"AT+CMGR=1\r\n"); //讀取第1單元數(shù)據(jù)
//strcpy(gcTx0Buf,"AT+CMGD=1\r\n"); //刪除第1單元數(shù)據(jù)
//strcpy(gcTx0Buf,"AT+CMGS=\"+8613658150338\r\n"); //發(fā)送短信,等待返回"> "
//strcpy(gcTx0Buf,"This Try"); //刪除第1單元數(shù)據(jù)
//strcpy(gcTx0Buf,"\0x1A"); //信息結(jié)尾
ES = 1; //串口中斷使能
whule(1)
{
if(!gcTx0Busy) //發(fā)送空閑
{ if(*gpTx0) //有要發(fā)送的數(shù)據(jù)沒有發(fā)完
{ TI = 1; //軟件置中斷標(biāo)志啟動(dòng)發(fā)送中斷過程
}
}
else
{ gcTx0Busy --; //監(jiān)督發(fā)送狀態(tài)
}
if(gcRxBusy) //監(jiān)督接收完成狀態(tài)
{ if(gcRxBusy == 1)
{ //處理接收的數(shù)據(jù),比如收到"OK"
}
gcRxBusy --; //接收處理結(jié)束
}
while(iDelay ++); //進(jìn)行其它工作或等待
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -