当前位置:首页 > 单片机 > 单片机
[导读]我所做的是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; //置此次数据接收有效,重开串行中断等待接收

}

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