打印

有意思的IDATA

[复制链接]
1457|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CHUANDAOXY|  楼主 | 2007-3-14 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/设想先在主程序内部ram存入一组数据base[],再调用debug_insert函数,把数据插入缓冲区
//然后调用串行中断程序从串口发出

 # include<reg52.h>
 # include<stdio.h>

 #ifndef NULL
 #define NULL ((void*) 0L)
 #endif

 #define DB_MAXSIZE 0x10 //
 
 #define uchar unsigned char
 #define uint  unsigned int

  idata  uchar  base[5] _at_ 0x40;

                   
 uchar db_head, db_tail,db_buffer[DB_MAXSIZE];

 




 //Function:debug_init
 //description:缓冲区指针设为0

 //////////////////////////////////////////////////

 void debug_init(void)

 {
     SCON=0x50;
   
     PCON=0x00;  
          
     TMOD=0x20;

      TH1=0xfb;//波特率9600 18.432MHZ
   
     ES=1;//开放串行中断

     EA=1;

     TR1=1;
  
   

   


  }

////////////////////////////////////////////////////

 //Function:   debug_insert

 //description:把指向存储区的数据拷贝到缓冲区

 //parameters:base -指针 指向要拷贝数据的头地址

void debug_insert(uchar idata *base,uchar size)

  bit sendit=0;//标志位,表明是否要进行串行初始化

  uchar i=0;

  if (!size||base==NULL)

     {return;}

 if (db_tail==db_head)

    sendit=1;
    

 while((db_tail==db_head) || (i<size)) //缓冲区有空间且数据区还有数据时进行拷贝
 {  
   db_buffer[db_tail]=base;//拷贝当前字节

   i++;

   db_tail++;//移动指针

   if (db_tail==DB_MAXSIZE)//指针是否超出范围
    {
     db_tail=0;
    }
 }

 if(sendit)//是否要传输一个字节
     {   
     SBUF=db_buffer[db_head];
 
     
      
     }
     }
     


  ////////////////////////////////////////////////////////////////////

 //Function: debug_output

 //description:串行中断程序,增加缓冲区头指针,如果指针不等于尾指针
 //            输出下一个字节
 //////////////////////////////////////////////////
 
void debug_output(void) interrupt 4
{  
    bit sendit=0;

    RI=0;

       if (TI)

    db_head++;

    if (db_head==DB_MAXSIZE)//是否超出范围
    {
     db_head=0;
     {
     if (db_head!=db_tail)

         SBUF=db_buffer[db_head];//送下一个字节

          //sendit=0;
         }
         }
         } 



    


     main( )
    {    
        uchar i ;

        for(i=0;i<5;i++) 
        base=i;
        db_head=db_tail=0;

        debug_init();
        debug_insert( base,5);
         while(1);
          
     }

输出老是一个乱码,问题在“SBUF=db_buffer[db_head];//送下一个字节“
只能传一个字节,改成SBUF=db_buffer[db_head++]还不中

那位大虾帮帮忙

  
        

        
           
    
       

相关帖子

沙发
turmary| | 2007-3-15 15:26 | 只看该作者

这个程序我也在搞,把你修改一下儿就好了.

//设想先在主程序内部ram存入一组数据base[],
//再调用debug_insert函数,把数据插入缓冲区
//然后调用串行中断程序从串口发出

//在Keil中编译前,设置时钟为18.432MHZ
//调试时,全速运行,
//打开KEIL的串行接收窗口,按键盘任意键,即可收到01234
# include<reg52.h>

#ifndef NULL
#define NULL ((void*) 0L)
#endif

#define DB_MAXSIZE 0x10        //串口发送缓冲区大小
#define uchar unsigned char
#define uint  unsigned int

idata uchar base[5] _at_ 0x40;
uchar db_head, db_tail, buff_cnt, db_buffer[DB_MAXSIZE];


//////////////////////////////////////////////////
//Function:debug_init
//description:缓冲区指针设为0
//////////////////////////////////////////////////
void debug_init(void)
{
    SCON = 0x50;
    PCON = 0x00;
    TMOD = 0x20;
    TH1 = 0xfb;        //波特率9600 18.432MHZ
    ES = 1;            //开放串行中断
    EA = 1;
    TR1 = 1;

    db_head = db_tail = 0;
    buff_cnt = 0;
}


int putchar(uchar c)
{
    if (buff_cnt < DB_MAXSIZE)
    {
        db_buffer[db_tail] = c;    // Put character into buffer
        db_tail++;    // Increment pointer

        buff_cnt++;

        if (db_tail >= DB_MAXSIZE)    // Pointer wrapping
            db_tail = 0;
        return 1;
    } else {
        return 0;    // Buffer is full
    }
}


////////////////////////////////////////////////////
//Function:   debug_insert
//description:把指向存储区的数据拷贝到缓冲区
//parameters:base -指针 指向要拷贝数据的头地址
void debug_insert(uchar idata * base, uchar size)
{
    uchar i = 0;

    if (!size || base == NULL) {
        return;
    }

    while (buff_cnt < DB_MAXSIZE && i < size) {
        putchar(base[i++]);
    }

}

////////////////////////////////////////////////////////////////////
//Function: debug_output
//description:串行中断程序,增加缓冲区头指针,如果指针不等于尾指针
//            输出下一个字节
//////////////////////////////////////////////////
void debug_output(void) interrupt 4
{
    while(buff_cnt > 0)
    {
        SBUF=db_buffer[db_head++];
        buff_cnt--;
        if (db_head >= DB_MAXSIZE)    // Pointer wrapping
            db_head = 0;
        while (TI == 0);
        TI = 0;
    }
}

main()
{
    uchar i;
    for (i = 0; i < 5; i++)
        base = (i+0x30);

    debug_init();

    debug_insert(base, 5);
    while (1);
}

使用特权

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

本版积分规则

843

主题

1029

帖子

4

粉丝