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

}

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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