首页 > 新闻中心 > 公司新闻

BG视讯(中国区)集团官网|GPS OEM板+单片机+液晶显示

发布时间:2025-10-17 11:21:57    次浏览

我所做的是GPS+单片机+液晶显示,板上晶振是11.5902Mhz,硬件连接是用Garmin25的NEMA端口经RS232转为TTL电平给89C51的10脚(RXD)我有个问题,就是现在执行程序后不能进入串行口中断,附程序如下:/*************************************中断程序*****************************///定时器0中断函数,用于控制背光灯延时10s熄灭void int_t0() interrupt1 using 1{TH0 = 0x4C;TL0 = 0x00; //重装定时器0,定时50mstime_counter ++; // 软件计数器+1}}//串行口中断函数,用于语句“$ GPGGA”的判断和此语句的接收void serial() interrupt 4 using 2{uchar pp;RI=0;pp=SBUF;if(pp==0x24) //判断第1个是不是${Sflag=1; //第一个是$,判断下一个是不是Gserial_counter=0; //串行计数器清0}elseserial_byte=0; //不是$,清标志位if(Sflag==1) //第一个是$,判断第2个是不是G{if(pp==71) //第2个是G,判断下一个是不是PG1flag=1;elseserial_byte=0; //不是G,清标志位}if(G1flag==1) //第2个为G,判断第3个是不是P{if(pp==80)Pflag=1; //第3个是P,判断下一个是不是Gelseserial_byte=0; //不是P,清标志位}if(Pflag==1) //第3个为P,判断第4个是不是G{if(pp==71)G2flag=1; //第4个是G,判断下一个是不是Gelseserial_byte=0; //不是G,清标志位}if(G2flag==1) //第4个是G,判断第5个是不是G{if(pp==71)G3flag=1; //第5个是G,判断下一个是不是Aelseserial_byte=0; //不是G,清标志位 }if(G3flag==1) //第5个为G,判断第6个是不是A{if(pp==65)Aflag=1; //第6个是A判断下一个是不是“,”elseserial_byte=0; //不是A,清标志位}if(Aflag==1) //第6个为A,判断第7个是不是“,”{if(pp==44)DFflag=1; //第7个是“,”开始接收“$ GPGGA,”语句的数据elseserial_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 1TMOD=0x21; //T0 16位定时,T1 自动重装,方式3TH0=0x4C;TL0=0x00; //定时50ms//TR0=1;//SCON:SM0|SM1|SM2|REN|TB8|RB8|TI|RI// 0 1 0 0 0 0 0 0SCON=0x40; //串行口8位UTRATH1=0xFA;TL1=0xFA; //波特率发生器,4800bpsET0=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;ii7;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 { //接收北半球或南半球“ N|S, ”字段getch();if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序gps.m_Latitude[ii++]=sbuf;}while(sbuf!=',');gps.m_Latitude[ii-1]=''; //转换成以‘’结尾的字符串ii=0;do { //接收经度“yyymm.dddd,”字段getch();if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序gps.m_Longitude[ii++]=sbuf;}while(sbuf!=',');do { //接收东半球或西半球“ E|W,”字段getch();if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序gps.m_Longitude[ii++]=sbuf;}while(sbuf!=',');gps.m_Longitude[ii-1]=''; //转换成以‘’结尾的字符串for(ii=0;ii3;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]=''; //转换成以‘’结尾的字符串do { //接收所有剩下的字段直至数据帧的结尾标志换行号‘ ’getch();if(flag==0){ES=1;EA=1;return;} //接收无效,退出中断服务程序}while(sbuf!=' ');GPS_OK=1;TI=0;ES=1;EA=1; //置此次数据接收有效,重开串行中断等待接收}原文链接:http://www.eeworld.com.cn/mcu/article_2016102930974.html