前段时间受朋友影响,决定买个GPS模块学习一下这东西怎么用,写这帖子是为了和大家共同学习这模块,为了控制这模块搭建了一套简单的测试电路,希望能给也想了解这模块的朋友来个参考,废话不多说,有图有真相;在使用12864的时候发现点问题,请教高人,12864检测忙的时候就是不好使,总忙为啥呢?无奈换套路用延时,我每次给12864送指令都需要延时;还有个问题就是我在12864显示的时候 最早用STC89C58正常,但是换STC12C5A60S2的时候,屏幕会闪的很厉害(相应延时已由12T的调整为1T的),调整延时后还是闪,最后在main里添加延时后好多了,但是程序一变化相应的延时也得变,有啥办法能让屏幕不闪呢,是因为1T的单片机太快了,12864跟不上节奏吗? 请高人指点 谢谢
应大家要求 做下说明:
本系统初衷是本人为了 了解GPS模块而做的测试,GPS模块用的是上文提到的REB3571,其实我觉得市面上卖的GPS模块基本都遵循NMEA0183协议,所以在整体设计的时候只要为单片机留出串口就行了,一般的GPS模块都会引出TTL电平的TXD和RXD引脚,我用的GPS模块采用5V供电,跟51供电相同所以不用电压转换;单片机其实最早我用的是AT89S52,但是因为程序编译后大概20K左右,所以放弃了52选用STC的89C58,买芯片的时候发现STC89C58和STC12C5A60S2一个价,所以就一样买了一片(在电子市场买的,卖家比较黑一片要我12块钱),源程序在58上进行的测试,后来移植到1T的STC12C5A60S2上,因为STC12C5A60S2有俩串口,以后可以扩展,所以果断弃掉58转投STC12C5A60S2;液晶方面用的是12864(控制器芯片 ST7920 ),我也是刚知道LCD还有控制器芯片;最初的测试是用的USB供电,但是做完之后只能在电脑旁测试也没速度;就想了个招用4节5号电池的电池盒(一般的1元钱4节的电池,4节加一起都能达到6.8V,为了供电稳定可以考虑串1n4007,或是上7805稳压,我觉得1117的5V芯片挺好使,其间也试过LM317),最后还是采用了18650(这就是笔记本的电芯,一般都2000mh以上),加个一个升压模块(模块上有可调的电位器,自己调整电压感觉需要比5V高点,因为测试的时候没接负载呢,也不知道这么想对不?哈哈希望高人指点谢谢);我整理一下 回头上传电路图。
各位论坛的好朋友实在抱歉,由于一些原因好长、好长时间都没碰单片机了,差点就放弃这个专业了,
附上解码的程序 大家共同学习研究,有需要电路图的朋友请留言,我得好好找找都不知道放哪里了。
int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status, tmp;
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
ch = buf[5];
status = buf[GetComma(2, buf)];
if (ch == 'C') //如果第五个字符是C,($GPRMC)
{
if (status == 'A') //如果数据有效,则分析
{
GPS -> NS = buf[GetComma(4, buf)];
GPS -> EW = buf[GetComma(6, buf)];
GPS->latitude = Get_Double_Number(&buf[GetComma(3, buf)]);
GPS->longitude = Get_Double_Number(&buf[GetComma( 5, buf)]);
GPS->latitude_Degree = (int)GPS->latitude / 100; //分离纬度
lati_cent_tmp = (GPS->latitude - GPS->latitude_Degree * 100);
GPS->latitude_Cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - GPS->latitude_Cent) * 60;
GPS->latitude_Second = (int)lati_second_tmp;
GPS->longitude_Degree = (int)GPS->longitude / 100; //分离经度
long_cent_tmp = (GPS->longitude - GPS->longitude_Degree * 100);
GPS->longitude_Cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - GPS->longitude_Cent) * 60;
GPS->longitude_Second = (int)long_second_tmp;
speed_tmp = Get_Float_Number(&buf[GetComma(7, buf)]); //速度(单位:海里/时)
GPS->speed = speed_tmp * 1.85; //1海里=1.85公里
GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度
GPS->D.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //时间
GPS->D.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
GPS->D.second = (buf[11] - '0') * 10 + (buf[12] - '0');
tmp = GetComma(9, buf);
GPS->D.day = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期
GPS->D.month = (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0');
GPS->D.year = (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000;
UTC2BTC(&GPS->D);
return 1;
}
}
return 0;
}
int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status;
char *buf = line;
ch = buf[4];
status = buf[GetComma(2, buf)];
if (ch == 'G') //$GPGGA
{
if (status != ',')
{
GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
// GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
GPS->height_ground = Get_Float_Number(&buf[GetComma(10, buf)]); //要的是大地水平高度,应该解析第10个逗号之后的数据
return 1;
}
}
return 0;
}
液晶部分 焊个电位器 调对比度
电源部分 为了到户外测试方便 加个18650和升压模块
初始化状态
测试的结果
|