久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5330|回復: 1
收起左側

單片機控制sim900短信收發課程設計報告

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

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

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

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



二、軟件與硬件設計
⒈元器件 如表1:

器件

數量

Lpc2138

1

LCD1602

1

SIM900a

1

電纜線

1

USB電源線

1

電源

若干

導線

若干


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

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


②LCD的特性說明:

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


圖3

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

Proteus實時仿真(如圖5-圖8)
圖5                               圖6
            圖7                             圖8
2.調試
   實物圖圖9
                           圖9 發短信
                             圖10 發短信
                           圖11 收短信
                      圖12 手機短信的接收與發送
四、遇到的問題
在仿真的時候,老師說可以用虛擬串口與SIM900a連接來仿真,但是我們弄了很久都不行,指令并沒有從LPC2138發出去,最后就不了了之了,我們直接去進行了硬件的連接。一開始我們是準備用LPC2138板子上的RS232與SIM900a上的RS232電平接口相接來傳遞指令,之后才發現完全不對,我們用串口通信就應該直接用p0.0,p0.1與SIM900a的5V/3.3VTTL電平接口連接。最后把程序燒錄進去,給LPC2138和SIM900a供電后就實現了短信收發。
五、心得體會
兩周的嵌入式課程設計結束了,雖然這次的時間比較短,但我卻收獲了很多。在課程設計一開始,由于嵌入式方面的理論知識是我們上學期期末學的,我又幾乎一點不懂,所以我幾乎不知道怎么入手。我通過上網查資料和請教老師,終于弄懂了它的原理以及通訊過程。但最困難的是寫程序這一部分,我通過看書,請教同學,很艱難的弄懂了一些皮毛。通過這次 ARM 課程設計,我對整個嵌入式程序的設計有了一定的理解,特別是有關函數調用這塊,老師發了一些模板,里面有很多的函數模板,我們只需要調用它就可以了。總之,這次課程設計不但讓我學到了很多的東西,提高了嵌入式方面的知識,同時也增強了我的動手能力,讓我知道了ARM世界是多么的神秘,我所學習的這些知識不過是九牛一毛。最后,感謝老師在課程設計中給予的幫助,以及組員們的通力合作。
  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. ** 函數名稱:Delay10MS()
  9. ** 函數功能:長軟件延時。
  10. ** 入口參數:dly 延時參數,值越大,延時越久 ****************************************************************************/
  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初始化函數
  22. uint8 SIM900Init(void)
  23. {
  24. //SendAT("ATE0\r\n","OK",2);//關閉回顯
  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. //發送AT指令函數
  35. //str :發送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的值轉換為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. //短信發送函數
  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. * 函數名稱:main()
  129. * 功能描述: 向串口UART0發送字符串
  130. ****************************************************************************/
  131. int main(void)
  132. {
  133. uint8 last_a=a;


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


  136. UART0_Init(); // 調用自定義函數從UART0發送數據
  137. U0FCR = 0x81; // 使能FIFO,并設置觸發點為8字節
  138. U0IER = 0x01; // 允許RBR中斷,即接收中斷
  139. IRQEnable(); // 使能IRQ 中斷
  140. /* 使能UART0 中斷 */
  141. VICIntSelect = 0x00000000; // 設置所有的通道為IRQ 中斷
  142. VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高優先級
  143. VICVectAddr0 = (uint32)ISR_UART0; // 設置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(); //清空緩存區
  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黑下載地址:
短信收發課程設計報告.docx (2.03 MB, 下載次數: 56)
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女在线视频一区二区三区 | 91在线精品一区二区 | 久久精品国产99国产精品 | 在线观看中文字幕dvd播放 | 九九色综合 | 久久久一区二区 | 国产精品爱久久久久久久 | 亚洲日本视频 | 亚洲成人精品在线 | 亚洲免费网 | 日本亚洲欧美 | 久久久久久国产精品 | 国产精品久久一区二区三区 | 久久久久国产精品午夜一区 | 国产区第一页 | 色综合久| 日韩在线欧美 | 国产精品伦理一区二区三区 | 成人欧美 | 国产综合在线视频 | 性国产xxxx乳高跟 | 欧美一区二区大片 | 日日草夜夜草 | 日本不卡在线观看 | 日韩免费毛片视频 | 久久久久国产精品 | 91青青草视频 | 黑人巨大精品欧美一区二区一视频 | 国产精品视频网 | 国产精品毛片一区二区三区 | 亚洲经典一区 | 亚洲精品乱码久久久久久9色 | 97影院2 | 亚洲成人在线免费 | 日本欧美在线视频 | 一区二区三区免费 | 亚洲免费网 | 亚洲一本 | 精品亚洲一区二区 | 亚洲国产欧美一区 | 一区二区免费视频 |