A6_A7 GPS模块的51单片机例程

发布者:Harmonious222最新更新时间:2019-10-18 来源: eefocus关键字:A6_A7  GPS模块  51单片机 手机看文章 扫描二维码
随时随地手机看文章

1.准备一个STC89C52最小系统板
    
2.烧录代码(先烧录代码后接线,防止接线后下载不了代码)
3.给模块供电,给模块开机
4.接线:
    STC89C52        A6&A7
    GND        ->        GND
    TXD/P3.1->        U_RXD
    RXD/P3.0->        U_TXD

单片机源程序如下:

/*********************************************************************

                 作者:神秘藏宝室


        本例程仅适用于在本店购买模块的用户使用,鄙视其它店铺的盗用行为

        版权所有,盗版必究!!!

        A6模块链接:


        A7模块                STC15W最小系统

        GND                 -->                GND

        U_TXD        -->                P0.0/RXD3

        U_RXD        <--                 P0.1/TXD3


        GPS_TXD        -->                P1.0/RXD2

*********************************************************************/

#include "main.h"

#include "delay.h"

#include "uart.h"


#include

#include

#include



/*************        功能说明        **************




******************************************/


/*************        本地常量声明        **************/

#define Success 1U

#define Failure 0U


/*************        本地变量声明        **************/

unsigned long  Time_Cont = 0;       //定时器计数器

bit ledState = LED_OFF;


unsigned int gprsBufferCount = 0;




/*************        本地函数声明        **************/




/*************  外部函数和变量声明 *****************/




/******************** IO配置函数 **************************/

void        GPIO_config(void)

{

        P5M0 = 0;                 //设置准双向口

        P5M1 = 0;

}


/******************** 主函数 **************************/

void main(void)

{

        GPIO_config();

        UartInit();


        SendString("ILoveMCU.taobao.com");

        delay_ms(200);

        clrStruct();


        initGprs();

        while(1)

        {

                parseGpsBuffer();

                printGpsBuffer();        

        }

}


void initGprs()

{

        if (sendCommand("ATrn", "OK", 3000, 10) == Success);

        else errorLog(1);



//      如果输入 AT+CREG? 则返回+CREG: , [ ,, ]

// 注: 的值共有三个选项,分别是 0 or 1 or 2,  其中0 代表关闭网络注册结果

//            码, 1 代表当网络注册状态改变时激活网络注册结果码, 2 代表激活网

// 络注册结果码同时显示区域和小区信息.

//    的返回值共有三个,分别是 0, 1, 2,3,4,5 ,  其中 0 代表没有注册网络同时

//   模块没有找到运营商, 1代注册到了本地网络, 2 代表找到运营商但没

// 有注册网络, 3 代表注册被拒绝, 4 代表未知的数据, 5代表注册在漫游

// 状态.

//    表示所属网络区域代码,十六进制格式显示,如: “ 279C”

//    表示所属网络的小区 ID,十六进制格式显示,如: “ 0EB2”  Tech-Link T&E

        if (sendCommand("AT+CPIN?rn", "READY", 1000, 10) == Success);

        else errorLog(2);

        delay_ms(10);


        if (sendCommand("AT+CREG?rn", "CREG: 1", 1000, 10) == Success);

        else errorLog(3);

        delay_ms(10);


        if (sendCommand("AT+GPS=1rn", "OKrn", 1000, 10) == Success);

        else errorLog(4);

        delay_ms(10);

}


unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)

{

        unsigned char n;

        Uart3CLR_Buf();

        for (n = 0; n < Retry; n++)

        {

                SendString("rn---------send AT Command:---------rn");

                SendString(Command);


                Uart3SendString(Command);                 //发送GPRS指令


                Time_Cont = 0;

                while (Time_Cont < Timeout)

                {

                        delay_ms(100);

                        Time_Cont += 100;

                        if (strstr(Uart3_Rec_Buf, Response) != NULL)

                        {

                                SendString("rn==========receive AT Command:==========rn");

                                SendString(Uart3_Rec_Buf); //输出接收到的信息

                                Uart3CLR_Buf();

                                return Success;

                        }

                        

                }

                Time_Cont = 0;

        }

        SendString("rn==========receive AT Command:==========rn");

        SendString(Uart3_Rec_Buf);//输出接收到的信息

        Uart3CLR_Buf();

        return Failure;

}



