借助系統模型,闡明基于西門子公司的TC35型GSM手機模塊收發短信、打電話的基本概念以及串口控制 SMS 的基本原理。詳細介紹C51單片機STC12C5A32S2控制GSM 模塊工作的軟件實現過程,對怎樣用單片機控制GSM 模塊收發短信、打電話進行探討,也對程序設計的主體思想作了較為細致的分析。
文章重點闡述了STC12C5A32S2單片機和TC35模塊的接口、TC35的特點和主要功能、AT指令的應用等。該系統單片機STC12C5A32S2的TXD/RXD分別接TC35模塊的TXD/RXD,完成對TC35模塊的初始化和短消息的數據收發以及打電話的功能。
這個是制作成功的實物圖:
0.png (409.17 KB, 下載次數: 89)
下載附件
2017-5-21 17:14 上傳
壓縮包里面含完整的PCB圖 proteus仿真原理圖和源程序程序等
0.png (70.34 KB, 下載次數: 121)
下載附件
2017-5-21 17:10 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <absacc.h>
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include <stdlib.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define lcd_data_port P0 //定義與1602LCD的數據口的單片機口線
- sbit lcden=P2^5; // lcd使能
- sbit lcdrs=P2^3; // lcd讀
- sbit lcdrw=P2^4; // lcd寫
- sbit beep=P2^2;//蜂鳴器
- void delayms(uint x);
- void lcd_write_com(uchar lcd_com); //送命令數據到LCD的子函數聲明
- void lcd_write_data(uchar lcd_data); //送顯示數據到LCD的子函數聲明
- void lcd_int(); //LCD初始化子函數聲明
- void write_sfm(uchar wz,uchar date);//在第一行寫一個數函數
- #define key_4x4_port P1 //定義4x4鍵盤使用的單片機端口
- uchar key; //4x4鍵盤掃描所得的鍵值保存到這里
- void key_4x4_scan(); //聲明4x4鍵盤掃描子函數,得到的鍵值送至全局變量key
- #define Phone_connection 1 //正在打電話狀態標志
- #define Clear_Connect 0 //電話已掛斷狀態標志
- char Calls_State_Flag=Clear_Connect; //電話狀態
- void ScanMessage(void);
- void clr_rsbuf(void);
- uchar code AT[]="AT\r" ; //握手信號
- uchar code AT_CMGF[]= "AT+CMGF=1\r";//發送數據為TXET格式
- uchar code AT_CMGS[]= "AT+CMGS=15994473659\r";
- uchar code AT_CMGR[]= "AT+CMGR=2\r";
- uchar code AT_CSCA[]="AT+CSCA=\"+8613800771500\""; //設置服務中心號碼
- uchar code AT_CNMI[]= "AT+CNMI=2,1,0,0\r";//新消息提示:設置為mode=2,mt=1
- uchar code AT_CLIP[]= "AT+CLIP=1,1\r";//顯示來電號碼
- uchar Sms[]="hello!";
- uchar Phone_call[]="15994473659";
- uchar Phone_num[12];
- uchar RsPoint=0;
- uchar RsBuf[100];
- uchar j=0;
- uint i, k,ii;
- void di()
- {
- beep=0;
- delayms(250);
- beep=1;
- }
- /*-------------------------------------------------------------------------------------------*/
- void delayms(uint x)//延時
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- /***********************************************************
- 函數名稱:Print_Char
- 函數功能:發送單個字符
- 入口參數:ch 出口參數:無
- ***********************************************************/
- void Print_Char(uchar ch)//發送單個字符
- {
- SBUF=ch; //送入緩沖區
- while(TI==0); //等待發送完畢
- TI=0; //軟件清零
- }
- /***********************************************************
- 函數名稱:Print_Str
- 函數功能:發送字符串
- 入口參數:*str 出口參數:無
- ***********************************************************/
- void Print_Str(uchar *str)//發送字符串
- {
- while(*str!='\0')
- {
- Print_Char(*str++);
- }
- }
- void clr_rsbuf(void)//清空接收緩存
- {
- for(RsPoint=0;RsPoint<100;RsPoint++)
- {
- RsBuf[RsPoint]=0x00;
- }
- RsPoint=0;
- }
- void ser()interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- RsBuf[RsPoint++]=SBUF;
- if (RsPoint>=sizeof(RsBuf))
- {
- RsPoint=0;//FlagRs485=0;
- } //????
- }
- }
- /***********************************************************
- 函數名稱:Ini_UART
- 函數功能:串口初始化、定時器初始化
- 入口參數:無 出口參數:無
- ***********************************************************/
- Ini_UART(void)//串口初始化、定時器初始化
- {
- TMOD = 0x20; //T1方式2,用于UART波特率
- TH1 = 0xFD; //UART波特率設置:9600
- TL1 = 0xFD;
- SCON = 0x50; ////UART方式1:8位UART; REN=1:允許接收
- PCON = 0x00;
- TF1 = 1; // 中斷標志位
- TR1 = 1; // 啟動定時器1
- ES=1; //啟動串行口中斷
- ET0=1; //啟動中斷功能
- EA=1;
- }
- /***********************************************************
- 函數名稱:main
- 函數功能:主函數
- ***********************************************************/
- void main()
- {
- di();
- Ini_UART();
- lcd_int();
- k=0;
- Print_Str(AT);
- delayms(100);
- Print_Str(AT_CMGF);
- delayms(100);
- Print_Str(AT_CNMI);
- delayms(200);
- Print_Str(AT_CLIP);
- delayms(250);
- clr_rsbuf();
- P1=0xff; //P0開機初始化
- key=0xff; //鍵盤值開機初始化為ff(檢測到的鍵值應為0----15)
- while(1)
- {
- ScanMessage();
- key_4x4_scan();//不停調用鍵盤掃描程序
- };//原地循環
- }
- void ScanMessage(void)
- {
- for(ii=0;ii<32;ii++)
- if(RsBuf[ii-3]=='C'&&RsBuf[ii-2]=='M'&&RsBuf[ii-1]=='T'&&RsBuf[ii]=='I')
- {
- di();
- delayms(50);
- di();
- delayms(50);
- di();
- delayms(50);
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- clr_rsbuf();
- Print_Str(AT_CMGR);
- delayms(250);delayms(250);delayms(250);delayms(250);
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=0;i<15;i++)
- {
- lcd_write_data(RsBuf[i+20]); //顯示
- delayms(100);
- }
- lcd_write_com(0x80+0x40); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=15;i<32;i++)
- {
- lcd_write_data(RsBuf[i+20]); //顯示
- delayms(100);
- }
- }
- else if(RsBuf[ii-3]=='C'&&RsBuf[ii-2]=='L'&&RsBuf[ii-1]=='I'&&RsBuf[ii]=='P')
- {
- beep=0;
- delayms(250);
- delayms(250);
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=(ii+3);i<15+(ii+3);i++)
- {
- lcd_write_data(RsBuf[i]); //來電顯示
- delayms(5);
- }
- lcd_write_com(0x80+0x40); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=(ii+3)+15;i<32+(ii+3);i++)
- {
- lcd_write_data(RsBuf[i]); //顯示"ATH"
- delayms(5);
- }
- while(!beep)
- {
- key_4x4_scan();//不停調用鍵盤掃描程序
- }
- clr_rsbuf();
- }
- }
- /***********************************************************
- 函數名稱:phone
- 函數功能:撥打目標電話
- 入口參數:無 出口參數:無
- ***********************************************************/
- void phone() //打電話函數
- {
- uchar ATD1[]="ATD"; //撥
- uchar ATD3[]=";\r";
- uchar ATDINTOL[25];
- strcpy(ATDINTOL,ATD1);
- strcat(ATDINTOL,Phone_num); //EEE
- strcat(ATDINTOL,ATD3);
- Print_Str(ATDINTOL);
- delayms(250); delayms(250);
- }
- /***********************************************************
- 函數名稱:GSM_ATH
- 函數功能:掛電話
- 入口參數:無 出口參數:無
- ***********************************************************/
- void GSM_ATH()
- {
- Print_Str("ATH"); //發送掛電話指令
- Print_Str("\r"); //發送回車
- delayms(250);delayms(250);delayms(250);delayms(250);
- }
- /***********************************************************
- 函數名稱:Rphone
- 函數功能:接聽目標電話
- 入口參數:無 出口參數:無
- ***********************************************************/
- void Rphone() //接聽電話函數
- {
- Print_Str("ATA");
- Print_Str("\r"); //發送回車
- delayms(250);delayms(250);delayms(250);delayms(250);
- }
- /***********************************************************
- 函數名稱:GSM_TEXT
- 函數功能:設置發送數據為TXET格式
- 入口參數:無 出口參數:無
- ***********************************************************/
- //void GSM_TEXT() //設置GSM為TEXT格式
- //{
- // Print_Str(AT_CMGF); //發送設置指令
- // ES=1;
- // delayms(250);delayms(250);
- //}
- /***********************************************************
- 函數名稱:GSM_TEXT_SMS
- 函數功能:發送數據為TXET格式的短信內容
- 入口參數:無 出口參數:無
- ***********************************************************/
- void GSM_TEXT_SMS() //發送TEXT格式內容
- {
- Print_Str(AT_CMGS);
- Print_Str(Phone_call);
- Print_Str("\r");
- delayms(200);
- Print_Str(Sms);
- Print_Char(0x1A); //發送短息內容結束符對應的ASCII為0x1a
- ES=1;
- delayms(250);delayms(250);
- }
- /***********************************************************
- LCD相關函數定義
- ***********************************************************/
- //-----------------------------------------
- void lcd_write_com(uchar lcd_com) //LCD送命令子函數
- {
- lcdrs=0;
- lcd_data_port=lcd_com;
- delayms(5);
- lcden=1;
- delayms(5);
- lcden=0;
- }
- //-----------------------------------------
- void lcd_write_data(uchar lcd_data) //LCD送顯示數據子函數
- {
- lcdrs=1;
- lcd_data_port=lcd_data;
- delayms(5);
- lcden=1;
- delayms(5);
- lcden=0;
- }
- //-----------------------------------------
- void lcd_int() //LCD初始化子函數
- {
- lcdrw=0;
- lcden=0;
- lcd_write_com(0x38); //設置LCD工作于16x2、5x7點陣、8位數據接口模式
- lcd_write_com(0x0c); //開顯示,不顯示光標
- lcd_write_com(0x06); //寫一個字符后地址指針自動加1
- lcd_write_com(0x01); //清屏
- }
- //----------------------------------------------------------------
- //-----------------------------------------
- void write_sfm(uchar wz,uchar date) //在第一行寫一個數函數
- {
- lcd_write_com(0x80+wz); //設置顯示位置
- lcd_write_data(0x30+date);
- }
- /*-------------------------------------------------------------------------------------------*/
- //-----------------------------------------
- void key_4x4_scan() //4x4鍵盤掃描子函數,得到的鍵值送至全局變量key
- {
- uchar temp ;
- key_4x4_port=0xfe; //送出最低位0電平去掃描
- temp=key_4x4_port; //讀出整個口的得到的值
- temp=temp&0xf0; //屏蔽低4位
- if(temp!=0xf0) //假如高4位不是全1
- {
- delayms(10); //延時消抖再讀
- temp=key_4x4_port;
- temp=temp&0xf0;
- if(temp!=0xf0) //消抖后如果再次確定高4位不是全1
- {
- temp=key_4x4_port; //讀出此次按鍵的值
- switch(temp)
- {
- ///////////////撥打電話按鍵////////////////////////////
- case 0xee: key=0;
- lcd_write_com(0x01); //清屏
- clr_rsbuf();
- phone(); //撥打電話
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=0;i<32;i++)
- {
- lcd_write_data(RsBuf[i]); //顯示
- delayms(50);
- }
- delayms(250);
- Calls_State_Flag=Clear_Connect;
- break; //11101110
- ///////////////掛電話按鍵//////////////////////////
- case 0xde: key=1;
- lcd_write_com(0x01); //清屏
- clr_rsbuf();
- GSM_ATH(); //發送掛電話指令
- beep=1;
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=0;i<32;i++)
- {
- lcd_write_data(RsBuf[i]); //
- delayms(50);
- }
- delayms(250);
- Calls_State_Flag=Phone_connection;
- break; //11011110
- ////////////////TEXT格式及TEXT格式內容///////////////////////////////
- case 0xbe: key=2;
- lcd_write_com(0x01); //清屏
- clr_rsbuf();
- //GSM_TEXT();//設置GSM為TEXT格式
- GSM_TEXT_SMS();//發送TEXT格式內容
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=0;i<15;i++)
- {
- lcd_write_data(RsBuf[i]); //顯示
- delayms(100);
- }
- for(i=15;i<32;i++)
- {
- lcd_write_data(RsBuf[i]); //顯示
- delayms(100);
- }
- delayms(250);
- delayms(250);
- break; //10111110
- ///////////////0號鍵////////////////////////////////
- case 0x7e: key=3;
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- Phone_num[k++]=0x30;
- write_sfm((j+1),0);
- j=j+1;
- break; //01111110
- }
- while(temp!=0xf0) //等待按鍵放開
- { temp=key_4x4_port;
- temp=temp&0xf0;
- }
- }
- }
- key_4x4_port=0xfd; //11111101
- temp=key_4x4_port;
- temp=temp&0xf0;
- if(temp!=0xf0)
- { delayms(10);
- temp=key_4x4_port;
- temp=temp&0xf0;
- if(temp!=0xf0)
- { temp=key_4x4_port;
- switch(temp)
- {
- ///////////////接聽電話按鍵////////////////////////////////
- case 0xed: key=4;
- lcd_write_com(0x01); //清屏
- clr_rsbuf();
- Rphone(); //接聽電話
- beep=1;
- lcd_write_com(0x80); //將要顯示的位置定位在LCD的第一行第0個字符處
- for(i=0;i<32;i++)
- {
- lcd_write_data(RsBuf[i]); //顯示
- delayms(50);
- }
- delayms(250);delayms(250);
- break; //11101101
- ////////////////7號鍵////////////////////////////////
- case 0xdd: key=5;
- Phone_num[k++]=0x37;
- write_sfm((j+1),7);
- j=j+1;
- break; //11011101
- /////////////////4號鍵///////////////////////////////
- case 0xbd: key=0x36;
- Phone_num[k++]=0x34;
- write_sfm((j+1),4);
- j=j+1;break; //10111101
- ////////////////1號鍵////////////////////////////////
- Phone_num[k++]=0x31;
- case 0x7d: key=7;
- write_sfm((j+1),1);
- j=j+1; break; //01111101
- }
- while(temp!=0xf0)
- { temp=key_4x4_port;
- temp=temp&0xf0;
- }
- }
- }
- key_4x4_port=0xfb; //11111011
- temp=key_4x4_port;
- temp=temp&0xf0;
- if(temp!=0xf0)
- { delayms(250);delayms(250);delayms(250);delayms(250);
- temp=key_4x4_port;
- temp=temp&0xf0;
- if(temp!=0xf0)
- { temp=key_4x4_port;
- switch(temp)
- {
- //////////////清屏按鍵//////////////////////////
- case 0xeb: key=8;
- lcd_write_com(0x01); //清屏
- j=0;k=0;
- break; //11101011
- ///////////////8號鍵//////////////////////////
- case 0xdb: key=9;
- Phone_num[k++]=0x38;
- write_sfm((j+1),8);
- j=j+1;break; //11011011
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
文檔預覽: http://www.zg4o1577.cn/bbs/dpj-85499-1.html
全部資料打包下載地址:
基于GSM的手機設計.7z
(1.55 MB, 下載次數: 547)
2021-3-24 01:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|