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

📄 uart.c

📁 keil c51 UART --IC 源程序
💻 C
字号:
/* file: uart.c
 * author: xuhuashan@gmail.com
 * create date: 2006/04/15
 */

#include <STC12C2052AD.H>

#include "uart.h"

#define XTAL		22118400L
//#define XTAL		11059200L
#define BAUDRATE	38400


#define RX_BUF_LEN		16
#define TX_BUF_LEN		16

//receive buffer
uchar idata rxBuf[RX_BUF_LEN];
ubyte rxPos = 0;
ubyte rxCnt = 0;

uchar idata txBuf[TX_BUF_LEN];
ubyte txPos = 0;
ubyte txCnt = 0;
uchar txDone = true;

static void UartInterruptRoutine(void) interrupt 4 using 3
{
	uchar c;
	if(RI)
	{
		RI = 0;
		c = SBUF;
		if(rxCnt < RX_BUF_LEN)
		{
			rxBuf[(rxPos + rxCnt) % RX_BUF_LEN] = c;
			rxCnt++;
		}
	}
	if(TI)
	{
		TI = 0;
		if(txCnt)
		{
			SBUF = txBuf[txPos];
			txCnt--;
			txPos = (txPos + 1) % TX_BUF_LEN;
		}
		else
			txDone = 1;
	}
}

void InitUart(void)
{
	PCON |= 0x80; // 0x80=SMOD: set serial baudrate doubler
	TMOD = (TMOD & 0x0F ) | 0x20; // put timer 1 into MODE 2
	TH1 = TL1 = (uchar)(256 - (XTAL / (16L * 12L * BAUDRATE)));
	TR1 = 1; // start timer 1
	SCON = 0x50; // serial port MODE 1, enable serial receiver
	PS = 0; // serial interrupt low level
	ES = 1; // enable serial interrupts
}

ubyte UartGetChar(uchar *c)
{
	ES = 0;
	if(rxCnt > 0)
	{
		*c = rxBuf[rxPos];
		rxPos = (rxPos + 1) % RX_BUF_LEN;
		rxCnt --;
		ES = 1;
		return 1;
	}
	ES = 1;
	return 0;
}

ubyte UartPutChar(const uchar c)
{
	ubyte result = 0;
	ES = 0;
	if(txCnt < TX_BUF_LEN)
	{
		txBuf[(txPos + txCnt) % TX_BUF_LEN] = c;
		txCnt++;
		if (txDone)
		{
			txDone = 0;
			TI = 1;
		}
		result = 1;
	}
	ES = 1;
	return result;
}

⌨️ 快捷键说明

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