?? send.c
字號:
/*
;**************************************************************
;* 北京達盛科技有限公司
;* 研 發 部
;*
;* http://www.techshine.com
;*************************************************************/
/*----------------------- 文件信息 ----------------------------
;*
;* 文件名稱 : Send.C
;* 適用平臺 : DSP(ARM)CPU掛箱、接口掛箱(用三條扁平電纜連接);
;*(注意:DSP(ARM)CPU掛箱上CPU模塊上方的開關SW3有且只有最左側的一位在"ON"位置);
;* CPU類型 : DSP320VC5409
;* 軟件環境 : CCS2.20 (5000系列)
;* 擴展模塊 : E-LAB:GSM模塊(正確安裝在接口掛箱上)
;* 試驗接線 : 1、用短路帽短接GSM模塊上的片選CS50的CS0
;* 2、GSM模塊上的FLY8用跳線帽短接MCU端
;* 試驗現象 : 設置好CCS的環境,打開本工程,編譯、下載。
;* 在程序表示處設置斷點,運行程序到斷點觀察變量LCD變化。
;* 短信自收發時,發送短信正確時,LCD顯示為:
;* 第一行:發送:XXXXXXXXXXX(發送至手機號11位,在程序中可修改)
;* 第二行:信息:Welcome To Techshine(Welcome To Techshine為短信內容)
;* 第三行:(第二如顯示不完短信,則剩余部分在第三行顯示;如第二行顯示完,剛第四行內容,在第三行顯示。)
;* 第四行:返回:71 OK (71為返回短信條數)
;* 如發送失敗或發送錯誤,則在LCD從第一行最左起顯示M22返回的錯誤信息,如:Error。
;* 備注:
;* 編寫時間:2006、1、20
;* 審核時間:
*/
//------------------頭文件--------------------------------------
#include "System.h" //包括CPU寄存器的定義、編譯環境定義、試驗系統定義
//----------------------------------------------------------
//----------------------------------------------------------
#define SRTHR CS0 //接收、發送緩沖器
#define SIER port0801 //中斷允許寄存器
#define SLCR port0803 //線路控制寄存器
#define SRLSR port0805 //線路狀態寄存器
#define SLSB CS0 //波特率除數鎖存器低位
#define SMSB port0801 //波特率除數鎖存器高位
uchar sjhao[]="13146891434";//接收手機號為13146891434,可修改
uchar Msg[]=" Welcome to Techshine"; //短信內容可以修改
//-------------------------------------------------------------------
/*
************************************************************************
*********************** 函數定義 ******************
************************************************************************
*/
/*
*************************************************************************************************************
- 函數名稱 : Init_16c450(void)
- 函數說明 : 初始化16c450
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void Init_16c450(void){
uchar tempd;
SLCR = 0x80; //設置波特率控制位 使能
SLSB = 0x0C;
SMSB = 0x00; //設置波特率96000
SLCR = 0x03; //8個數據位,2個停止位,無奇偶校驗
SIER = 0x01; //允許接收器數據就緒中斷
tempd = SRLSR; //清除線路狀態寄存器
tempd = SRTHR; //清除16C450中的接收數據
}
/*
*************************************************************************************************************
- 函數名稱 : void RECV(void *prdata)
- 函數說明 : 接收數據,且有超時退出功能
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void RECV(uchar *prdata){
uint16 cnt=0x8ff;
while((SRLSR & 0x01)==0);//等待450接收緩沖器有數
goto rec;
while(1){
while((SRLSR & 0x01)==0){//等待450接收緩沖器有數,且有超時退出功能
cnt--;
if(cnt==0){
*prdata = 0x00; //接受完數據后使最后一個數為零。
goto back;
}
}
rec:
*prdata++ = SRTHR;
cnt = 0x8ff;
}
back: ;
/*__asm{
WAIT0:
ldrb r2,[0xac00805]
tst r2,#1
bne REC
b WAIT0
WAIT1:
mov r1,#0x4ff
WAIT:
ldrb r2,[0xac00805]
tst r2,#1
bne REC
sub r1,r1,#1
cmp r1,#0
bne WAIT
beq chu
REC:
ldrb r2,[0xac00800]
strb r2,[r0],#1
nop
nop
b WAIT1
chu:
} */
}
/*
*************************************************************************************************************
- 函數名稱 : void SEND(uchar udata)
- 函數說明 : 發送數據
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void SEND(uchar udata){
//dellay(50);
while((SRLSR & 0x20)==0); //等待450發送緩沖器空
SRTHR = udata;
}
/*
*************************************************************************************************************
- 函數名稱 : void ATT(void)
- 函數說明 : 發送ATT命令
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void ATT(void){
SEND('A');
SEND('T');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void ATE(void)
- 函數說明 : 發送ATT命令
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void ATE(void){
SEND('A');
SEND('T');
SEND('E');
SEND('0');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void CGMI(void)
- 函數說明 : 發送CGMI命令
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void CGMI(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('G');
SEND('M');
SEND('I');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void CGMR(void)
- 函數說明 : 發送CGMR命令
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void CGMM(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('G');
SEND('M');
SEND('M');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void CMGF1(void)
- 函數說明 : 設置GSM模塊短信格式為:1
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void CMGF1(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('M');
SEND('G');
SEND('F');
SEND('=');
SEND('1');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void CMGS(uchar *ptr)
- 函數說明 : 發送手機號;AT+CMGS="xxxxxxxxxxx(11位手機號)"<CR>
- 輸入參數 : 接收手機號碼
- 輸出參數 : 無
*************************************************************************************************************
*/
void CMGS(uchar *ptr){
uchar l=0, i1;
while ((ptr[l])!='\0')
{l++;} //統計數組字符數
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('M');
SEND('G');
SEND('S');
SEND('=');
SEND('"');
for (i1=0;i1<l;i1++)
SEND(ptr[i1]);//發送單個字符
SEND('"');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函數名稱 : void Send_Msg(unchar *pMsg)
- 函數說明 : 發送短信
- 輸入參數 : 短信內容
- 輸出參數 : 無
*************************************************************************************************************
*/
void Send_Msg(uchar *pMsg){
uchar l=0, i1;
while ((pMsg[l])!='\0')
{l++;}
for (i1=0;i1<l;i1++)
SEND(pMsg[i1]);//發送單個字符
SEND(26); //發送完畢結束符
}
/*
*************************************************************************************************************
- 函數名稱 : uchar Check(uchar *prdata)
- 函數說明 : 檢查回車換行次數,來確定是正確返回結果,還是錯誤結果
- 輸入參數 : 接收緩沖區
- 輸出參數 : 回車換行次數
*************************************************************************************************************
*/
uchar Check(uchar *prdata){
uchar i=0,ucnt=0;
while(prdata[i] != 0x00){
if(prdata[i] == 0x0d)
ucnt++;
i++;
}
return ucnt;
}
/*
*************************************************************************************************************
- 函數名稱 : void DispLcd(uchar *prdata)
- 函數說明 : 顯示出錯信息
- 輸入參數 : 接收緩沖區
- 輸出參數 : 無
*************************************************************************************************************
*/
void DispLcd(uchar *prdata){
uchar x,i=0;
uchar str1[] = "發到";
uchar str2[] = "信息";
uchar str3[] = "返回";
Display(str1, 0x80); //SEND:
Display(sjhao,0x82); //發送的手機號
Display(str2, 0x90); //MSG:
Display(Msg, 0x92); //顯示發送內容
Display(str3, 0x98); //Back
x=(0x0b-0x08)*2;
Send_cdata(0xf8,0x9b,1);// 定位顯示起始地址
while(prdata[i++] != ':'); //判斷':'分號,從分號后面顯示
while(prdata[i] != 0x00){
if((prdata[i] != 0x0d)&(prdata[i] != 0x0a)){
Send_cdata(0xfa,prdata[i],1);//輸出單個字符
x++;
if (x ==0x10){
x=0;
hang++;
switch (hang){
case 0:Send_cdata(0xf8,0x80,1);
break;
case 1:Send_cdata(0xf8,0x90,1);
break;
case 2:Send_cdata(0xf8,0x88,1);
break;
case 3:Send_cdata(0xf8,0x98,1);
}
if (hang>3){
Send_cdata(0xf8,0x80,1);
hang=0;
}
}
}
else
if(prdata[i] == 0x0a)
Send_cdata(0xfa,' ',1);//輸出單個字符 空格
i++;
}
}
/*
*************************************************************************************************************
- 函數名稱 : void DispErr(uchar *prdata)
- 函數說明 : 顯示出錯信息
- 輸入參數 : 接收緩沖區
- 輸出參數 : 無
*************************************************************************************************************
*/
void DispErr(uchar *prdata){
uchar i=0,x=0;
Send_cdata(0xf8,0x80,1); //把光標移到0點
while(prdata[i] != 0x00){
if((prdata[i] != 0x0d)&(prdata[i] != 0x0a)){
Send_cdata(0xfa,prdata[i],1);//輸出單個字符
x++;
if (x ==0x10){
x=0;
hang++;
switch (hang){
case 0:Send_cdata(0xf8,0x80,1);
break;
case 1:Send_cdata(0xf8,0x90,1);
break;
case 2:Send_cdata(0xf8,0x88,1);
break;
case 3:Send_cdata(0xf8,0x98,1);
}
if (hang>3){
Send_cdata(0xf8,0x80,1);
hang=0;
}
}
}
else
if(prdata[i] == 0x0a)
Send_cdata(0xfa,' ',1);//輸出單個字符 空格
i++;
}
}
/*
*************************************************************************************************************
- 函數名稱 : void CLEAR_STAT(void)
- 函數說明 : 清除線路狀態寄存器和接受緩沖器
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void CLEAR_STAT(void){
uchar utemp;
utemp = SRLSR; //清除線路狀態寄存器
utemp = SRTHR; //清除16C450中的接收數據
}
/*
************************************************************
****************** 主函數 *******************
************************************************************
*/
/*
*************************************************************************************************************
- 函數名稱 : Main(void)
- 函數說明 : 系統的主程序入口
- 輸入參數 : 無
- 輸出參數 : 無
*************************************************************************************************************
*/
void main()
{ uchar i,uhcnt;
uchar rdata[30];
//----------系統初始化-------------------------------
cpu_init(); //目標初始化
Init_16c450();
Lcd_Init();
dellay(10000);
dellay(10000);
ATT(); //測試
dellay(10000);
ATT(); //關閉回顯
dellay(10000);
ATE();
dellay(10000);
for(i=0;i<30;i++) //清除接收數據區
rdata[i] = 0;
CLEAR_STAT();
ATT();
RECV(rdata); //關閉回顯
for(i=0;i<30;i++) //清除接收數據區
rdata[i] = 0;
CMGF1(); //設置GSM模塊短信格式為:1
dellay(0xffff);
CMGS(sjhao); //發送手機號
dellay(0xffff);
CLEAR_STAT(); //清除450狀態
Send_Msg(Msg); //發送短信內容
RECV(rdata); //接收返回數據
uhcnt = Check(rdata); //統計結束緩沖區,在單元中內容為00的單元之前的回車數
if(uhcnt == 0x04)
DispLcd(rdata);
else
DispErr(rdata);
while(1){
dellay(100);
asm(" nop"); //設置斷點,觀察LCD顯示內容
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -