⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 这是一个MSP430单片机上运行UCOSII的例程
💻 C
字号:
#include "Serial.h"

#if CPU == MCS51
#include <reg52.h>
#endif

#if CPU == MSP430
#include <MSP430X44X.h>
#endif

#if CPU == MCS51 
#define SETTI  TI = 1 
#endif

#if CPU == MSP430
#define SETTI     IFG1 |= UTXIFG0
#endif

#if UartTXBufMAX == 8
#define UartTXBufTBL 0x07
#endif
#if UartTXBufMAX == 16
#define UartTXBufTBL 0x0f
#endif
#if UartTXBufMAX == 32
#define UartTXBufTBL 0x1f
#endif
#if UartTXBufMAX == 64 
#define UartTXBufTBL 0x3f
#endif
#if UartTXBufMAX == 128
#define UartTXBufTBL 0x7f
#endif
#if UartRXBufMAX == 8
#define UartRXBufTBL 0x07
#endif
#if UartRXBufMAX == 16
#define UartRXBufTBL 0x0f
#endif
#if UartRXBufMAX == 32
#define UartRXBufTBL 0x1f
#endif
#if UartRXBufMAX == 64
#define UartRXBufTBL 0x3f
#endif
#if UartRXBufMAX == 128
#define UartRXBufTBL 0x7f
#endif

#if UartQueueEN == 1
unsigned char UartTXHead;              //串口发送缓冲区头指针
unsigned char UartTXRear;              //串口发送缓冲区尾指针
unsigned char UartTXCount;             //串口发送缓冲区数据个数

unsigned char UartRXHead;              //串口接收缓冲区头指针
unsigned char UartRXRear;              //串口接收缓冲区尾指针
unsigned char UartRXCount;             //串口接收缓冲区数据个数

unsigned char UartTXBuf[ UartTXBufMAX ];//串口发送缓冲区
unsigned char UartRXBuf[ UartRXBufMAX ];//串口接收缓冲区

/*
_________________________________________________________________
|	0	|	1	|	2	|	3	|	4	|	5	|	6	|	7	|
-----------------------------------------------------------------
   /\							    /\
   | 								|
  front							   rear
*/

//向队尾插入一个新元素ddata,并返回操作结果
//若操作成功则返回TRUE 否则返回FALSE


//unsigned char PutData(unsigned char ddata)
//	if Count == MAXSIZE; 
//		return Queue full
//	Buf[Rear]=ddata;
//	Rear=(Rear+1)%MAXSIZE;
//	Count++;
//	return OK;
unsigned char PutUartTXData(unsigned char ddata)
{
	if( UartTXCount == UartTXBufMAX )
		return FALSE;
	UartTXBuf[ UartTXRear ] = ddata;
	UartTXRear = (UartTXRear + 1) & UartTXBufTBL;
	UartTXCount++;
	return TRUE;
}

unsigned char PutUartRXData(unsigned char ddata)
{
	if( UartRXCount == UartRXBufMAX )
		return FALSE;
	UartRXBuf[ UartRXRear ] = ddata;
	UartRXRear = (UartRXRear + 1) & UartRXBufTBL;
	UartRXCount++;
	return TRUE;
} 

//从队首读取一个数据,并将数据存入ddate指向的单元

//unsigned char GetData(unsigned char *ddata)
//	if count == 0;
//		return Queue empty
//	*ddata = Buf[Head];
//	Head = (Head + 1) % MAXSIZE;
//	Count--;
//	return OK;
unsigned char GetUartTXData(unsigned char *ddata)
{
	if( UartTXCount == 0 )
		return FALSE;
	*ddata = UartTXBuf[ UartTXHead ];
	UartTXHead = ( UartTXHead +1 ) & UartTXBufTBL;
	UartTXCount--;
	return TRUE;
}

unsigned char GetUartRXData(unsigned char *ddata)
{
	if( UartRXCount == 0 )
		return FALSE;
	*ddata = UartRXBuf[ UartRXHead ];
	UartRXHead = ( UartRXHead +1 ) & UartRXBufTBL;
	UartRXCount--;
	return TRUE;
}

