单片机
返回首页

51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序

2020-02-15 来源:51hei

sim800c+GPS芯片
一个练手的小设计,有点丑哈。附上程序和原理PcB图。
 

第一次发帖,做的不好烦请原谅哈

按键功能一个按键报警,蜂鸣器响,另外一个按键发送短信到指定的手机上,手机号码程序里面写好就行了

单片机源程序如下:

#include 'common.h'

#include 'uart.h'

#include 'gps.h'

#include 'gsm.h'



#include 'lcd.h'


#define GPS_STR_LEN 48


uchar ess_inc;


//char xdata GPS_SEND_STR[GPS_STR_LEN];


sbit key = P1^3;

sbit key1 = P1^4;

sbit GPS_EN=P3^4;

sbit led1 = P3^3;

#define   RMC_YES    led1 = 0

#define   RMC_NO     led1 = 1


GPS_INFO   GPS;  //GPS信息结构体


bit GPS_rx_flag = 0;

bit GPS_Have_flag = 0;


#define SEND_NUMBER 'AT+CMGS='13420106297'rn'


char xdata send_data[37]='N:     ',E:     ',2000-00-00,00:00rn';

unsigned char send_len= 0;


bit dis_flag = 1;

bit sendflag=0;



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

显示时间

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

void GPS_DispTime(void)

{

    uchar i = 0;

    uchar ch;

    char time[5];


          Int_To_Str(GPS.D.year,time);//年


    LCD1602_Set_AC(0, 1);

    i = 0;

          send_len = 18;

    while(time[i] != '')

    {

        ch = time[i++];


        LCD1602_write_data(ch);


                    send_data[send_len++] = ch;

    }

    LCD1602_write_data('-');

                

                Int_To_Str(GPS.D.month,time);//月

    LCD1602_Set_AC(5, 1);

    i = 0;

          send_len = 23;

    while(time[i] != '')

    {

        ch = time[i++];


        LCD1602_write_data(ch);


                    send_data[send_len++] = ch;

    }

    LCD1602_write_data('-');

                

                Int_To_Str(GPS.D.day,time);//日

    LCD1602_Set_AC(8, 1);

    i = 0;

          send_len = 26;

    while(time[i] != '')

    {

        ch = time[i++];


        LCD1602_write_data(ch);


                    send_data[send_len++] = ch;

    }

    LCD1602_write_data(',');

        

    Int_To_Str(GPS.D.hour,time);//时

    LCD1602_Set_AC(11, 1);

    i = 0;

          send_len = 29;

    while(time[i] != '')

    {

        ch = time[i++];


        LCD1602_write_data(ch);


                    send_data[send_len++] = ch;

    }

    LCD1602_write_data(':');


    Int_To_Str(GPS.D.minute,time);//分

    LCD1602_Set_AC(14, 1);

    i = 0;

          send_len = 32;

    while(time[i] != '')

    {

        ch = time[i++];


        LCD1602_write_data(ch);


                    send_data[send_len++] = ch;

    }

}



void GPS_DisplayOne(void)

