?? gsm_gps1.c
字號:
/*
去掉溫度部分
調試GPS
*/
#include<reg52.h>
#include<stdio.h>
#icclude<stdlib.h>
#include<string.h>
#include<intrins.h>
#include<syslib.h>
#define uchar unsigned char
#define uint unsigned int
//#define x 0x80 //LCD...........
//#define y 0x80
#define comm 0
#define dat 1
#define EnTimer0 TL0=TH0;TR0=1;
#define DsTimer0 TR0=0;
#define F_TM F0
sbit cs =P0^3;
sbit std=P0^2;
sbit sclk=P0^1;
sbit rst=P0^0;
//sbit psb=P0^4;
sbit BT_REC=P1^2; //模擬串口讀取GPS數據
sbit StartGSM=P1^5;
sbit RELAY1=P1^3; //繼電器........
sbit RELAY2=P1^4;
sbit Infrared=P1^7;
/*-------------------函數、變量定義-----------------------------------*/
//bit GPS_Flag;
bit GPS_RF;
bit AlarmSF=0;
bit AlarmSF1=0;
bit RT_SK_Flag;
bit URAT_Flag;
bit NewSMS_Flag;
uchar AlarmMode=0;
uchar SetMode=0;
uchar keyPtr;
uint keyFlag;
uint timer;
//void Init_Serial(void);
uchar idata Phone[]="00000000000"; //短信號碼
uchar idata Back_Phone[]="00000000000";
uchar idata sms_rec[70]={0};
uchar rsPoint;
uchar idata gps_rec[]={0};
uchar rsPoint1;
void Start_System(void);
//void delay (uint us);
void delay1(uint ms);
void delay2(uint us);
void Infrared_Monitor(void);
void Init_lcd(void);
void clrram(void);
void Sleep_ON(void);
void Sleep_OFF(void);
void int_disp1(uchar datah ,uchar p);
void chn_disp1(uchar code *chn,uchar h,uchar l,uchar p);
void chn_disp2(uchar code *chn,uchar h,uchar l,uchar p);
void Char_Display(uchar disdata,uchar p);
void ScanKeys(void); //鍵盤掃描
uchar KeyJudge(void); //按鍵預處理
void KeyHandle(uchar keyIndex); //按鍵處理模塊
void Key_Enter(void);
void Key_ReadSMS(void);
void Key_DeleteSMS(void);
void Clr_Str(uchar *p); //清除接收緩沖區
void Key_SetAlarmMode(void);
void Key_DispCH(void);
void Signal_Test(void);
void Init_GSM(uchar mode);
void GSM_WTD(void);
void Call(void);
void Cancel(void);
void Ring_Display(void);
void NewSMS_Read(void);
void Send_SMS2(uchar *p);
void AlarmPhone_Set(void);
void Face_Disp(void); //系統界面顯示
//void GPS_Read(void);
void GPS_Handle(void);
void Time_Disp(void);
void JDWD_Disp(void);
//-----------------------GPS-------------------------
uchar Disp_Mode;
uchar JD[10]; //經度10
uchar JD_a; //經度方向1
uchar WD[9]; //緯度9
uchar WD_a; //緯度方向1
uchar idata time[6]; //時間6
uchar speed[]; //速度5
uchar high[]; //高度6
//uchar angle[]; //方位角5
uchar idata use_sat[2]={0}; //使用的衛星數2
//uchar total_sat[]; //天空中總衛星數2
uchar lock; //定位狀態1
//模擬串口中斷需要的變量
uchar seg_count; //逗號計數器
uchar dot_count; //小數點計數器
uchar byte_count; //位數計數器
uchar cmd_number; //命令類型
uchar mode; //0:結束模式,1:命令模式,2:數據模式
uchar buf_full; //1:整句接收完成,相應數據有效。0:緩存數據無效。
uchar cmd[5]; //命令類型存儲數組5
//---------------------------------------------------
/*------------------------------------------------------------------*/
uchar code tab1[]={
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
//------------------------------------------------------------------
//------------------外部中斷0,按鍵處理------------------
void Int0(void)interrupt 0
{
//uchar keyPtr;
keyPtr=KeyJudge(); //鍵盤掃描判斷
if(keyPtr!=0x55) //如果有鍵按下則處理
{
KeyHandle(keyPtr);
}
}
//------------------定時器0------------------------------
void Timer0(void)interrupt 1
{
F_TM=1;
}
//--------------外部中斷1--------------------------
void Int1(void)interrupt 2
{
}
//-------------- 定時器1,50ms中斷-----------------
void Timer1(void)interrupt 3
{
TR1=0;
RT_SK_Flag=1;
TH1=0X8a; //重裝初始值20ms
TL1=0Xd0;
TR1=1;
}
//-------------------串行口程序-------------------------------------
void Init_Serial(void) //串口初始化,9600bit/s(FFDC),方式1
{
SCON=0X50;
TCLK=1;
RCLK=1;
C_T2=0;
RCAP2H=0XFF;
RCAP2L=0XB8;
ES=1;
TR2=1;
}
void Serial(void)interrupt 4 //串口自動接收程序
{
EA=0;
while(!RI);
RI=0;
sms_rec[rsPoint++]=SBUF;
if(rsPoint>3)
{
URAT_Flag=1;
if(rsPoint>100)
{
rsPoint=0;
}
}
EA=1;
/* EA=0;
//GPS_RF=1;
GPS_Handle();
EA=1; */
}
//----------------IO模擬串口接受數據程序------------
uchar GPS_GetChar(void)
{
uchar rch,ii;
//EnTimer0;
TR0=1;
F_TM=0;
ii=0;
rch=0;
while(!F_TM); //等過起始位
while(ii<8)
{
rch>>=1;
if(BT_REC)
{
rch|=0x80;
}
ii++;
F_TM=0;
while(!F_TM);
}
F_TM=0;
while(!F_TM)
{
if(BT_REC) //結束位
{
break;
}
}
//DsTimer0;
TR0=0;
return rch;
}
//-------------檢查起始位---------------------------
bit StartBitOn()
{
return(BT_REC==0);
}
//------------------紅外監控程序-------------------------
void Infrared_Monitor(void)
{
//if(AlarmMode)
//{
if(Infrared)
{
delay1(1000);
if(Infrared)
{
chn_disp2("紅外報警",0,8,0x92);
// delay1(500);
if(AlarmSF1==0)
{
uchar i;
for(i=0;i<3;i++)
{
RELAY2=0;
delay1(100);
RELAY2=1;
delay1(100);
}
//-------報警方式判斷-------
if(AlarmMode==1)
{
Send_SMS2("HW Alarm!!");
}
if(AlarmMode==2)
{
Call();
}
//---------------------------------
AlarmSF1=1;
//Infrared=0;
}
}
}
else
{AlarmSF1=0;}
//}
}
//----------報警號碼設定程序-----------------------------
void AlarmPhone_Set(void)
{
uchar i,j,k;
uchar *p;
if(p=strstr(sms_rec,"set "))
{
k=strcspn(sms_rec,"set");
k+=4;
for(i=0;i<11;i++)
{
Back_Phone[i]=sms_rec[k++];
}
}
else
{
j=strcspn(sms_rec,"set");
j+=3;
for(i=0;i<11;i++)
{
Back_Phone[i]=sms_rec[j++];
}
}
strcpy(Phone,Back_Phone);
}
//-------------------按鍵子程序--------------------------
void ScanKeys(void) //掃描鍵盤模塊
{
uchar scanValue=0xfe; //定義掃描初始值
uchar iScan,scanTempUchar;
for(iScan=0;iScan<4;iScan++)
{
P2=scanValue; //發送掃描值
scanTempUchar=P2; //讀入掃描值
if((scanTempUchar&0x10)==0x00) //第1列被按
{
keyFlag|=(0x0001<<(iScan*4+0)); //置此鍵的標志位
}
else
{
keyFlag&=~(0x0001<<(iScan*4+0)); //清除此鍵的標志位
}
if((scanTempUchar&0x20)==0x00) //第2列被按
{
keyFlag|=(0x0001<<(iScan*4+1));
}
else
{
keyFlag&=~(0x0001<<(iScan*4+1));
}
if((scanTempUchar&0x40)==0x00) //第3列被按
{
keyFlag|=(0x0001<<(iScan*4+2));
}
else
{
keyFlag&=~(0x0001<<(iScan*4+2));
}
if((scanTempUchar&0x80)==0x00) //第4列被按
{
keyFlag|=(0x0001<<(iScan*4+3));
}
else
{
keyFlag&=~(0x0001<<(iScan*4+3));
}
scanValue=scanValue<<1|0x01; //置下一次掃描值
}
}
uchar KeyJudge(void) //按鍵預處理
{
uchar j,counterKeyPressedNum;
uchar keyRet=0x55; //初始化按鍵返回碼設定為無按碼0x55
uint uintTemp;
ScanKeys();
if(keyFlag!=0)
{
delay1(10); //延時消除抖動
ScanKeys();
P2=0x0f;
while((P1&0x0f)!=0x0f); //等待按鍵松開
counterKeyPressedNum=0;
for(j=0;j<16;j++)
{
uintTemp=((uint)0x0001)<<j;
if((keyFlag&uintTemp)==uintTemp)
{
counterKeyPressedNum++;
keyRet=j;
}
}
if(counterKeyPressedNum>1)
{
return 0x55;
}
else
{
return(keyRet);
}
}
return(0x55);
}
void KeyHandle(uchar keyIndex)
{
switch(keyIndex)
{
case 0:
Key_DeleteSMS();
break;
case 1:
Char_Display(1,0x83);
break;
case 2:
Signal_Test();
break;
case 3:
Clr_Str(sms_rec);
chn_disp2("清除緩沖區..",0,12,0x81);
delay1(500);
clrram();
break;
case 4:
Key_ReadSMS();
break;
case 5:
Key_DispCH();
break;
case 6:
Char_Display(6,0x83);
break;
case 7:
Char_Display(7,0x83);
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
Key_SetAlarmMode();
break;
case 12:
break;
case 13:
Send_SMS2("GPS ALARM");
break;
case 14:
Call();
break;
case 15:
Cancel();
break;
default: break ;
}
}
/***************************LCD顯示子程序**********************/
void wr_lcd (uchar dat_comm,uchar content);
/*------------------初始化-----------------*/
void Init_lcd (void)
{
rst=1;
// psb=0;
wr_lcd (comm,0x30); /*30---基本指令動作*/
wr_lcd (comm,0x01); /*清屏,地址指針指向00H*/
delay2 (80);
wr_lcd (comm,0x06); /*光標的移動方向*/
wr_lcd (comm,0x0c); /*開顯示,關游標*/
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
delay2 (80);
}
/*---------------------------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay2 (40);
a=content;
cs=1;
sclk=0;
std=1;
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1; //data
else
std=0; //command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -