?? stc串口gps.c
字號:
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define isp_iap_byte_read 0x1;
#define isp_iap_byte_program 0x2;
#define isp_iap_sector_erase 0x3;
#define wait_time 0x1;
sbit p00=P0^0;
sbit p01=P0^1;
sbit p02=P0^2;
sbit p03=P0^3;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sfr AUXR=0x8e;
char epsjh[12];
struct pprec{
char jid[9];
char wed[10];
}rrrec,gpst[26];
char code chushu[3]={100,10,1};
char xdata recive[256]="1234567890";
char code isp1[3][3]={"130","131","133"};
char code isp2[7][3]={"132","134","136","135","137","138","139"};
char xdata gpswz[2][11]={"111111","22222"};
char code hanzi[2][8]={"weidu:","jingdu:"};
//char recive[256]={0x25,0x24,0x47,0x50,0x47,0x47,0x41,0x2C,0x30,0x37,0x32,0x32,0x35,0x38,0x2E,0x35,0x35,0x35,0x2C,0x33,0x36,0x33,0x38,0x2E,0x36,0x37,0x31,0x36,0x2C,0x4E,0x2C,0x31,0x31,0x34,0x32,0x39,0x2E,0x31,0x31,0x31,0x31,0x2C,0x45,0x2C,0x31,0x2C,0x30,0x35,0x2C,0x32,0x2E,0x34,0x2C,0x37,0x30,0x2E,0x39,0x2C};
uchar recilen;
void clearrecive();
void fhxinxi();
void fhxxgps();
void yizhensjh(char *quanxian,char *abc);
int duanxinpos;
char duanxinwz;//短信位置位數(例:2位數,3位數)
char xdata sjh[11],duanxin[100];
long miof10;//10的冪
char quanxian;//手機號的操作權限
int sji;//讀取手機號短信時的循環變量
uchar stapos;//+CMGL:位置
uchar duanxinp[9];//保存查詢未讀短信的位置,以便處理完后刪除
uchar dxccwz;
uchar duanxinpi;
char dxlist[42];//返回查看當前手機注冊名單
int duanxinp1;//查找+GML:結果
int duanxinp2;//查找結束結果
char listemp;
int searchstr(int start);
int searchstr2(int start);
int findend(int start);
void searchstrpos(char * arr,int start,char searh,int *reult);
void duanxinzx();
void duanxinlist(char *liss);
void duanxinedit(char *liss);
void duanxindel(char *liss);
int findpos;
char code caozuo[4][4]={"list","edit","dele","posi"};
char code mark[6]={0x0D,0x0A,0x4F,0x4B,0x0D,0x0A};
char code recistart[7]={0x2B,0x43,0x4D,0x47,0x4C,0x3A,0x20};
uchar reciok;
char code gpsdata[7]="$GPGGA,";
char code *text[5]={"at+cmgf=1",
"at+cmgs=",
"test,OK!!",
"at+cmgl",
"at+cmgd="
};
void ss_gpsstore(){
char gpst_sqs,gpst_star;
uint pp,qq;
uint dxy,dxc,dxk;
uchar d_h,d_l;
gpst_sqs=1;
gpst_star=6;
EA=0;
for(dxy=2;dxy>0;dxy--){
//讀取
d_h=0x80+8+(dxy-1)*2;
d_l=0x00;
pp=0x00;
pp=pp | d_h;
pp=pp<<8;
pp=pp | d_l;
for(dxc=0;dxc<26;dxc++){
for (dxk=0;dxk<9;dxk++){
qq=pp+dxc*19+dxk;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_read;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
listemp=ISP_DATA;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
gpst[dxc].jid[dxk]=listemp;
}
for (dxk=0;dxk<10;dxk++){
qq=pp+dxc*19+dxk+9;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_read;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
listemp=ISP_DATA;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
gpst[dxc].wed[dxk]=listemp;
}
//讀取
}
////擦除
d_h=0x80+8+(dxy-1)*2;
d_l=0x00;
pp=0x00;
pp=pp | d_h;
pp=pp<<8;
pp=pp | d_l;
for (dxk=0;dxk<510;dxk++){
qq=pp+dxk;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_sector_erase;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
}
//擦除
for(dxc=25;dxc>0;dxc--){
gpst[dxc]=gpst[dxc-1];
}
//讀取上一個扇區最后一個數據
if (dxy>1){
d_h=0x80+8+(dxy-1-1)*2;
d_l=0x00;
pp=0x00;
pp=pp | d_h;
pp=pp<<8;
pp=pp | d_l;
for (dxk=0;dxk<9;dxk++){
qq=pp+dxk +25*19;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_read;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
listemp=ISP_DATA;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
gpst[0].jid[dxk]=listemp;
}
for (dxk=0;dxk<10;dxk++){
qq=pp+dxk +25*19+9;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_read;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
listemp=ISP_DATA;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
gpst[0].wed[dxk]=listemp;
}
}
else{
for (dxc=0;dxc<2;dxc++)
{
gpst_star=(dxc)?10:9;
for(dxk = 0; dxk<gpst_star; dxk++) //
{
if(dxc==0) gpst[0].jid[dxk]=gpswz[dxc][dxk];
else gpst[0].wed[dxk]=gpswz[dxc][dxk];
}
}
}
//讀取上一個扇區最后一個數據
d_h=0x80+8+(dxy-1)*2;
d_l=0x00;
pp=0x00;
pp=pp | d_h;
pp=pp<<8;
pp=pp | d_l;
for(dxc=0;dxc<26;dxc++){
//入寫
for (dxk=0;dxk<9;dxk++){
ISP_DATA=gpst[dxc].jid[dxk];
qq=pp+dxc*19+dxk;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_program;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
}
for (dxk=0;dxk<10;dxk++){
ISP_DATA=gpst[dxc].wed[dxk];
qq=pp+dxc*19+dxk+9;
ISP_ADDRL=qq;
qq=qq>>8;
ISP_ADDRH=qq;
EA=0;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_byte_program;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
}
//入寫
}
}
EA=1;
}
/*
char checkisp(){
uchar cci,cck,ccrslt;
for(cci=0;cci<3;cci++){
ccrslt=1;
for (cck=0;cck<3;cck++){
if(sjh[cck]!=isp1[cci][cck]) {
ccrslt=0;
break;
}
}
if (ccrslt){
return(0x11);
}
}
for(cci=0;cci<3;cci++){
ccrslt=1;
for (cck=0;cck<3;cck++){
if(sjh[cck]!=isp1[cci][cck]) {
ccrslt=0;
break;
}
}
if (ccrslt){
return(0x11);
}
}
for(cci=0;cci<7;cci++){
ccrslt=1;
for (cck=0;cck<3;cck++){
if(sjh[cck]!=isp2[cci][cck]) {
ccrslt=0;
break;
}
}
if (ccrslt){
return(0x22);
}
}
return(0x0);
}
*/
void fhxxgps(){
char *po;
uchar flength;
int fi,fcc;
p20=0x0;
for (fi=0;fi<40;fi++)
{
for (fcc=0;fcc<10000;fcc++){
}
}
p20=0xff;
//po=recive;
//flength = strlen(po);
//SBUF = flength;
// while (TI==0); //等待發送中斷標志位置位
// TI = 0;
//for(fi = 0; fi<45; fi++) //依次發送待合成的文本數據
//{ SBUF = *po;
// while (TI == 0) ;
// TI = 0;
// po++;
//}
//SBUF = 0x0d;
//while (TI==0); //等待發送中斷標志位置位
//TI = 0; //發送中斷標志位清零
for (fi=0;fi<2;fi++)
{
po=hanzi[fi];
flength = strlen(po);
for(fcc = 0; fcc<flength; fcc++) //依次發送待合成的文本數據
{ SBUF = *po;
while (TI == 0) ;
TI = 0;
po++;
}
po=gpswz[fi];
flength = strlen(po);
for(fcc = 0; fcc<flength; fcc++) //依次發送待合成的文本數據
{ SBUF = *po;
while (TI == 0) ;
TI = 0;
po++;
}
SBUF = 0x2c;
while (TI==0); //等待發送中斷標志位置位
TI = 0; //發送中斷標志位清零
}
for (fi=0;fi<40;fi++)
{
for (fcc=0;fcc<10000;fcc++){
}
}
}
void duanxinposi(char *liss){
char dxi,dxk,flength;
char *po;
strcpy(liss,"");
for (dxi=0;dxi<2;dxi++)
{
po=hanzi[dxi];
flength = strlen(po);
for(dxk = 0; dxk<flength; dxk++) //依次發送待合成的文本數據
{
*(liss++) = *po;
po++;
}
po=gpswz[dxi];
flength = strlen(po);
for(dxk = 0; dxk<flength; dxk++) //依次發送待合成的文本數據
{
*(liss++) = *po;
po++;
}
*(liss++) = 0x2c;
}
*(liss++) = 0x00;
}
void duanxindel(char *liss){
char dxp,dxz,dxp1,dxy;
char length;
char *p;
char *rrr[2]={"dele:error!","dele:OK!"};
strcpy(liss,"");
dxp=strpos(duanxin,':');
dxz=duanxin[dxp+1]-0x30-0x1;
dxp1=strpos(duanxin,'#');
if (dxp1<=0){
//返回錯誤信息
p=rrr[0];
length = strlen(p);
TR1 = 1; //定時器1用作波特率發生
for(dxy = 0; dxy<length; dxy++) //依次發送待合成的文本數據
{ //SBUF = *p;
//while (TI == 0) ;
//TI = 0;
*(liss++)=*p;
p++;
}
}
else{//執行修改指令
//擦除
EA=0;
for(dxy=0;dxy<11;dxy++){
ISP_ADDRH=0x80+dxz*2;
ISP_ADDRL=dxy;
ISP_CONTR=0x81;
ISP_CMD=isp_iap_sector_erase;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
}
//擦除
ISP_CONTR=0x0;
ISP_CMD=0x0;
EA=1;
//返回修改正確信息
p=rrr[1];
length = strlen(p);
for(dxy = 0; dxy<length; dxy++) //依次發送待合成的文本數據
{ //SBUF = *p;
//while (TI == 0) ;
//TI = 0;
*(liss++)=*p;
p++;
}
}
}
void duanxinedit(char *liss){
char dxp,dxz,dxu,dxp1,dxy;
char length;
char *p;
char *rrr[2]={"edit:error!","edit:OK!"};
strcpy(liss,"");
dxp=strpos(duanxin,':');
dxz=duanxin[dxp+1]-0x30-0x1;
dxp=strpos(duanxin,',');
dxp1=strpos(duanxin,'#');
if ((dxp1-dxp)!=12){
//返回錯誤信息
p=rrr[0];
length = strlen(p);
for(dxy = 0; dxy<length; dxy++) //依次發送待合成的文本數據
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -