📄 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 + -