找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5396|回復: 1
收起左側(cè)

單片機控制sim900短信收發(fā)課程設(shè)計報告

[復制鏈接]
ID:418561 發(fā)表于 2018-10-31 15:35 | 顯示全部樓層 |閱讀模式
摘要
隨著手機的廣泛使用,GSM網(wǎng)絡(luò)提供的短消息服務(wù)使得只需要增加少量投入便可以通過手機實現(xiàn)生活和生產(chǎn)中的遠程控制和告警通知成為可能。
本設(shè)計是基于32位LPC2138的一種短信收發(fā)系統(tǒng)。本系統(tǒng)主要實現(xiàn)英文短信收發(fā)。此方案以LPC2138為主控制器輔以GSM/GPRS模塊SIM900A,液晶屏1602等硬件,通過C語言編寫程序,用軟硬件結(jié)合的方法實現(xiàn)編輯三條短信,按一次鍵,發(fā)送一條短信,且顯示在LCD上,發(fā)送后收到反饋,且有收信息功能,收到短信后顯示在LCD上。

目錄
一、原理與總體方案              3
⒈總體方案              3
二、軟件與硬件設(shè)計              3
⒈元器件               3
2.模塊的介紹和功能              4
三、仿真與調(diào)試              6
⒈ 仿真              6
2. 調(diào)試              7
四、遇到的問題              9

五、心得體會              9
附錄 程序代碼

一、     原理與總體方案
根據(jù)任務(wù)要求,設(shè)計一個按鍵按第一次就發(fā)送第一條編寫好的短信,按第二次則發(fā)送第二條編寫好的短信,按第三次就發(fā)送第三條短信,且顯示在LCD上,發(fā)送后收到反饋,且有收信息功能,收到短信后顯示在LCD上。即用LPC2138通過串口發(fā)出AT指令給SIM900a,使之發(fā)送短信給程序中設(shè)置好的電話,當用手機回復短信時,SIM900a收到短信內(nèi)容且反饋給LPC2138,LCD上顯示其回復內(nèi)容。



二、軟件與硬件設(shè)計
⒈元器件 如表1:

器件

數(shù)量

Lpc2138

1

LCD1602

1

SIM900a

1

電纜線

1

USB電源線

1

電源

若干

導線

若干


                                 表1
  • 各模塊的介紹和功能
①Lpc2138特性和引腳功能:Philips公式的32位ARM7微控制器lpc2138具有強大的儲存空間,內(nèi)嵌有32KB片內(nèi)靜態(tài)ARM和512KB的Flash存儲器,可以實現(xiàn)在系統(tǒng)可編程(ISP),在應(yīng)用可編程(IAP);2個8路10位A/D轉(zhuǎn)換器,1個D/A轉(zhuǎn)換器,轉(zhuǎn)換迅速準確;引腳資源豐富,多達47個可承受5V的通用I/O口;多個串行接口,包括2個16C550工業(yè)標準的UART,2個高速12C借口,SPI,以及具有緩沖作用和數(shù)據(jù)長度可變功能的SSP協(xié)議,lpc2138可以移植u C/COII操偶做系統(tǒng),軟件的可移植性好,工作可靠。(如圖2)
                               圖2
管腳說明:V3、VBAT、VREP、供電電壓
VSS、VSSA、接地
p0.0,p0.1作為串口通信接口
p1.16-p1.26作為LCD顯示電路接口
p0.9作為按鍵接口

串口初始化:波特率設(shè)置為9600bps,8位數(shù)據(jù)位,一位停止位,無奇偶校驗位,無硬件流控制,用于與上位機通信。串口2波特率為115200bps,8位數(shù)據(jù)位,一位停止位,無奇偶校驗位,無硬件流控制,用于與GSM模塊通信。


②LCD的特性說明:

  LCD 顯示屏(圖3)可以采用字符顯示,當使用字符顯示方式時可以直接用外碼作為輸入數(shù)據(jù),由顯示屏自動給出顯示字模數(shù)據(jù)而無需由微處理器提供字模。


圖3

③SIM900a通信模塊
SIM900a工作的頻段為:EGSM900MHz和DCS 1800MHz。具有以下優(yōu)點:鍵盤和SPI顯示接口可以讓使用者很靈活地設(shè)計定制應(yīng)用;主串口和調(diào)試串口可以幫助用戶輕松地進行開發(fā)應(yīng)用;一路音頻接口,包含一個麥克風輸入和一個揚聲器輸出;可編程的通用輸入/輸出接口( GPIO)。
SIM900a內(nèi)嵌TCP/IP協(xié)議,擴展的TCP/IP AT命令讓使用者能夠很容易使用TCP/IP協(xié)議,這些在使用者做數(shù)據(jù)傳輸方面的應(yīng)用時非常有用。
SIM900a的主要特性(如圖4)
                        圖4 SIM900a主要特性
SIM900A模塊初始化之前,先給模塊上電,由于SIM900A模塊在啟動注冊時,電流峰值會達到2A@4V,所以模塊是由12V 1A電源適配器供電的,避免由于模塊功耗的突升,造成的死機或啟動不起來。上電后,長按啟動按鍵,實現(xiàn)模塊的開機。在模塊開機后,模塊上的指示燈,先是快閃,如果手機注冊成功后,指示燈會慢閃。如果長時間快閃沒有變成慢,應(yīng)長按啟動鍵會關(guān)機模塊,檢查天線, SIM卡片的固定情況,還有檢查SIM卡片是否能正常使用。當模塊指示燈變?yōu)槁W時證明網(wǎng)絡(luò)注冊成功可以使用了。SIM900A實物如圖,在與單片機通信之前,我們可以通過電腦串口與SIM900A模塊通信調(diào)試,來檢測模塊是否能正常工作。
                         圖5 SIM900a實物
對外接口包括:RS232接口,語音接口,控制線接口、SIM卡接口等。
三、仿真與調(diào)試
1.仿真

Proteus實時仿真(如圖5-圖8)
圖5                               圖6
            圖7                             圖8
2.調(diào)試
   實物圖圖9
                           圖9 發(fā)短信
                             圖10 發(fā)短信
                           圖11 收短信
                      圖12 手機短信的接收與發(fā)送
