打印
[51单片机]

TL16C554的问题

[复制链接]
2116|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
wangch_sh|  楼主 | 2014-8-23 14:16 | 只看该作者
我这样接线,是不是可以这样定义
#define LCR_A XBYTE[0x73]//0XXX x011
#define LCR_B XBYTE[0xB3]//X0XX x011
#define LCR_C XBYTE[0xD3]//XX0X x011
#define LCR_D XBYTE[0xE3]//XXX0 x011
请问高手,是不是这样?谢谢!

使用特权

评论回复
板凳
wangch_sh|  楼主 | 2014-8-23 15:12 | 只看该作者
高手支招啊!

使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-8-23 15:20 | 只看该作者
还有我搜了一下程序,感觉地址好理解,可是8根数据线搞不明白。
发送数据时,比如我接到P1口,写程序时是不是P1=XX呢?
可是我在程序里找不到。

使用特权

评论回复
5
wangch_sh|  楼主 | 2014-8-23 16:36 | 只看该作者

我改了一下,原理图成这样了。
那是不是串口A的地址是
#define  PORT1  0x7dff
XBYTE[PORT1]?



使用特权

评论回复
6
wangch_sh|  楼主 | 2014-8-23 17:30 | 只看该作者
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define LSR0 XBYTE[0x7DFF]//串口a的线路状态寄存器的地址
#define LSR1 XBYTE[0xBDFF]//串口b的线路状态寄存器的地址
//#define LSR0 XBYTE[0x8500]//串口a的线路状态寄存器的地址
//#define LSR1 XBYTE[0x4500]//串口b的线路状态寄存器的地址
sbit RESET=P3^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[0x7BFF]=0x80;//置除数访问锁存器标志DLAB=1
    XBYTE[0x78FF]=0x0c;//设置波特率为9600bps
    XBYTE[0x79FF]=0x00;//波特率因子寄存器高位为0
    _nop_();
    XBYTE[0x7BFF]=0x03;//无奇偶校验,停止位1,8位数据
    XBYTE[0x7AFF]=0x01;//使能FIFO,置接收触发字节数
    XBYTE[0x7CFF]=0x08;
    XBYTE[0x79FF]=0x03;//接收中断使能,发送字符为空中断使能
    temp=XBYTE[0x78FF];//空读一次

    flag=1;
    while(flag)
    {
        ACC=LSR0;//检查接收状态
        if(ACC0)
            {
                ACC=XBYTE[0x7DFF];//读空
                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[0x7DFF]=ch;
            flag=1;
        }
        else
        {
            flag=0;
        }
      
}
//*********************************************a的接收
uchar a_rec()
{
    ACC=LSR0;
    if(ACC0)
    {
        flag=1;
        ch=XBYTE[0x78FF];
        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()
{
        unsigned char i;
        RESET=0;
        RESET=1;
        for(i=20;i>0;i--);
        RESET=0;
    tl16c554_inita();
    //tl16c554_initb();
   
    flag=1;
   
    a_send(0X55);
   
   
        while(1);
}
这是我的程序。大侠帮忙看看

使用特权

评论回复
7
wangch_sh|  楼主 | 2014-8-24 11:09 | 只看该作者
怎么没人理呀?

使用特权

评论回复
8
wangch_sh|  楼主 | 2014-8-24 17:50 | 只看该作者
自己顶

使用特权

评论回复
9
吊男| | 2014-8-24 19:06 | 只看该作者
没见过这个单片机啊

使用特权

评论回复
10
wangch_sh|  楼主 | 2014-8-24 19:09 | 只看该作者
这不是单片机,是串口扩展芯片。

使用特权

评论回复
11
wangch_sh|  楼主 | 2014-8-25 15:40 | 只看该作者
用这个的很少啊

使用特权

评论回复
12
shell.albert| | 2014-8-25 17:08 | 只看该作者
你需要问的问题是 你那个单片机的地址分配,应该叫memory map,就是说你想让你的外围挂在单片机的外部地址空间中,这样你就直接使用地址就能访问的到了。首先确认你的单片机的外部地址片选,这个片选对应有一部分地址空间你可以使用,把这个片选接到你片子的CS上就可以了。

使用特权

评论回复
13
wangch_sh|  楼主 | 2014-8-25 17:32 | 只看该作者
谢谢!我原来的片子地址空间太小,换了个stc90c516,61kb的FLASH.可是还是不行。
程序有错误吧?可是我查不出来。

使用特权

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

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