我所做的是GPS+單片機+液晶顯示,板上晶振是11.5902Mhz,硬件連接是用Garmin25的NEMA端口經(jīng)RS232轉為TTL電平給89C51的10腳(RXD)
我有個問題,就是現(xiàn)在執(zhí)行程序后不能進入串行口中斷,
附程序如下:
/*************************************中斷程序*****************************/
//定時器0中斷函數(shù),用于控制背光燈延時10s熄滅
void int_t0() interrupt 1 using 1
{
TH0 = 0x4C;
TL0 = 0x00; //重裝定時器0,定時50ms
time_counter ++; // 軟件計數(shù)器+1
}
}
//串行口中斷函數(shù),用于語句“$ GPGGA”的判斷和此語句的接收
void serial() interrupt 4 using 2
{
uchar pp;
RI=0;
pp=SBUF;
if(pp==0x24) //判斷第1個是不是$
{
Sflag=1; //第一個是$,判斷下一個是不是G
serial_counter=0; //串行計數(shù)器清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,”語句的數(shù)據(jù)
else
serial_byte=0; //不是“,”,清標志位
}
if(DFflag==1) //“$ GPGGA”頭判斷完畢,開始接收“$ GPGGA,”語句的數(shù)據(jù)
{
if(pp==42)
ENflag=1; //等待收到*結束接收
else
{
serial_buff[serial_counter]=pp; //沒收到*,繼續(xù)接收數(shù)據(jù)放入串口緩沖
serial_counter++;
}
if(ENflag==1) //串口接收完畢,可以用來顯示,清標志位重新開始
{
disp_flag=1;
serial_byte=0;
}
}
}
下面的是我的主函數(shù):
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; //波特率發(fā)生器,4800bps
ET0=1; //開定時器0中斷允許
ES=1; //開串行口中斷
EA=1; //開總中斷
REN=1; //允許串行接收
TR1=1; //開串行口波特率發(fā)生器(T1)
while(1) //主程序
{
up=1; //把鍵盤位置1,以便進行鍵盤輸入
down=1;
keywork(); //鍵盤掃描
if(disp_flag) //判斷是否可以更新顯示
{
disp_flag=0; //清顯示更新標志
display(); //顯示程序
}
}
/******************************************************************************************/
bit GPS_OK; //如果GPS_OK=1,表示接收成功、數(shù)據(jù)有效。
const char GGA[]="$GPGGA,";
struct GPS //存儲GPS接收并提取出來的有用數(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 時,此次字節(jié)接收正確有效;否則,為無效接收
void getch(void)
{ unsigned char i=0;
while(!RI)
{if(i++>100) //用于防止接收數(shù)據(jù)過程中可能出現(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; //關串行中斷
for(ii=0;ii<7;ii++) //接收并識別GGA 數(shù)據(jù)幀的幀頭
{
getch();
if(sbuf!=GGA[ii] || flag==0) //若不是GGA 數(shù)據(jù)幀的幀頭,則開中斷退出中斷服務程序
{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]='