GPS改进后的程序,时差补偿,搜索到卫星报警
- #include "12864.h"
- #include"main.h"
- sbit reset=P1^5;
- sbit bell=P1^7;
- unsigned char numb=0; /*解包算法变量*/
- unsigned char wr_tab_start=0; /*这个变量尤其重要,当他=0时是截获GPS中的GPSMC包=1是截获成功开始把数据写入内存,=2是数据接收完毕可以进行其他操作*/
- unsigned char counter=0; /*counter是数据计数器*/
- unsigned char tab[59];/*GPSMC数据包有效长度*/
- void InitUART(void)
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFA;
- TL1 = TH1;
- PCON = 0x00;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- void UARTInterrupt(void) interrupt 4
- {
-
- if(RI)
- {
- RI = 0;
- if(wr_tab_start==0)
- {
- switch (numb){
-
- case 0:if(SBUF==0x24){numb=1;P0=0;}else {numb=0;};break;
- case 1:if(SBUF==0x47){numb=2;P0=2;}else {numb=0;}break;
- case 2:if(SBUF==0x50){numb=3;P0=4;}else {numb=0;}break;
- case 3:if(SBUF==0x52){numb=4;P0=8;}else {numb=0;}break;
- case 4:if(SBUF==0x4D){numb=5;P0=0x20;}else {numb=0;}break;
- case 5:if(SBUF==0x43){numb=6;P0=0x40;}else {numb=0;}break;
- case 6:if(SBUF==0x2C){ counter=0;wr_tab_start=1;numb=0;P0=0x80;}break;
- }
- }
- else if(wr_tab_start==1)
- {
- P0=counter;
-
- tab[counter]=SBUF;
- counter++;
-
-
- if(counter==60)
- {
- wr_tab_start=2;
- }
- }
- else
- TI = 0;
- }
- }
- void SendOneByte(unsigned char c)
- {
- SBUF = c;
- while(!TI);
- TI = 0;
- }
- void main(void)
- {
-
- unsigned char hour1,hour2,hour;
- reset=0;
- delay();
- reset=1; //复位12864
- delay40ms();
- init12864set();//进行初始化液晶屏的固定的图标符号
-
- ////////////////////以上是液晶设置,以下是显示地址设置
- InitUART();
-
- while(1)
- {
- if(wr_tab_start==2)
- {
-
- /*此处可以进行包处理,解包和数据的显示
- 令wr_tab_start=0;表示接收下一个包
-
- */
-
-
- EA=0;//开中断
- _data_mode();//在液晶上显示数据状态,A有效,V无效
-
- switch (tab[1]){
- /*各位把字符数据转换10进制*/
- case 0x30:hour1=0;break;
- case 0x31:hour1=1;break;
- case 0x32:hour1=2;break;
- case 0x33:hour1=3;break;
- case 0x34:hour1=4;break;
- case 0x35:hour1=5;break;
- case 0x36:hour1=6;break;
- case 0x37:hour1=7;break;
- case 0x38:hour1=8;break;
- case 0x39:hour1=9;break;
- }
- switch (tab[0]){
- /*十位把字符数据转换10进制*/
- case 0x30:hour2=0;break;
- case 0x31:hour2=1;break;
- case 0x32:hour2=2;break;
- }
- hour2=hour2*10;
- hour=hour2+hour1;
- switch (hour){
- /*查表得出小时数*/
- case 0 :tab[0]=0x30;tab[1]=0x38;break;
- case 1 :tab[0]=0x30;tab[1]=0x39;break;
- case 2 :tab[0]=0x31;tab[1]=0x30;break;
- case 3 :tab[0]=0x31;tab[1]=0x31;break;
- case 4 :tab[0]=0x31;tab[1]=0x32;break;
- case 5 :tab[0]=0x31;tab[1]=0x33;break;
- case 6 :tab[0]=0x31;tab[1]=0x34;break;
- case 7 :tab[0]=0x31;tab[1]=0x35;break;
- case 8 :tab[0]=0x31;tab[1]=0x36;break;
- case 9 :tab[0]=0x31;tab[1]=0x37;break;
- case 10:tab[0]=0x31;tab[1]=0x38;break;
- case 11:tab[0]=0x31;tab[1]=0x39;break;
- case 12:tab[0]=0x32;tab[1]=0x30;break;
- case 13:tab[0]=0x32;tab[1]=0x31;break;
- case 14:tab[0]=0x32;tab[1]=0x32;break;
- case 15:tab[0]=0x32;tab[1]=0x33;break;
- case 16:tab[0]=0x30;tab[1]=0x30;break;
- case 17:tab[0]=0x30;tab[1]=0x31;break;
- case 18:tab[0]=0x30;tab[1]=0x32;break;
- case 19:tab[0]=0x30;tab[1]=0x33;break;
- case 20:tab[0]=0x30;tab[1]=0x34;break;
- case 21:tab[0]=0x30;tab[1]=0x35;break;
- case 22:tab[0]=0x30;tab[1]=0x36;break;
- case 23:tab[0]=0x30;tab[1]=0x37;break;
- }
- writectrl((0x9A));///写地址
- delay4_6ms();
-
- writedate(tab[0]); //数据写入FFH
- //小时显示
- writedate(tab[1]); //数据写入FFH
- delay4_6ms();
- writectrl((0x9B));//写地址
- delay4_6ms();
-
-
- writedate(tab[2]); //数据写入FFH
- //分钟显示:
- writedate(tab[3]); //数据写入FFH
- delay4_6ms();
- writectrl((0x9C));///写地址
- delay4_6ms();
-
-
- writedate(tab[4]); //数据写入FFH
- //秒显示: ,
- writedate(tab[5]); //数据写入FFH
- delay4_6ms();
- if(0x41==tab[11])//如果卫星数据有效则进行写液晶的经纬度坐标
- {
- //////////////////////////////////////////
- bell=0;
- delay40ms(); //蜂鸣器
- delay40ms();
- bell=1;
- longitude_display();//经度显示
-
- /*以上是经度显示行,以下是纬度显示行*/
- latitude_display();//纬度显示
- ////////////////////////////////////////////////////
- }
- EA=1;//开中断
- wr_tab_start=0;
- }
- }
- }
-
- void init12864set()
- {
-
- writectrl(0x01);//DDRAM的AC计数器清零
- delay4_6ms();
-
- writectrl(0x02);//AC清零,游标到开头为之
-
- delay4_6ms();
- writectrl(0x0C);//整体显示开
-
- delay4_6ms();
- writectrl((0x80));//写汉字显示地址 DDRAM说白了就是那个你在那里显示这个汉子从第一行到第四行80H-9FH,一共32个汉子
- delay4_6ms();
- writedate(0xA3); //数据写入FFH
- //显示J经度
- writedate(0xCA); //数据写入FFH
- delay4_6ms();
- writectrl((0x81));// //写地址
- delay4_6ms();
- writedate(0xA3); //数据写入FFH
- //显示:
- writedate(0xBA); //数据写入FFH
- delay4_6ms();
-
-
- writectrl((0x88));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- writedate(0xD7); //数据写入FFH //显示W
- delay4_6ms();
- writectrl((0x89));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- //显示:
- writedate(0xBA); //数据写入FFH
- delay4_6ms();
-
- writectrl((0x90));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- writedate(0xD3); //数据写入FFH //显示S
- delay4_6ms();
- writectrl((0x91));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- //显示:
- writedate(0xBA); //数据写入FFH
- delay4_6ms();
-
- writectrl((0x98));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- writedate(0xD4); //数据写入FFH //显示T
- delay4_6ms();
- writectrl((0x99));////写地址
- delay4_6ms();
-
-
- writedate(0xA3); //数据写入FFH
- //显示:
- writedate(0xBA); //数据写入FFH
- delay4_6ms();
- /////////////////以上是固定不变的////////////////////////////////////////////////
- /////////////////以上是固定不变的////////////////////////////////////////////////
- }
- /*数据标志位,A表示数据有效V表示数据无效*/
- void _data_mode()
- {
-
- //////////数据有效为/////////////////////////
- writectrl((0x92));///写地址
- delay4_6ms();
-
-
- writedate(tab[11]); //数据写入FFH
- delay4_6ms();
- }
- /*经度显示*/
- void longitude_display()
- {
- writectrl((0x82));///写地址
- delay4_6ms();
-
-
- writedate(tab[25]); //数据写入FFH
-
- writedate(tab[26]); //数据写入FFH
- delay4_6ms();
- writectrl((0x83));//写地址
- delay4_6ms();
- //j经度
-
- writedate(tab[27]); //数据写入FFH
- //显示:
- writedate(tab[28]); //数据写入FFH
- delay4_6ms();
- writectrl((0x84));///写地址
- delay4_6ms();
-
-
- writedate(tab[29]); //数据写入FFH
- //显示: ,
- writedate(tab[30]); //数据写入FFH
- delay4_6ms();
- writectrl((0x85));///写地址
- delay4_6ms();
-
- writedate(tab[31]); //数据写入FFH
- //显示: ,
- writedate(tab[32]); //数据写入FFH //经度
- delay4_6ms();
- writectrl((0x86));///写地址
- delay4_6ms();
-
- writedate(tab[33]); //数据写入FFH
- delay4_6ms(); //显示: ,
- writedate(tab[34]); //数据写入FFH
- delay4_6ms();
- writectrl((0x87));///写地址
- delay4_6ms();
-
- writedate(tab[35]); //数据写入FFH
- writedate(tab[36]); //数据写入FFH
- delay4_6ms();
- }
- /*纬度在液晶上的显示*/
- void latitude_display()
- {
-
-
- writectrl((0x8A));//写地址
- delay4_6ms();
-
- writedate(tab[13]); //数据写入FFH
- //纬度的“度”
- writedate(tab[14]); //数据写入FFH
- delay4_6ms(); //纬度
- writectrl((0x8B));////写地址
- delay4_6ms();
- writedate(tab[15]); //数据写入FFH
- //纬度的“分”
- writedate(tab[16]); //数据写入FFH
- delay4_6ms();
- writectrl((0x8C));////写地址
- delay4_6ms();
-
- writedate(tab[17]); //数据写入FFH //纬度的“秒”
- writedate(tab[18]); //数据写入FFH
- delay4_6ms();
- writectrl((0x8D));////写地址
- delay4_6ms();
-
- writedate(tab[19]); //数据写入FFH
- //纬度的“分”
- writedate(tab[20]); //数据写入FFH
- delay4_6ms();
- writectrl((0x8E));////写地址
- delay4_6ms();
-
-
- writedate(tab[21]); //数据写入FFH
- //纬度的“秒” //纬度
- writedate(tab[22]); //数据写入FFH
-
- delay4_6ms();
- writectrl((0x8F));////写地址
- delay4_6ms();
-
- writedate(tab[23]); //数据写入FFH
- writedate(tab[24]); //数据写入FFH
-
- delay4_6ms();
- }
- 12864.c
- #include"12864.h"
- void delay40ms(void) //误差 -0.000000000009us
- {
- unsigned char ad,bd,cd;
- for(cd=11;cd>0;cd--)
- for(bd=124;bd>0;bd--)
- for(ad=12;ad>0;ad--);
- }
- void delay4_6ms()//
- {
- unsigned char av,bv;
- for(bv=12;bv>0;bv--)
- for(av=175;av>0;av--);
- }
- void delay(void)
- {
- ;;;
- }
- void writedate(unsigned char a)//写数据
- {
-
-
-
- delay4_6ms();
- rs=1;
- delay();
- rw=0;
- delay();
- e=1;
- delay();
- P0=a;
-
-
-
- delay();
- e=0;
- delay();
-
-
- }
- void writectrl(unsigned char ds)//写指令
- {
- rs=0;
- delay();
- rw=0;
- delay();
- e=1;
- delay();
- P0=ds;
- delay();
- e=0;
- delay();
-
- }
复制代码 |