×
单片机 > 单片机程序设计 > 详情

GPS OEM板+单片机+液晶显示

发布时间:2020-06-16 发布时间:
|
我所做的是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]='\0'; //转换成以‘\0’结尾的字符串

ii=0;

do { //接收经度“yyymm.dddd,”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序

gps.m_Longitude[ii++]=sbuf;

}while(sbuf!=',');

do { //接收东半球或西半球“ ,”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序

gps.m_Longitude[ii++]=sbuf;

}while(sbuf!=',');

gps.m_Longitude[ii-1]='\0'; //转换成以‘\0’结尾的字符串

for(ii=0;ii<3;ii++)

do { //接收“ v,ss,d.d,”字段,但不保留存储

getch();

if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序

}while(sbuf!=',');

ii=0;

do { // 接收海拔高度“ h.h,”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序

gps.m_Altitude[ii++]=sbuf;

}while(sbuf!=',');

gps.m_Altitude[ii-1]='\0'; //转换成以‘\0’结尾的字符串

do { //接收所有剩下的字段直至数据帧的结尾标志换行号‘\n’

getch();

if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序

}while(sbuf!='\n');

GPS_OK=1;TI=0;ES=1;EA=1; //置此次数据接收有效,重开串行中断等待接收

}

关键字:GPS  OEM板  单片机  液晶显示

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址