//
//void UartRead( unsigned char *Buf , unsigned char len )
//从串口读取数据,读出的数据存放在首地址为 Buf 的数组里
//读出数据的长度为 len
void UartRead( unsigned char *Buf , unsigned char len )
{
	unsigned char i,temp;
	for( i = 0;i < len; i++)
	{
		while( !GetUartRXData(&temp));
		Buf[i]=temp;
	}
}


//void UartWrite( unsigned char *Buf , unsigned char len )
//向串口写入数据,
void UartWrite( unsigned char *Buf , unsigned char len )
{
	unsigned char i,temp;
	for( i = 0;i < len; i++)
	{
		temp=Buf[i];
		while( !PutUartTXData(temp));
	}
	if(UartTXCount==len)
		SETTI;
}

#if CPU == MCS51
#if CPU_TIMER == TIMER0
void UartInit(unsigned int BandRate)
{
    TMOD&=0X0F;                           
    TMOD|=0x20;                 /*定时器1作为波特率发生器,工作于方式2,自动8位装载*/
    SCON=0x50;					/*工作方式 1*/
    PCON|=0x80;					/*波特率加倍*/
    TH1=255-57600/BandRate+1;;		/*按波特率计算初值  TH1=256-F*(SMOD+1)/(384*Band)=256-57600/Band*/
    TL1=TH1;
    TR1=1;
    TI=0;
    RI=0;
    ES=1;
    //队列初始化
    UartTXHead  = 0;              //串口发送缓冲区头指针
    UartTXRear  = 0;              //串口发送缓冲区尾指针
    UartTXCount = 0;             //串口发送缓冲区数据个数

    UartRXHead  = 0;              //串口接收缓冲区头指针
    UartRXRear  = 0;              //串口接收缓冲区尾指针
    UartRXCount = 0;             //串口接收缓冲区数据个数
}
#endif

#if CPU_TIMER ==  TIMER2
void UartInit(unsigned int BandRate)
{


	//队列初始化
	UartTXHead  = 0;              //串口发送缓冲区头指针
	UartTXRear  = 0;              //串口发送缓冲区尾指针
	UartTXCount = 0;             //串口发送缓冲区数据个数

	UartRXHead  = 0;              //串口接收缓冲区头指针
	UartRXRear  = 0;              //串口接收缓冲区尾指针
	UartRXCount = 0;             //串口接收缓冲区数据个数
}
#endif

void UartInterrupt(void) interrupt 4 //reentrant
{
	unsigned char temp;
	if(RI)
	{
		RI=0;
		PutUartRXData(SBUF);
	}
	if(TI)
	{
		TI=0;
		if(UartTXCount != 0)
		{
			GetUartTXData(&temp);
			SBUF=temp;
		}
	}
}

#endif

#if CPU == MSP430
void UartInit(unsigned int BandRate)
{
    //只允许输入标准波特率  
    unsigned int temp;
    UTCTL0=SSEL1;
    
    temp = (CPU_OSC) / BandRate;
    UBR00 = temp % 256;//波特率寄存器  低八位
    UBR10 = temp / 256;//高八位
    
    UMCTL0 = 0x0;//微调寄存器
    UCTL0 = CHAR;
    ME1 |= UTXE0+URXE0;
    IE1 |= URXIE0+UTXIE0;

    P2SEL |= 0x30; //选择RXD  TXD
    P2DIR |= 0x10; //设置TXD为输出
    P2DIR &= ~0x20;//设置RXD为输入
	//队列初始化
    UartTXHead  = 0;              //串口发送缓冲区头指针
    UartTXRear  = 0;              //串口发送缓冲区尾指针
    UartTXCount = 0;             //串口发送缓冲区数据个数
    UartRXHead  = 0;              //串口接收缓冲区头指针
    UartRXRear  = 0;              //串口接收缓冲区尾指针
    UartRXCount = 0;             //串口接收缓冲区数据个数
}

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
	PutUartRXData(RXBUF0);
}

#pragma vector = UART0TX_VECTOR
__interrupt void usart0_tx(void)
{
    unsigned char temp;
    if(UartTXCount != 0)
    {
        GetUartTXData(&temp);
        TXBUF0=temp;
    }
}
#endif
#endif  // end of UartQueueEN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -