打印

tl16c554的编程探讨(请各位大虾指教)

[复制链接]
3686|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
njnuzhoubo|  楼主 | 2007-4-24 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天被这个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个字符,他却在不停地发。
郁闷极了,已经调了一个多星期了,真的快疯了。

相关帖子

沙发
fsaok| | 2007-4-25 00:26 | 只看该作者

.

    for(ii=0;ii<7;ii++)
    {
    
            a_send(GPGGA[ii]);
    
    }
    while (1)
            ;

使用特权

评论回复
板凳
njnuzhoubo|  楼主 | 2007-4-25 08:31 | 只看该作者

感谢fsaok

这样也许能解决不停发送的问题,但是接收的都是乱码是解决不了的

使用特权

评论回复
地板
dreambird| | 2007-4-25 12:46 | 只看该作者

波特率有没有错?15c554的时钟频率是多少

使用特权

评论回复
5
njnuzhoubo|  楼主 | 2007-4-25 14:09 | 只看该作者

波特率应该没有问题

晶振用的是1.8432的,a口的波特率为9600,b口的波特率为4800

使用特权

评论回复
6
njnuzhoubo|  楼主 | 2007-4-28 09:22 | 只看该作者

多多参与

发送指令后面加一条延时指令,则可以接到字符,但是有问题是,比方说发"at+cmgf=1"这个字符串,接收显示,发送的是a#cegf=1,通过ASSIIC码表显示都是d3位错了,什么原因

使用特权

评论回复
7
chen2qiao| | 2009-4-3 15:53 | 只看该作者

楼主问题解决了吗??

楼主问题解决了吗??怎么解决的呢??

使用特权

评论回复
8
yhz280627774| | 2012-2-24 19:49 | 只看该作者
你好,楼主,你的问题解决了吗?我现在也在弄754,和你的程序差不多,但我却不能接收数据,请教!你还有程序吗?

使用特权

评论回复
9
zxdong0612| | 2013-2-25 00:24 | 只看该作者
我现在在调TL15C554和GPRS模块的通信,S3C2410的,也是FIFO的问题,还有显示的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

12

帖子

0

粉丝