我酷下载
您的位置:首页-> 技术文章-> -> 电子设计-> 串口中断fifo

阅读排行




串口中断fifo

作者未知 来源精诚电子设计 加入时间:2005-9-27 人气:206
串口中断fifo
2005年7月29日  作者:转贴  精诚电子设计  浏览选项:  颜色 默认 灰度 橄榄色 绿色 蓝色 褐色 红色   本文已被浏览 74 次

   
  
串口 中断 fifo;好久没有用51了,如有bug,请指正(带马墓场)



#include <reg52.h>

/* UART Buffer Defines */
#define UART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )
#define UART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */
#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )



/* Static Variables */
static  data unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
static data volatile unsigned char UART_RxHead;
static data volatile unsigned char UART_RxTail;
static  data unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
static data volatile unsigned char UART_TxHead;
static data volatile unsigned char UART_TxTail;
bit fSeri0_Send_Ok;
/* initialize UART */

//t2 做波特率发生器 9600bps at 11.0592 MHz
void InitUART(  )
{
unsigned char x;

T2CON = 0x30;    //t2 做波特率发生器            

TH2 = 0xFF;
    TL2 = 0xdc;         
    RCAP2H = 0xFF;       
    RCAP2L = 0xdc;

    SCON = 0x50;        /* SM0 SM1 SM2 REN TB8 RB8 TI RI:9 bit */
    PCON = 0x00;        /* baut rate, 80h:double; 00h: normal  */
    ES = 1;             /* 串口中断允许   1-enable             */
    PS = 0;             /* 串口中断优先级 1-高,0-低           */
    TR2 = 1;            /* Start T2 as baut rate generator     */     

x = 0; /* flush receive buffer */
UART_RxTail = x;
UART_RxHead = x;
UART_TxTail = x;
UART_TxHead = x;
}

/* interrupt handlers */
void UART_interrupt( void ) interrupt 4
{
if (TI)
{ // 是否是发送中断
unsigned char tmptail;
TI=0;
if (UART_TxTail==UART_TxHead)
{
fSeri0_Send_Ok=0;        /*已发送完毕*/

}
else
{
tmptail = ( UART_TxTail + 1 ) &
UART_TX_BUFFER_MASK;
UART_TxTail = tmptail; /* store new index */
SBUF = UART_TxBuf[tmptail]; /* start
transmition */
}


}
if (RI)
{
unsigned char revdata;
unsigned char tmphead;
RI=0;
revdata = SBUF;

tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;
UART_RxHead = tmphead; /* store new index */
UART_RxBuf[tmphead] = revdata; /* store received data in
buffer */
}
}


unsigned char ReceiveByte( void )
{
unsigned char tmptail;

while ( UART_RxHead == UART_RxTail ) /* wait for incomming data */
;
tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate
buffer index */
UART_RxTail = tmptail; /* store new index */
return UART_RxBuf[tmptail]; /* return data */
}

void TransmitByte( unsigned char senddata )
{
unsigned char tmphead;
tmphead = ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;

UART_TxBuf[tmphead] = senddata; /* store data in buffer */
UART_TxHead = tmphead; /* store new index */
if(fSeri0_Send_Ok==0)

{
fSeri0_Send_Ok=1;
TI=1;
}
}

unsigned char DataInReceiveBuffer( void )
{
return ( UART_RxHead != UART_RxTail );

}
void main(void)
{
InitUART()
EA=1;

while(1)
{

if (DataInReceiveBuffer())
{
TransmitByte(ReceiveByte());
}
}

}
  


相关文章

相关软件

联系我们 广告服务 友情链接 版权说明 软件发布 下载帮助

CopyRight
2005-2016 www.5qcn.net All Rights Reserved 版权所有 【我酷】下载