GPS OEM板+单片机+液晶显示
扫描二维码
随时随地手机看文章
我所做的是GPS+单片机+液晶显示,板上晶振是11.5902Mhz,硬件连接是用Garmin25的NEMA端口经RS232转为TTL电平给89C51的10脚(RXD)
我有个问题,就是现在执行程序后不能进入串行口中断,
附程序如下:
/*************************************中断程序*****************************/
//定时器0中断函数,用于控制背光灯延时10s熄灭
void int_t0() interrupt 1 using 1
{
TH0 = 0x4C;
TL0 = 0x00; //重装定时器0,定时50ms
time_counter ++; // 软件计数器+1
}
}
//串行口中断函数,用于语句“$ GPGGA”的判断和此语句的接收
void serial() interrupt 4 using 2
{
uchar pp;
RI=0;
pp=SBUF;
if(pp==0x24) //判断第1个是不是$
{
Sflag=1; //第一个是$,判断下一个是不是G
serial_counter=0; //串行计数器清0
}
else
serial_byte=0; //不是$,清标志位
if(Sflag==1) //第一个是$,判断第2个是不是G
{
if(pp==71) //第2个是G,判断下一个是不是P
G1flag=1;
else
serial_byte=0; //不是G,清标志位
}
if(G1flag==1) //第2个为G,判断第3个是不是P
{
if(pp==80)
Pflag=1; //第3个是P,判断下一个是不是G
else
serial_byte=0; //不是P,清标志位
}
if(Pflag==1) //第3个为P,判断第4个是不是G
{
if(pp==71)
G2flag=1; //第4个是G,判断下一个是不是G
else
serial_byte=0; //不是G,清标志位
}
if(G2flag==1) //第4个是G,判断第5个是不是G
{
if(pp==71)
G3flag=1; //第5个是G,判断下一个是不是A
else
serial_byte=0; //不是G,清标志位
}
if(G3flag==1) //第5个为G,判断第6个是不是A
{
if(pp==65)
Aflag=1; //第6个是A判断下一个是不是“,”
else
serial_byte=0; //不是A,清标志位
}
if(Aflag==1) //第6个为A,判断第7个是不是“,”
{
if(pp==44)
DFflag=1; //第7个是“,”开始接收“$ GPGGA,”语句的数据
else
serial_byte=0; //不是“,”,清标志位
}
if(DFflag==1) //“$ GPGGA”头判断完毕,开始接收“$ GPGGA,”语句的数据
{
if(pp==42)
ENflag=1; //等待收到*结束接收
else
{
serial_buff[serial_counter]=pp; //没收到*,继续接收数据放入串口缓冲
serial_counter++;
}
if(ENflag==1) //串口接收完毕,可以用来显示,清标志位重新开始
{
disp_flag=1;
serial_byte=0;
}
}
}
下面的是我的主函数:
main()
{
//IE=0;
P0=0xff;P1=0xff;P2=0xff;P3=0xff; //端口复位
delay(255);
lcd_init();
lcd_init(); //初始化液晶
lcd_cls();
//PCON:SMOD
//当PCON等于80H时,SMOD=1,
//PCON=0x80;
//TMOD:GATE|C/! T|M1|M0|GATE|C/!T|M1|M0
// 0 0 1 0 0 0 0 1
TMOD=0x21; //T0 16位定时,T1 自动重装,方式3
TH0=0x4C;
TL0=0x00; //定时50ms
//TR0=1;
//SCON:SM0|SM1|SM2|REN|TB8|RB8|TI|RI
// 0 1 0 0 0 0 0 0
SCON=0x40; //串行口8位UTRA
TH1=0xFA;
TL1=0xFA; //波特率发生器,4800bps
ET0=1; //开定时器0中断允许
ES=1; //开串行口中断
EA=1; //开总中断
REN=1; //允许串行接收
TR1=1; //开串行口波特率发生器(T1)
while(1) //主程序
{
up=1; //把键盘位置1,以便进行键盘输入
down=1;
keywork(); //键盘扫描
if(disp_flag) //判断是否可以更新显示
{
disp_flag=0; //清显示更新标志
display(); //显示程序
}
}
/******************************************************************************************/
bit GPS_OK; //如果GPS_OK=1,表示接收成功、数据有效。
const char GGA[]="$GPGGA,";
struct GPS //存储GPS接收并提取出来的有用数据
{
unsigned char m_Latitude[11]; //纬度
unsigned char m_Longitude[12]; //经度
unsigned char m_Altitude[10]; //海拔
}gps;
unsigned char sbuf;
bit flag; //用于表征该字节数据接收有效与否:其值为1 时,此次字节接收正确有效;否则,为无效接收
void getch(void)
{ unsigned char i=0;
while(!RI)
{if(i++>100) //用于防止接收数据过程中可能出现的等
{ //待死锁
flag=0;
return;}
}
RI = 0;
flag=1;
sbuf=SBUF;
}
/**串行口通讯***/
void serial_int(void) interrupt 4
{
unsigned char ii=0;
EA=0;
ES=0;
GPS_OK=0; //关串行中断
for(ii=0;ii<7;ii++) //接收并识别GGA 数据帧的帧头
{
getch();
if(sbuf!=GGA[ii] || flag==0) //若不是GGA 数据帧的帧头,则开中断退出中断服务程序
{ES=1;EA=1;return;}
};
do { //接收时钟“ hhmmss.dd,”字段
getch();
if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序
}while(sbuf!=',');
ii=0;
do { //接收纬度“ xxmm.dddd,”字段
getch();
if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序
gps.m_Latitude[ii++]=sbuf;
}while(sbuf!=',');
do { //接收北半球或南半球“
getch();
if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序
gps.m_Latitude[ii++]=sbuf;
}while(sbuf!=',');
gps.m_Latitude[ii-1]='