當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]我所做的是GPS+單片機(jī)+液晶顯示,板上晶振是11.5902Mhz,硬件連接是用Garmin25的NEMA端口經(jīng)RS232轉(zhuǎn)為TTL電平給89C51的10腳(RXD)我有個(gè)問(wèn)題,就是現(xiàn)在執(zhí)行程序后不能進(jìn)入串行口中斷,附程序如下:/**************

我所做的是GPS+單片機(jī)+液晶顯示,板上晶振是11.5902Mhz,硬件連接是用Garmin25的NEMA端口經(jīng)RS232轉(zhuǎn)為TTL電平給89C51的10腳(RXD)

我有個(gè)問(wèn)題,就是現(xiàn)在執(zhí)行程序后不能進(jìn)入串行口中斷,

附程序如下:

/*************************************中斷程序*****************************/

//定時(shí)器0中斷函數(shù),用于控制背光燈延時(shí)10s熄滅

void int_t0() interrupt 1 using 1

{

TH0 = 0x4C;

TL0 = 0x00; //重裝定時(shí)器0,定時(shí)50ms

time_counter ++; // 軟件計(jì)數(shù)器+1

}

}

//串行口中斷函數(shù),用于語(yǔ)句“$ GPGGA”的判斷和此語(yǔ)句的接收

void serial() interrupt 4 using 2

{

uchar pp;

RI=0;

pp=SBUF;

if(pp==0x24) //判斷第1個(gè)是不是$

{

Sflag=1; //第一個(gè)是$,判斷下一個(gè)是不是G

serial_counter=0; //串行計(jì)數(shù)器清0

}

else

serial_byte=0; //不是$,清標(biāo)志位

if(Sflag==1) //第一個(gè)是$,判斷第2個(gè)是不是G

{

if(pp==71) //第2個(gè)是G,判斷下一個(gè)是不是P

G1flag=1;

else

serial_byte=0; //不是G,清標(biāo)志位

}

if(G1flag==1) //第2個(gè)為G,判斷第3個(gè)是不是P

{

if(pp==80)

Pflag=1; //第3個(gè)是P,判斷下一個(gè)是不是G

else

serial_byte=0; //不是P,清標(biāo)志位

}

if(Pflag==1) //第3個(gè)為P,判斷第4個(gè)是不是G

{

if(pp==71)

G2flag=1; //第4個(gè)是G,判斷下一個(gè)是不是G

else

serial_byte=0; //不是G,清標(biāo)志位

}

if(G2flag==1) //第4個(gè)是G,判斷第5個(gè)是不是G

{

if(pp==71)

G3flag=1; //第5個(gè)是G,判斷下一個(gè)是不是A

else

serial_byte=0; //不是G,清標(biāo)志位

}

if(G3flag==1) //第5個(gè)為G,判斷第6個(gè)是不是A

{

if(pp==65)

Aflag=1; //第6個(gè)是A判斷下一個(gè)是不是“,”

else

serial_byte=0; //不是A,清標(biāo)志位

}

if(Aflag==1) //第6個(gè)為A,判斷第7個(gè)是不是“,”

{

if(pp==44)

DFflag=1; //第7個(gè)是“,”開(kāi)始接收“$ GPGGA,”語(yǔ)句的數(shù)據(jù)

else

serial_byte=0; //不是“,”,清標(biāo)志位

}

if(DFflag==1) //“$ GPGGA”頭判斷完畢,開(kāi)始接收“$ GPGGA,”語(yǔ)句的數(shù)據(jù)

{

if(pp==42)

ENflag=1; //等待收到*結(jié)束接收

else

{

serial_buff[serial_counter]=pp; //沒(méi)收到*,繼續(xù)接收數(shù)據(jù)放入串口緩沖

serial_counter++;

}

if(ENflag==1) //串口接收完畢,可以用來(lái)顯示,清標(biāo)志位重新開(kāi)始

{

disp_flag=1;

serial_byte=0;

}

}

}

下面的是我的主函數(shù):

main()

{

//IE=0;

P0=0xff;P1=0xff;P2=0xff;P3=0xff; //端口復(fù)位

delay(255);

lcd_init();

lcd_init(); //初始化液晶

lcd_cls();

//PCON:SMOD

//當(dāng)PCON等于80H時(shí),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位定時(shí),T1 自動(dòng)重裝,方式3

TH0=0x4C;

TL0=0x00; //定時(shí)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; //波特率發(fā)生器,4800bps

ET0=1; //開(kāi)定時(shí)器0中斷允許

ES=1; //開(kāi)串行口中斷

EA=1; //開(kāi)總中斷

REN=1; //允許串行接收

TR1=1; //開(kāi)串行口波特率發(fā)生器(T1)

while(1) //主程序

{

up=1; //把鍵盤位置1,以便進(jìn)行鍵盤輸入

down=1;

keywork(); //鍵盤掃描

if(disp_flag) //判斷是否可以更新顯示

{

disp_flag=0; //清顯示更新標(biāo)志

display(); //顯示程序

}

}

/******************************************************************************************/

bit GPS_OK; //如果GPS_OK=1,表示接收成功、數(shù)據(jù)有效。

const char GGA[]="$GPGGA,";

struct GPS //存儲(chǔ)GPS接收并提取出來(lái)的有用數(shù)據(jù)

{

unsigned char m_Latitude[11]; //緯度

unsigned char m_Longitude[12]; //經(jīng)度

unsigned char m_Altitude[10]; //海拔

}gps;

unsigned char sbuf;

bit flag; //用于表征該字節(jié)數(shù)據(jù)接收有效與否:其值為1 時(shí),此次字節(jié)接收正確有效;否則,為無(wú)效接收

void getch(void)

{ unsigned char i=0;

while(!RI)

{if(i++>100) //用于防止接收數(shù)據(jù)過(guò)程中可能出現(xiàn)的等

{ //待死鎖

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; //關(guān)串行中斷

for(ii=0;ii<7;ii++) //接收并識(shí)別GGA 數(shù)據(jù)幀的幀頭

{

getch();

if(sbuf!=GGA[ii] || flag==0) //若不是GGA 數(shù)據(jù)幀的幀頭,則開(kāi)中斷退出中斷服務(wù)程序

{ES=1;EA=1;return;}

};

do { //接收時(shí)鐘“ hhmmss.dd,”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收無(wú)效,退出中斷服務(wù)程序

}while(sbuf!=',');

ii=0;

do { //接收緯度“ xxmm.dddd,”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收無(wú)效,退出中斷服務(wù)程序

gps.m_Latitude[ii++]=sbuf;

}while(sbuf!=',');

do { //接收北半球或南半球“ , ”字段

getch();

if(flag==0){ES=1;EA=1;return;} //接收無(wú)效,退出中斷服務(wù)程序

gps.m_Latitude[ii++]=sbuf;

}while(sbuf!=',');

gps.m_Latitude[ii-1]='