四、遇到的問題
在仿真的時候,老師說可以用虛擬串口與SIM900a連接來仿真,但是我們弄了很久都不行,指令并沒有從LPC2138發(fā)出去,最后就不了了之了,我們直接去進行了硬件的連接。一開始我們是準備用LPC2138板子上的RS232與SIM900a上的RS232電平接口相接來傳遞指令,之后才發(fā)現(xiàn)完全不對,我們用串口通信就應(yīng)該直接用p0.0,p0.1與SIM900a的5V/3.3VTTL電平接口連接。最后把程序燒錄進去,給LPC2138和SIM900a供電后就實現(xiàn)了短信收發(fā)。
五、心得體會
兩周的嵌入式課程設(shè)計結(jié)束了,雖然這次的時間比較短,但我卻收獲了很多。在課程設(shè)計一開始,由于嵌入式方面的理論知識是我們上學期期末學的,我又幾乎一點不懂,所以我?guī)缀醪恢涝趺慈胧帧N彝ㄟ^上網(wǎng)查資料和請教老師,終于弄懂了它的原理以及通訊過程。但最困難的是寫程序這一部分,我通過看書,請教同學,很艱難的弄懂了一些皮毛。通過這次 ARM 課程設(shè)計,我對整個嵌入式程序的設(shè)計有了一定的理解,特別是有關(guān)函數(shù)調(diào)用這塊,老師發(fā)了一些模板,里面有很多的函數(shù)模板,我們只需要調(diào)用它就可以了。總之,這次課程設(shè)計不但讓我學到了很多的東西,提高了嵌入式方面的知識,同時也增強了我的動手能力,讓我知道了ARM世界是多么的神秘,我所學習的這些知識不過是九牛一毛。最后,感謝老師在課程設(shè)計中給予的幫助,以及組員們的通力合作。
  1. #include "Config.h"
  2. #include "Target.h"
  3. #include "UART.h"
  4. #include "lcd1602.h"
  5. #include "eint.h"
  6. #include "string.h"


  7. /****************************************************************************
  8. ** 函數(shù)名稱:Delay10MS()
  9. ** 函數(shù)功能:長軟件延時。
  10. ** 入口參數(shù):dly 延時參數(shù),值越大,延時越久 ****************************************************************************/
  11. void Delay10MS (uint32 dly)
  12. {               uint32 i;
  13.               for ( ; dly>0; dly--)
  14.                             for (i=0; i<34000; i++);
  15. }
  16. void Delay10MS (uint32 dly)
  17. {               uint32 i;
  18.               for ( ; dly>0; dly--)
  19.                             for (i=0; i<34000; i++);
  20. }

  21. //SIM900初始化函數(shù)
  22. uint8 SIM900Init(void)
  23. {
  24. //SendAT("ATE0\r\n","OK",2);//關(guān)閉回顯
  25. SendAT("AT+CSCS=\"GSM\"\r\n","OK",5);
  26. SendAT("AT+CMGF=1\r\n","OK",5);
  27. SendAT("AT+CNMI=2,1\r\n","OK",2);
  28. if(SendAT("AT+CMGD=1\r\n","OK",5)==0)
  29. {
  30. return 0;
  31. }
  32. return 1;
  33. }


  34. //發(fā)送AT指令函數(shù)
  35. //str :發(fā)送AT指令
  36. //target_str:期待收到的正常的字符串
  37. //time:最大允許時間S

  38. uint8 SendAT(uint8 *str,uint8 *target_str ,uint32 time)
  39. {
  40. uint8 *p=NULL; //00000000000000000000000000
  41. time = time*10; //將time的值轉(zhuǎn)換為100ms為刻度
  42. clear_recive_str();
  43. if((uint32)str <0xFF)
  44. {
  45. UART0_SendByte((uint8)str);
  46. }
  47. else
  48. {
  49. UART0_SendStr(str);
  50. }
  51. while(p==NULL)
  52. //0000000000000000
  53. {
  54. time--;
  55. Delay10MS(10);
  56. p=strstr((char *)recive_structure.recive_str,(char *)target_str);
  57. 收索字符串里面有沒有目標字符串 兩個變量
  58. if(time ==0 )
  59. return NULL;
  60. }
  61. return 1;
  62. }



  63. //短信發(fā)送函數(shù)
  64. uint8 sendMsg(uint8* str)
  65. {
  66. uint8 reslut =0;
  67. clear_recive_str();
  68. UART0_SendStr("AT+CMGS=\"15223191698\"\r\n");
  69. Delay10MS(10);
  70. clear_recive_str();
  71. UART0_SendStr(str);
  72. reslut=SendAT((uint8 *)0x1a,"OK",5);
  73. return reslut;
  74. }

  75. uint8 Msg[50];


  76. uint8 getMsg() //00000000000000
  77. {
  78. uint8 *p_start=NULL;
  79. uint8 *p_end = NULL;
  80. uint8 *temp=NULL;
  81. uint8 lenth=0;

  82. uint8 i =0;
  83. temp = (uint8 *)strstr((char *)recive_structure.recive_str,"OK"); //0000000000000000

  84. // temp = (uint8 *)strstr((char *)"+CMGR: \"REC
  85. READ\",\"+8613896155321\",\"\",\"18/01/03,19:11:39+32\"\r\naaaa\r\nOK","OK");
  86. if(temp!=NULL)
  87. {
  88. do
  89. {
  90. temp--;
  91. if(*temp!='\r'&&*temp != '\n')
  92. {
  93. p_end = temp;
  94. p_end++;
  95. do
  96. {
  97. temp--;
  98. if(*temp=='\r'||*temp == '\n')
  99. {
  100. p_start =temp+1;
  101. }
  102. }
  103. while(1);
  104. break;
  105. }
  106. }
  107. while(1);
  108. lenth = p_end-p_start;
  109. for(i=0;i<lenth;i++)
  110. {
  111. Msg[i] = *(p_start+i);
  112. }
  113. Msg[i]=NULL;

  114. return 1;
  115. }
  116. return 0;

  117. }



  118. void clear_Msg()
  119. {
  120. uint8 i =0;
  121. for(i=0;i<50;i++)
  122. {
  123. Msg[i] =0;
  124. }
  125. }
  126. uint8 a=0;

  127. /****************************************************************************
  128. * 函數(shù)名稱:main()
  129. * 功能描述: 向串口UART0發(fā)送字符串
  130. ****************************************************************************/
  131. int main(void)
  132. {
  133. uint8 last_a=a;


  134. PINSEL0 &= 0xFFFFFFF0;
  135. PINSEL0 |= 0x00000005; // 設(shè)置I/O連接到UART0


  136. UART0_Init(); // 調(diào)用自定義函數(shù)從UART0發(fā)送數(shù)據(jù)
  137. U0FCR = 0x81; // 使能FIFO,并設(shè)置觸發(fā)點為8字節(jié)
  138. U0IER = 0x01; // 允許RBR中斷,即接收中斷
  139. IRQEnable(); // 使能IRQ 中斷
  140. /* 使能UART0 中斷 */
  141. VICIntSelect = 0x00000000; // 設(shè)置所有的通道為IRQ 中斷
  142. VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高優(yōu)先級
  143. VICVectAddr0 = (uint32)ISR_UART0; // 設(shè)置UART0 向量地址
  144. VICIntEnable = 1 << 0x06; // 使能UART0 中斷

  145. //初始化外部中斷
  146. Eint3_Init();
  147. IRQEnable();
  148. lcd_init();
  149. DisText(0x80,"Init...");
  150. if(SIM900Init()==0)
  151. {
  152. WrCMD(0x01);
  153. DisText(0x80,"Init fail");
  154. while(1);
  155. }
  156. WrCMD(0x01);
  157. DisText(0x80,"Init OK");
  158. DisText(0x80+0x40,"Waiting...");
  159. clear_recive_str();

  160. while(1)
  161. {
  162. if(last_a!=a)
  163. {
  164. last_a =a;
  165. WrCMD(0x01);
  166. switch(a)
  167. {
  168. case 0:
  169. DisText(0x80,"Waiting...");
  170. break;
  171. case 1:
  172. DisText(0x80,"Come on");
  173. if(sendMsg("Come on")==1)
  174. DisText(0x80+0x40,"success!");
  175. else
  176. DisText(0x80+0x40,"fail!");
  177. break;
  178. case 2:
  179. DisText(0x80,"Merry Christmas");
  180. if(sendMsg("Merry Christmas")==1)
  181. DisText(0x80+0x40,"success!");
  182. else
  183. DisText(0x80+0x40,"fail!");
  184. break;
  185. case 3:
  186. DisText(0x80,"We are family");
  187. if(sendMsg("We are family")==1)
  188. DisText(0x80+0x40,"success!");
  189. else
  190. DisText(0x80+0x40,"fail!");
  191. break;
  192. default:break;
  193. }
  194. clear_recive_str(); //清空緩存區(qū)
  195. }
  196. if(recive_structure.recive_lenth!=0) //00000000000000000000000000000000000
  197. {
  198. if(search_str("+CMTI:")!=0) //收到了短信
  199. //00000000000000000000000000000000
  200. {
  201. clear_recive_str();

  202. SendAT("AT+CMGR=1\r\n","OK",3);
  203. Delay10MS(5);
  204. if(getMsg()==0)
  205. {
  206. WrCMD(0x01);
  207. DisText(0x80,"fail");
  208. }
  209. else
  210. {
  211. WrCMD(0x01);
  212. DisText(0x80,"R:");
  213. DisText(0x80+0x40,Msg);
  214. }
  215. SendAT("AT+CMGD=1\r\n","OK",2); //刪除短信
  216. SendAT("AT+CMGD=1\r\n","OK",2); //刪除短信
  217. Delay10MS(5);
  218. clear_Msg();
  219. clear_recive_str();

  220. }
  221. }


  222. }
  223. }
復制代碼

完整的Word格式文檔51黑下載地址:
短信收發(fā)課程設(shè)計報告.docx (2.03 MB, 下載次數(shù): 56)


回復

使用道具 舉報

ID:350104 發(fā)表于 2019-5-9 10:28 | 顯示全部樓層
這個很實用  找了很久 謝謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表