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

📄 usart.c

📁 《AVR单片机GCC程序设计》
💻 C
字号:
/*
	文件名:usart.c
	功  能:uart通信接口
	C P U :	ATMega8
	编  译: WinAVR-20040404
	速  度:外部4MHz
	
	更改记录:
	2004-06-22       
*/

#include <avr/io.h>
#include <avr/interrupt.h> 
#include <avr/signal.h>

#include "usart.h"
#include "lp2004.h"

static uchar g_bTxdPos,g_bRxdPos,g_bTxdLen,g_bRxdLen;
//UART缓冲区,是数据包发送/接收缓冲区
static uchar g_aUartBuf[LP_PACKET_SIZE];

void DelayMs(uint t);

//接收完成一字节中断
SIGNAL(SIG_UART_RECV)
{
	uchar c=UDR; 
	if(g_bRxdLen>0)
	{
		g_aUartBuf[g_bRxdPos++]=c;
		g_bRxdLen--;
	}
}

//发送完成一字节中断
SIGNAL (SIG_UART_TRANS)
{
	if(--g_bTxdLen>0)
		UDR=g_aUartBuf[++g_bTxdPos];
	else
		g_bTxdPos=0;
}

//从UART缓冲区发送指定长度的数据
void UartSend(uchar len)
{
	g_bTxdPos=0;
	g_bTxdLen=len;
	UDR=g_aUartBuf[0];
	while(g_bTxdLen>0)
		DelayMs(1);
}

//接收指定长度数据到UART缓冲区
void UartRecv(uchar len,uchar waitflag)
{
	g_bRxdPos=0;
	g_bRxdLen=len;
	
	if(waitflag)
	{ 
		while(g_bRxdLen>0)
			DelayMs(1);
	}
}

//检测异步接收是否完成
uchar UartIsRecvComplate(void)
{
	return !g_bRxdLen;
}

//获取UART数据缓冲区
uchar *UartGetBuffer(void)
{
	return g_aUartBuf;
}

//初始化通用异步串行通信模块
void UartInit(void)
{
	uchar i;
	
	for(i=0;i<LP_PACKET_SIZE;i++)
		g_aUartBuf[i]=0;
	g_bTxdPos=0;
	g_bRxdPos=0;
	g_bTxdLen=0;
	g_bRxdLen=0;
	
	UCSRB=_BV(RXCIE)|_BV(TXCIE)|_BV(RXEN)|_BV(TXEN);
	UBRRH=0;
	UBRRL=25;//9600 baud 6MHz:38  4MHz:25
}

⌨️ 快捷键说明

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