GPS OEM板+單片機(jī)+液晶顯示
我所做的是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]='