当前位置:首页 > 单片机 > 单片机
[导读]我所做的是GPS+单片机+液晶显示,板上晶振是11.5902Mhz,硬件连接是用Garmin25的NEMA端口经RS232转为TTL电平给89C51的10脚(RXD)我有个问题,就是现在执行程序后不能进入串行口中断,附程序如下:/**************

我所做的是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]=''; //转换成以‘’结尾的字符串

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]=''; //转换成以‘’结尾的字符串

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]=''; //转换成以‘’结尾的字符串

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

getch();

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

}while(sbuf!='n');

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

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Holtek隆重推出全新一代32-bit Arm® Cortex®-M0+ 5V CAN MCU - HT32F53231/HT32F53241/HT32F53242/HT32F53252。这一系列单片机带有来自Bosc...

关键字: MCU 工业自动化 单片机

Holtek精益求精,宣布推出全新5V宽电压Arm® Cortex®-M0+ 32-bit MCU系列HT32F50431/HT32F50441/HT32F50442/HT32F50452。此系列MCU经多方位升级能满...

关键字: 单片机 智能家居 工业控制

单片机小精灵是一款针对单片机开发者的辅助工具,它集成了代码编辑、编译、调试等多项功能,旨在帮助开发者更加高效地进行单片机项目的开发。本文将详细介绍单片机小精灵的使用方法,帮助读者快速掌握这款工具,提高开发效率。

关键字: 单片机 代码编辑 辅助工具

在电子显示技术领域,液晶显示(LCD)因其低功耗、高清晰度和长寿命等优点被广泛应用于各种设备中。为了驱动LCD,需要使用专门的接口技术来传输图像数据。其中,低压差分信号(LVDS)和迷你低压差分信号(MiniLVDS)是...

关键字: 电子显示 液晶显示 低压差分信号

单片机和PLC将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对二者的相关情况以及信息有所认识和了解,详细内容如下。

关键字: PLC 单片机

在这篇文章中,小编将对单片机的相关内容和情况加以介绍以帮助大家增进对单片机的了解程度,和小编一起来阅读以下内容吧。

关键字: 单片机 芯片 集成电路

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 控制器

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在这篇文章中,小编将对单片机最小系统的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: 单片机 单片机最小系统
关闭
关闭