写这个博客的目的是为了防止忘记,还有就是记录自己一点一滴的成长。
为什么会设计到这个模块,是因为我们想给学生开展一个实训,源于同事的一个实际项目:自动调速播种机,原理是,将该GPS模块装在播种机上,然后根据GPS采集的速度信息来调整播种机的播种速度,这样就保证了播种的均匀,提高实用性。
接下来先来介绍一下GPS模块:
GPS模块(G28U7FTTL)
实物图:
引脚说明图:
与单片机连接,如下表:
GPS模块(G28U7FTTL) | 单片机(STC12C5A60S2) |
GND | GND |
VCC | VCC |
TXD | RXD2(P1.2) |
RXD | TXD2(P1.3) |
这里要注意一下,我们准备使用单片机(STC12C5A60S2)的第二份串口,以前的传统串口留着与PC机相连,通过串口助手查看GPS接收的信号。大家有时间可以研读一下STC12C5A60S2这个型号的单片机,他集成的功能还是比较强大的。
P1.2和P1.3口作为串口,其实也比较简单,我们可以给大家截取一点文档看看。
再回到这个GPS模块,它所接受的大致数据为:
现在我们看一下我的硬件代码:
#include <stc12c5a60s2.h>
unsigned char Read_buf[40];
unsigned char Send_buf[40];
unsigned char Send_length=0;
unsigned int Read_id=0;
unsigned int Send_flag=0;
unsigned int Send_id=0;
/* 函数申明 */
void usart_Init();
void usart2_Init();
void main()
{
usart_Init(); // 串口1初始化
usart2_Init(); // 串口2初始化
IE2=0X01; // 允许中断2中断
ES=1; // 允许中断1中断
EA=1; // 开启总中断
while(1);
}
void usart_Init() // 串口1初始化函数,产生9600bps波特率,可用串口助手自动完成
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
void usart2_Init() // 串口2初始化函数,产生9600bps波特率,可用串口助手自动完成
{
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x10; //启动独立波特率发生器
}
void usart2() interrupt 8
{
unsigned char x;
if((S2CON & 0X01) == 1) // 接受中断标志位,表示开始接受数据
{
S2CON=S2CON&0XFE; // 清串口2中的中断接受标志位
x=S2BUF;
SBUF=x; // 发送数据给串口1
}
}
void usart() interrupt 4
{
if(TI==1) // 发送数据
{
TI=0;
}
}
运行的结果为:
你会发现这个GPS的确不停的在发这些数据,如果我们只想取其中一条数据,然后在这个串口助手中显示呢?
如,我只取这个速度信息,前缀为:$GPVTG,,,,,,,,,,,,,N*30,如图:
该如何实现呢?我们将在下次文章中讲解。