本博客作为实验笔记,仅供学习交流。(转载请注明出处)
本实验通过GSM模块:SIM900a,实现向特定手机发送sos求救信号,并且利用GPS模块:微科VK2828U7G5LF,将经纬度信息同时发送到手机中。目前已经实现通过串口2发送短信到手机,通过串口3实现接受gps数据并解析至单片机(串口1已预留其他功能)。
本实验的不足之处:由于接收的卫星数越多,GPS信号越精确,定位误差越小,下一步打算通过一些算法实现gps经纬度定位的高精确度。
1 #include <stc15wxx.h> 2 #include <string.H> 3 #include <intrins.h> 4 #define uchar unsigned char 5 #define uint unsigned int 6 7 8 void Uart2Init(); 9 void Uart2Sends(uchar *str); 10 void Uart2BYTE(uchar temp); 11 uchar hand(uchar *ptr); 12 void clear_rec_data(); 13 void DelaySec(int sec); 14 uchar rec_data[40];//GSM模块返回数据数组 15 uchar rec_num; 16 void Uart3Init(); 17 uchar rec_gpsdata[51]={0};//Gps模块返回数据数组 18 uchar rec_gpsnum=0; 19 uchar ok[]=",A,"; 20 uchar gpsdata[17]={0}; 21 uchar tn,p,gps_ok=0; 22 long tm; 23 24 void Init () 25 { 26 P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口 27 P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口 28 P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口 29 } 30 //串行口连续发送char型数组,遇到终止号/0将停止 31 void Uart1Init(void) //9600bps@11.0592MHz 32 { 33 SCON = 0x50; //8位数据,可变波特率 34 AUXR |= 0x01; //串口1选择定时器2为波特率发生器 35 AUXR |= 0x04; //定时器2时钟为Fosc,即1T 36 T2L = 0xE0; //设定定时初值 37 T2H = 0xFE; //设定定时初值 38 AUXR |= 0x10; //启动定时器2 39 EA=1;//开总中断 40 ES=1;//开串行口中断 41 } 42 43 void Uart1Sends(uchar *str) 44 { 45 while(*str!='