{

    uchar len,ch, i;

    char info[10];


    ess_inc = 0;

//    memset(GPS_SEND_STR, 0, GPS_STR_LEN);


    if (GPS.NS == 'N')              //判断是北纬还是南纬

    {

                          if(dis_flag)

        LCD1602_DisplayChar(0, 0, 'N');

                                else

                                LCD1602_DisplayChar(0, 0, ' ');

//        GPS_SEND_STR[ess_inc ++] = 'N';

        len = 0;

        Int_To_Str(GPS.latitude_Degree,info);  //纬度


        LCD1602_Set_AC(1, 0);

        i = 0;

                    send_len = 2;

        while(info[i] != '')

        {

            ch = info[i++];

                                          if(dis_flag)

            LCD1602_write_data(ch);

                                                else

                                    LCD1602_write_data(' ');

                              send_data[send_len++] = ch;

//            GPS_SEND_STR[ess_inc ++] = ch;

            len ++;

        }

                    send_data[send_len++] = 'd';

                                if(dis_flag)

        LCD1602_write_data(0xDF);

                                else

                                 LCD1602_write_data(' ');

//        GPS_SEND_STR[ess_inc ++] = 'd';


        len ++;

        Int_To_Str(GPS.latitude_Cent,info);  //纬分

        i = 0;

        while(info[i] != '')

        {

            ch = info[i++];

                                          if(dis_flag)

            LCD1602_write_data(ch);

                                                else

                                    LCD1602_write_data(' ');

                              send_data[send_len++] = ch;

//            GPS_SEND_STR[ess_inc ++] = ch;

            len ++;

        }

                                if(dis_flag)

        LCD1602_write_data(0x27);

                                else

                                    LCD1602_write_data(' ');

//        GPS_SEND_STR[ess_inc ++] = 'm';


        Int_To_Str(GPS.latitude_Second,info);  //纬秒

        i = 0;

        while(info[i] != '')

        {

            ch = info[i++];

//            GPS_SEND_STR[ess_inc ++] = ch;

        }

//        GPS_SEND_STR[ess_inc ++] = 's';


        len ++;

        while(7 - len)

        {

            len ++;

            LCD1602_write_data(' ');

        }


    }


//    GPS_SEND_STR[ess_inc] = ',';

    ess_inc += 1;


    if (GPS.EW == 'E')                                //判断是东经还是西经

    {

                          if(dis_flag)

        LCD1602_DisplayChar(8, 0, 'E');

                                else

                                    LCD1602_write_data(' ');

//        GPS_SEND_STR[ess_inc ++] = 'E';


        len = 0;

        Int_To_Str(GPS.longitude_Degree,info);  //经度

        LCD1602_Set_AC(9, 0);

        i = 0;

                    send_len = 11;

        while(info[i] != '')

        {

            ch = info[i++];

                                          if(dis_flag)

            LCD1602_write_data(ch);

                                                else

                                    LCD1602_write_data(' ');

                              send_data[send_len++] = ch;

//            GPS_SEND_STR[ess_inc ++] = ch;

            len ++;

        }

                    send_data[send_len++] = 'd';

                                if(dis_flag)

        LCD1602_write_data(0xDF);

                                else

                                    LCD1602_write_data(' ');

//        GPS_SEND_STR[ess_inc ++] = 'd';


        len ++;


        Int_To_Str(GPS.longitude_Cent,info);  //经分

        i = 0;

        while(info[i] != '')

        {

            ch = info[i++];

                                          if(dis_flag)

            LCD1602_write_data(ch);

                                                else

                                    LCD1602_write_data(' ');

                              send_data[send_len++] = ch;

//            GPS_SEND_STR[ess_inc ++] = ch;

            len ++;

        }

                                if(dis_flag)

        LCD1602_write_data(0x27);

                                else

                                 LCD1602_write_data(' ');

//        GPS_SEND_STR[ess_inc ++] = 'm';


        Int_To_Str(GPS.longitude_Second,info);        //经秒

        i = 0;

        while(info[i] != '')

        {

            ch = info[i++];


//            GPS_SEND_STR[ess_inc ++] = ch;

        }

//        GPS_SEND_STR[ess_inc ++] = 's';


        len ++;

        while(7 - len)

        {

            len ++;

            LCD1602_write_data(' ');

        }

    }


    GPS_DispTime();


//    GPS_SEND_STR[ess_inc] = ' ';

    ess_inc += 1;


                if(sendflag==1)

                {                        

                          sendflag = 0;

                                gsm_send_englishmsg(SEND_NUMBER,send_data);//发送位置短信                                

                                delay_ms(1000);

                                delay_ms(1000);

                                LCD1602_DisplayString(0,0,'    SEND OK     '); 

                                delay_ms(1000);

                                LCD1602_DisplayString(0,0,'                '); 

                }

                

//    GPS_DispSpeed(GPS.speed, 10, 1);


//    if (GPS.D.second == 0)

//    {

//        if (GPS_Have_flag)

//        {

//            gsm_send_englishmsg(phonenum,GPS_SEND_STR);//发送位置短信

//        }

//        else

//        {

//            //gsm_send_englishmsg(phonenum,'GPS No Signal');//发送短信

//        }

//    }

}


void main(void)

{

    uchar error_num = 0;

                uint count = 0;


    GPS_EN = 0;

    GPS_rx_flag = 0;

    LCD1602_Initialize();//LCD1602显示屏初始化

    uart_init(UART_B9600);

    GPS_EN = 1;

    GPS_rx_flag = 1;

                BG = 0;

    LCD1602_DisplayString_Center(0,'GPS SCAN...');

    LCD1602_ClearLine(1);


    while(1)

    {

        if (rev_stop)   //如果接收完一行

        {

            if (GPS_RMC_Parse(RX1_Buffer, &GPS)) //解析GPRMC

            {

                RMC_YES;

                GPS_DisplayOne();          //显示GPS第一页信息

                error_num = 0;

                gps_flag = 0;

                rev_stop  = 0;

                GPS_Have_flag = 1;

……………………




进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • RS-485基础知识:处理空闲总线条件的两种常见方法

    相关电子头条文章