这两天被这个tl16c554折磨死了 我用单片机和tl16c554扩展两个串口 程序代码如下 //本程序通过GPS模块接受信息,提取经纬度,并通过GSM模块发送出去 //程序初始化 #include<reg51.h> #include<absacc.h> #include<intrins.h> #define uchar unsigned char #define LSR0 XBYTE[0x8005]//串口a的线路状态寄存器的地址 #define LSR1 XBYTE[0x8015]//串口b的线路状态寄存器的地址 sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; sbit ACC0=ACC^0; sbit ACC1=ACC^1; sbit ACC7=ACC^7; sbit ACC5=ACC^5; sbit ACC6=ACC^6; bit flag; uchar ii,j,ch,temp; uchar longitude[11]; uchar latitude[11]; uchar GPGGA[]={"$GPGGA,"}; void delay() { unsigned int i,j; for(i=0;i<100;i++) for(j=0;j<1000;j++); }
void tl16c554_inita()//串口a的初始化 { XBYTE[0x8003]=0x80;//置除数访问锁存器标志DLAB=1 XBYTE[0x8000]=0x0c;//设置波特率为9600bps XBYTE[0x8001]=0x00;//波特率因子寄存器高位为0 _nop_(); XBYTE[0x8003]=0x03;//无奇偶校验,停止位1,8位数据 XBYTE[0x8002]=0x01;//使能FIFO,置接收触发字节数 XBYTE[0x8004]=0x08; XBYTE[0x8001]=0x03;//接收中断使能,发送字符为空中断使能 temp=XBYTE[0x8000];//空读一次
flag=1; while(flag) { ACC=LSR0;//检查接收状态 if(ACC0) { ACC=XBYTE[0x8000];//读空 flag=1; } else flag=0; }
}
void tl16c554_initb()//串口b的初始化 { XBYTE[0x8013]=0x80;//置除数访问锁存器标志DLAB=1 XBYTE[0x8010]=0x18;//设置波特率为4800bps XBYTE[0x8011]=0x00;//波特率因子寄存器高位为0 XBYTE[0x8013]=0x03;//没有校验,停止位1,8位数据 XBYTE[0x8012]=0x01;//使能FIFO,置接收触发字节数01 XBYTE[0x8011]=0x01;//接收中断使能 temp=XBYTE[0x8010];//空读一次
flag=1; while(flag) { ACC=LSR1;//检查接收状态 if(ACC0) { ACC=XBYTE[0x8010];//读空 flag=1; } else flag=0; } }
//********************************a的发送,从csa口发送 void a_send(uchar ch) { ACC=LSR0; if(ACC5&&ACC6)//检测lsr0的第五位是否为1,thr中是否为空 { XBYTE[0x8000]=ch; flag=1; } else { flag=0; } } //*********************************************a的接收 uchar a_rec() { ACC=LSR0; if(ACC0) { flag=1; ch=XBYTE[0x8000]; return(ch); } else { flag=0; } }
//*********************************************b的接收 uchar b_rec() { ACC=LSR1; if(ACC0) { flag=1; ch=XBYTE[0x8010]; return(ch); } else { flag=0; } } void main() { tl16c554_inita(); tl16c554_initb(); P1_0=0;//检测程序运行,令灯灭 flag=1; for(ii=0;ii<7;ii++) { a_send(GPGGA[ii]); } } 我现在只是想把这个GPGGA数组里的字符发送出来,可是通过pc机接收调试,接收的都是乱码,而且我只要求发7个字符,他却在不停地发。 郁闷极了,已经调了一个多星期了,真的快疯了。 |