void soft_reset(void)         //制造重启命令

{

   ((void (code *) (void)) 0x0000) ();

}


void errorLog(int num)

{

        SendString("ERROR");

        SendData(num+0x30);

        SendString("rn");

        while (1)

        {

                  if (sendCommand("ATrn", "OK", 100, 10) == Success)

                {

                        SendString("rnRESET!!!!!!rn");

                        soft_reset();

                }

                delay_ms(200);

        }

}



void parseGpsBuffer()

{

        char *subString;

        char *subStringNext;

        char i = 0;

        if (Save_Data.isGetData)

        {

                Save_Data.isGetData = false;

                SendString("**************rn");

                SendString(Save_Data.GPS_Buffer);


                

                for (i = 0 ; i <= 6 ; i++)

                {

                        if (i == 0)

                        {

                                if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)

                                        errorLog(1);        //解析错误

                        }

                        else

                        {

                                subString++;

                                if ((subStringNext = strstr(subString, ",")) != NULL)

                                {

                                        char usefullBuffer[2]; 

                                        switch(i)

                                        {

[1] [2]
关键字:A6_A7  GPS模块  51单片机 引用地址:A6_A7 GPS模块的51单片机例程

上一篇:51单片机自动凉衣服源程序电路图与实物图
下一篇:关于51单片机的定时器T0、T1总结

推荐阅读最新更新时间:2024-11-11 11:11

51单片机在片设备与中断(1)
并行端口要点 MCS-51单片机内部有4个8位的并行I/O口P0、P1、P2、P3。其中P3口、P2口、P1口为准双向口,P0口为双向的三态数据线口。各端口均由端口锁存器、输出驱动器、输入缓冲器等构成。各端口除可进行字节的输入/输出外,每个位口线还可单独用作输入/输出,实际应用非常方便。 对并行I/O口的 读 修改 写 类指令(例如 CPL P0.0、ANL P1,#0FH等)实际是读出对应的端口锁存器的内容,执行修改后再写回到端口锁存器中。之所以是 读锁存器 而不是 读引脚 ,是为了避免因引脚外部电路的原因而使引脚的状态发生改变而造成误读。 P0口是一个三态双向I/O口,在需要进行外部ROM、RAM等扩展时,采用分时复用的
[单片机]
51单片机外部中断0实例详解
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法。 1 51单片机的中断源 51单片机共有5个中断源,分别为: 外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,中断向量表如下所示: 2 什么是中断事件 当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的事情,这样可以大大降低单片机的资源,提高执行效率。举个例子说明一下什么是中断: 我很喜欢打CS,每天晚上我都会抽时间打CS,但同时厨房里正在烧水,为了不使水烧干,我每隔5分钟就去厨房看一下水有没开,但这就错过了游戏老被别人爆头干掉,我很苦恼,怎么办。于是我在网
[单片机]
<font color='red'>51单片机</font>外部中断0实例详解
初步认识51单片机-2.3单片机控制DS18B20温度传感器模块
通过前面LCD1602的例子我相信对IO口的控制和延时基本有所了解,下面再来一个例子温度传感器,同样只需要IO口操作和延时。先来个DS18B20温度传感器的简介。既然是温度传感器,那么一定有个感知温度的感应器。这个感应器能把它周围的温度直接转成数字并存储在scratchpad存储器中。这个感知温度和转换成数字信号的过程我们可以不用理解。我们要做的事情就是读存储器的内容及其他一些配置。其原理图如下: 图1 DS18B20温度传感器概述 在DS18B20中有一个温度传感器(如上图所示),它能感知周围环境温度,并能将温度的结果直接转成数字信号存储起来。温度信号转成数字信号的过程我们可以不用关心。那么数字信号存在哪里了?DS18B
[单片机]
初步认识<font color='red'>51单片机</font>-2.3单片机控制DS18B20温度传感器模块
8051单片机的5个中断源分析
当几个中断源同时向CPU请求中断时,按所发生的实时事件的轻重缓急排队,优先处理最紧急事件的中断请求,于是 单片机 规定每个中断源的优先级别。      当CPU正在处理一个中断请求,又发生另一个优先级比它高的中断请求,CPU暂时中止对前一中断处理,转而去处理优先级更高的中断请求,待处理完后,再继续执行原来的中断处理程序,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。      由于外界异步事件中断CPU正在执行的程序时随机的,CPU转向去执行中断服务程序时,除了硬件会自动把断电地址,即16位PC程序计数器的值压入堆栈之外,用户还得注意保护有关工作寄存器,累加器,标志位等信息,这个过程通常称为保护现场 。以便在完成中断
[单片机]
80<font color='red'>51单片机</font>的5个中断源分析
51单片机概述以及设计最小系统
单片机是什么? 在学之前必须要明白这个东西是什么,怎么用,为什么能这样用。理解这三个问题,那么51单片机就可以学得很好。 单片机的对比 这里只对8051与8052进行对比: 型号 Flash(ROM) RAM I/O 定时/计数器 中断源 引脚数 AT89C51 4KB 128B 32 2 5 40 AT89c52 8KB 256B 32 3 8 40 引脚描述 20引脚VSS:电源负极 40引脚VCC:电源正极(+5V) 19引脚XTAL1:片内时钟振荡器的输入端;当使用片内时钟振荡器时,这个引脚接石英晶体和微调电容。 18引脚XTAL2:片内时钟振荡器的输出端;当使用片内时钟振荡器时,这个引脚接石英晶体和微
[单片机]
<font color='red'>51单片机</font>概述以及设计最小系统
51单片机基础之外部中断(二)
代码: #include reg51.h typedef unsigned char u8; typedef unsigned int u16; sbit LED=P2^0; sbit KEY=P3^3; void delay(u16 i) { while(i--); } void EXIT1_Init(void) //外部中断初始化 { IT1=1;//跳变沿触发方式(下降沿),低电平触发 EX1=1;//打开INT0的中断允许,打开外部中断0允许 EA=1;//打开总中断 } void main(void) { EXIT1_Init();//打开外部中断 while(1)
[单片机]
51单片机RAM 数据存储区学习笔记
1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。 在keil中,可选择small,compact,large三种方式存储数据变量: 在keil中可以用“TargetOptions”来配置这一项: 图1 选择数据存储模式 2.片内数据存储区 (1) 工作寄存器区 工作寄存
[单片机]
<font color='red'>51单片机</font>RAM 数据存储区学习笔记
51单片机指令系统寻址方式
指令给出参与运算的数据方式称为寻址方式。换句话说,寻址方式就是寻找确定参与操作的数的真正地址。 在MCS-51系列单片机的指令系统中寻址方式共有7种, 立即寻址方式,mcs-51单片机的一种寻址方式,操作数就写在指令中,和操作码一起放在程序存贮器中。把“#”号放在立即数前面,以表示该寻址方式为立即寻址,如#20H,立即寻址方式通常用于对通用寄存器或内存单元赋初值。 直接寻址方式,指令操作数域给出的是参加运算的操作数地址。在MCS-51单片机中,直接地址只能用来表示特殊功能寄存器、内部数据寄存器和位地址空间。其中,特殊功能寄存器和位地址空间只能用直接寻址方式访问。 寄存器寻址方式,操作数在寄存器中,由指令操作码中的rrr
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved