|
以51單片機(jī)為主控制器,LCD1602顯示,通過(guò)GPS定位模塊收發(fā)信息,在LCD上顯示經(jīng)緯度。
還加了溫濕度DHT11模塊,可以在經(jīng)緯度旁邊顯示溫濕度。
實(shí)物圖:
IMG_20171221_112137.jpg (2.06 MB, 下載次數(shù): 83)
下載附件
2017-12-21 12:18 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #include "delay.h"
- #include "1602.h"
- /**The UART1 stage1**/
- #define STAGE_SOHE 0x01
- #define STAGE_TYPE 0x02
- #define STAGE_NONE 0x03
- #define STAGE_DATA 0x04
- unsigned char Lin0_No[16]="N:000.000000 ";//顯示北緯
- unsigned char Lin1_Ea[16]="E:000.000000 ";//顯示東經(jīng)
- unsigned long xdata time_20ms=0;
- unsigned char xdata devide_flag; //GPS數(shù)據(jù)逗號(hào)分隔符
- unsigned char xdata speed_end; //收速度數(shù)據(jù)結(jié)束標(biāo)志
- unsigned char xdata dir_end; //收方向角數(shù)據(jù)結(jié)束標(biāo)志
- unsigned char xdata sysmode_GPS=0; //gps有效無(wú)效標(biāo)志
- unsigned char xdata ew_flag; //東西標(biāo)志
- unsigned char xdata ns_flag; //南北標(biāo)志
- unsigned char xdata gps_infor_weijing[17]; //暫存經(jīng)緯度 格式是以度分秒的是形式
- unsigned char xdata gps_infor_speed[4]; //暫存速率
- unsigned char xdata gps_infor_time[6]; //時(shí)間暫存
- unsigned char xdata gps_infor_date[6]; //日期暫存
- unsigned char xdata gps_infor_dir[3]; //方向暫存
- unsigned char xdata recv1_step=STAGE_SOHE; //串口1接收指令步驟
- unsigned char xdata uart1_r_buf; //串口的緩存
- unsigned char xdata rev1_buf_busy; //串口接收忙碌標(biāo)志
- unsigned char xdata temp1_buf[85]; //串口接收數(shù)組
- unsigned int xdata record1=0;
- unsigned char times = 0; //延時(shí)計(jì)數(shù)
- void Init_Timer0(void);//定時(shí)器初始化
- void UART_Init(void);
- void main (void)
- {
- unsigned char num=0;
- unsigned long Mid_Du; //中間變量 暫存經(jīng)緯度的整數(shù)部分 即度
- unsigned long Mid_Fen; //中間變量 暫存經(jīng)緯度的小數(shù)部分 即分 gps原始數(shù)據(jù)是度分秒格式
- unsigned long Mid_Vale; ////中間變量 暫存經(jīng)緯度 并將其擴(kuò)大了10000000倍
- unsigned char i ;
- Init_Timer0(); //定時(shí)器0初始化
-
- UART_Init();
-
- LCD_Init(); //初始化液晶
- DelayMs(20); //延時(shí)有助于穩(wěn)定
- LCD_Clear(); //清屏
- DelayMs(120);
- while(1) //主循環(huán)
- {
- if(sysmode_GPS==1) //檢測(cè)gps是否有效數(shù)據(jù)
- {
- sysmode_GPS=0; //清除有效位
- times = 0; //防止gps數(shù)據(jù)未更新就誤判斷數(shù)據(jù)無(wú)效
- Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000; //處理緯度 暫存整數(shù)部分?jǐn)U大10000000
-
- Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+
- (gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+
- (gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100; //處理緯度 暫存小數(shù)部分?jǐn)U大10000000
- Mid_Fen=Mid_Fen/60; //分秒換算為小數(shù)位
- Mid_Vale=Mid_Du+Mid_Fen; //最終緯度 格式為000.00000000 非度分秒格式
- Lin0_No[0]='N';
- Lin0_No[1]=':';
- Lin0_No[2]='0';
- Lin0_No[3]=Mid_Vale/10000000+0x30; //將處理后的緯度填入字符串 并打印顯示
- Lin0_No[4]=(Mid_Vale/1000000)%10+0x30;
- Lin0_No[5]='.';
- Lin0_No[6]=(Mid_Vale/100000)%10+0x30;
- Lin0_No[7]=(Mid_Vale/10000)%10+0x30;
- Lin0_No[8]=(Mid_Vale/1000)%10+0x30;
- Lin0_No[9]=(Mid_Vale/100)%10+0x30;
- Lin0_No[10]=(Mid_Vale/10)%10+0x30;
- Lin0_No[11]=Mid_Vale%10+0x30;
-
- Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //處理經(jīng)度 暫存整數(shù)部分?jǐn)U大10000000
-
- Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+
- (gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+
- (gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; //處理經(jīng)度 暫存小數(shù)部分?jǐn)U大10000000
- Mid_Fen=Mid_Fen/60; //分秒換算為小數(shù)位
- Mid_Vale=Mid_Du+Mid_Fen; //最終經(jīng)度 格式為000.00000000 非度分秒格式
- Lin1_Ea[0]='E';
- Lin1_Ea[1]=':';
- Lin1_Ea[2]=Mid_Vale/100000000+0x30; //將處理后的經(jīng)度填入字符串 并打印顯示
- Lin1_Ea[3]=(Mid_Vale/10000000)%10+0x30;
- Lin1_Ea[4]=(Mid_Vale/1000000)%10+0x30;
- Lin1_Ea[5]='.';
- Lin1_Ea[6]=(Mid_Vale/100000)%10+0x30;
- Lin1_Ea[7]=(Mid_Vale/10000)%10+0x30;
- Lin1_Ea[8]=(Mid_Vale/1000)%10+0x30;
- Lin1_Ea[9]=(Mid_Vale/100)%10+0x30;
- Lin1_Ea[10]=(Mid_Vale/10)%10+0x30;
- Lin1_Ea[11]=Mid_Vale%10+0x30;
-
- }
- else
- {
- times++;
- if(times>4) //防止gps數(shù)據(jù)未更新就誤判斷數(shù)據(jù)無(wú)效
- {
- times = 0; //清零計(jì)數(shù)
- Lin1_Ea[0]='G'; //無(wú)gps信號(hào)情況下 打印正在連接
- Lin1_Ea[1]='P';
- Lin1_Ea[2]='S';
- Lin1_Ea[3]=' '; //將處理后的緯度填入字符串 并打印顯示
- Lin1_Ea[4]='L';
- Lin1_Ea[5]='I';
- Lin1_Ea[6]='N';
- Lin1_Ea[7]='K';
- Lin1_Ea[8]='I';
- Lin1_Ea[9]='N';
- Lin1_Ea[10]='G';
- Lin1_Ea[11]='.';
- for(i=0;i<12;i++) //數(shù)組重新填充
- {
- Lin0_No[i]=Lin1_Ea[i];
- }
- }
- }
- LCD_Write_String(0,0,Lin0_No);//顯示第一行
- LCD_Write_String(0,1,Lin1_Ea);//顯示第二行
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開(kāi)
- ET0=1; //定時(shí)器中斷打開(kāi)
- TR0=1; //定時(shí)器開(kāi)關(guān)打開(kāi)
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- time_20ms++;
- }
- void UART_Init(void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
- TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
- TR1 = 1; // TR1: timer 1 打開(kāi)
- EA = 1; //打開(kāi)總中斷
- ES = 1; //打開(kāi)串口中斷
- }
- void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序
- {
- if(RI) //判斷是接收中斷產(chǎn)生
- {
- RI=0; //標(biāo)志位清零
- uart1_r_buf=SBUF; //提取buf中的值
- rev1_buf_busy=0x00; //判別 放置break問(wèn)題
- switch(recv1_step)
- {
- case STAGE_SOHE: if(uart1_r_buf == '') //判斷接收到了 具體原因參考GPS標(biāo)準(zhǔn)協(xié)議NMEA0183
- {
- rev1_buf_busy=0x01;
- if(uart1_r_buf == '') //再次查看接收的是否是
- {
- recv1_step=STAGE_TYPE; //跳轉(zhuǎn)到下一步
- record1=0; //計(jì)數(shù)清零
- }
- else
- {
- recv1_step=STAGE_SOHE; //恢復(fù)初始化
- record1=0;
- }
- }
- break;
- case STAGE_TYPE: if(rev1_buf_busy == 0x00)
- {
- rev1_buf_busy=0x01;
- temp1_buf[record1]=uart1_r_buf;
- record1++;
- if(record1 == 0x05)
- { //查看$GPRMC開(kāi)頭的命令行
- if((temp1_buf[0] == 'G') && (temp1_buf[1] == 'P') && (temp1_buf[2] == 'R') && (temp1_buf[3] == 'M') && (temp1_buf[4] == 'C'))
- {
- recv1_step=STAGE_NONE; //跳轉(zhuǎn)到下一步
- record1=0;
- }
- else
- {
- recv1_step=STAGE_SOHE;//恢復(fù)初始化
- record1=0;
- }
- }
- }
- break;
- case STAGE_NONE: if(rev1_buf_busy == 0x00)//接收命令格式:$GPRMC,054347.00,A,3202.04770,N,11846.23632,E,0.000,0.00,221013,,,A*67
- {
- rev1_buf_busy=0x01;
- record1++;
- if((record1 > 0x01) && (record1 < 0x08))
- {
- gps_infor_time[record1-2]=uart1_r_buf; //時(shí)間存儲(chǔ)
- }
- if((uart1_r_buf == ',') && (record1 > 0x07) && (record1 < 0x010)) //||((uart1_r_buf == ',') && (record1==0x02))
- {
- record1=0xcc;
- }
- if(record1 == 0xcd)
- {
- record1=0;
- devide_flag=2;
- speed_end=0x00;
- dir_end=0x00;
- if(uart1_r_buf == 'A') //gps收到數(shù)據(jù) 且有效
- {
- recv1_step=STAGE_DATA; //跳轉(zhuǎn)到下一步
- }
- else
- {
- sysmode_GPS=0;
- recv1_step=STAGE_SOHE; //無(wú)效恢復(fù)初始化
- record1=0;
- }
- }
- }
- break;
- case STAGE_DATA: if(rev1_buf_busy == 0x00)
- {
- rev1_buf_busy=0x01;
- record1++;
- if(uart1_r_buf == ',') //判斷逗號(hào)
- {
- devide_flag++; //逗號(hào)次數(shù)記錄
- record1=0;
- }
- if(devide_flag == 3)
- {
- if((record1 > 0) && (record1 < 5))
- {
- gps_infor_weijing[record1-1]=uart1_r_buf; //存儲(chǔ)經(jīng)緯度 此處為緯度
- }
- if((record1 > 5) && (record1 < 10)) //跳過(guò)小數(shù)點(diǎn)的存儲(chǔ)
- {
- gps_infor_weijing[record1-2]=uart1_r_buf; //存儲(chǔ)經(jīng)緯度 此處為緯度
- }
- }
- if(devide_flag == 4)
- {
- if(record1 > 0)
- {
- ns_flag=uart1_r_buf; //接收緯度NS標(biāo)志
- }
- }
- if(devide_flag == 5)
- {
- if((record1 > 0) && (record1 < 6))
- {
- gps_infor_weijing[record1+7]=uart1_r_buf; //存儲(chǔ)經(jīng)緯度 此處為緯度
- }
- if((record1 > 6) && (record1 < 11)) //跳過(guò)小數(shù)點(diǎn)的存儲(chǔ)
- {
- gps_infor_weijing[record1+6]=uart1_r_buf; //存儲(chǔ)經(jīng)緯度 此處為經(jīng)度
- }
- }
- if(devide_flag == 6)
- {
- if(record1 > 0)
- {
- ew_flag=uart1_r_buf; //經(jīng)度度 EW標(biāo)志
- }
- }
- if(devide_flag == 7)
- {
- if(speed_end == 0x00)
- {
- if((record1 > 0) && (uart1_r_buf != '.'))
- {
- gps_infor_speed[record1-1]=uart1_r_buf; //接收速率
- }
- else if(uart1_r_buf == '.')
- {
- record1--;
- speed_end=0xff;
- }
- }
- else if(speed_end == 0xff)
- {
- speed_end=0xfe;
- gps_infor_speed[record1-1]=uart1_r_buf;
- gps_infor_speed[3]=gps_infor_speed[record1-1];
- gps_infor_speed[2]=gps_infor_speed[record1-2];
- if(record1 > 2)
- {
- gps_infor_speed[1]=gps_infor_speed[record1-3];
- }
- else
- {
- gps_infor_speed[1]=0x30;
- }
- if(record1 > 3)
- {
- gps_infor_speed[0]=gps_infor_speed[record1-4];
- }
- else
- {
- gps_infor_speed[0]=0x30;
- }
- }
- }
- if(devide_flag == 8)
- {
- if(dir_end == 0x00)
- {
- if((record1 > 0) && (uart1_r_buf != '.'))
- {
- gps_infor_dir[record1-1]=uart1_r_buf; //存儲(chǔ)方向
- }
- else if(uart1_r_buf == '.')
- {
- record1--;
- dir_end=0xff;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (10.87 KB, 下載次數(shù): 84)
下載附件
2017-12-21 16:21 上傳
所有資料51hei提供下載:
程序.rar
(71.15 KB, 下載次數(shù): 122)
2017-12-21 12:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|