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

📄 uart.c

📁 ICCAVR编译器下的ATmega16芯片的AD使用范例。使用C语言编写
💻 C
字号:
/********************************************************************
			ATmega16L学习板串口查询方式工作源文件
			晶振频率:	8MHz
			编写:		3366524@qq.com
********************************************************************/

#include <iom16v.h>
#include <macros.h>
#include "../include/board.h"

//		 for 8MHz
const unsigned char		UartUbrr[] = {0,207,103,51,34,25,16,12,8,3,1};

const unsigned char builddata[] = __DATE__;
const unsigned char buildtime[] = __TIME__;

/*===================================================================
//	函数功能:	串口初始化
//	形参:		unsigned char	串口波特率
//			0		1		2		3		4		5		6		7		8		9		10		
//			close	4800	9600	19200	28800	38400	57600	76800	115200	250000	500000
//	返回:		void
//	编写:		2004/6/26
===================================================================*/
void	Lib_UartIni(unsigned char buadrate)
{
	if(buadrate)
	{
		UBRRL = UartUbrr[buadrate];					//	设置波特率
		UCSRA |= (1<<U2X);
		UCSRB = ((1<<RXEN) | (1<<TXEN));			//	使能串口发送与接收
		UCSRC = ((1<<URSEL)|(3<<UCSZ0));			//	选择异步模式,8数据位,1字节停止位,无奇偶校验
	}
	else
	{
		UCSRB = 0x00;								//	关闭串口
	}
}

/*===================================================================
//	函数功能:	串口发送一字节数据
//	形参:		unsigned char	要送出的数据
//	返回:		void
//	编写:		2004/6/26
===================================================================*/
void	Lib_Uart_SendChar(unsigned char data)
{
	while ( !( UCSRA & (1<<UDRE)) )					//	等待知道发送缓冲区空
	;
	UDR = data;										//	把数据放入发送缓冲区
}

/*===================================================================
//	函数功能:	串口发送一个字符
//	形参:		unsigned char	要送出的字符
//	返回:		void
//	编写:		2004/6/26
//	备注:		当回车时将开始一个新行
===================================================================*/
void	Lib_Uart_SendCh(unsigned char data)
{
        if(data == '\n')							//	一个新行
        {
                Lib_Uart_SendChar('\r');			//	发送换行
        }
        Lib_Uart_SendChar(data);
}

/*===================================================================
//	函数功能:	串口发送一个字符串
//	形参:		unsigned char *	要送出的字符串指针
//	返回:		void
//	编写:		2004/6/26
===================================================================*/
void	Lib_Uart_SendString(const unsigned char *String)
{
        while(*String)	Lib_Uart_SendCh(*String++);
}

void	Lib_Uart_SendMessage(void)
{
	Lib_Uart_SendString("\n\n============================================\n");
	Lib_Uart_SendString("\tTest FRAMEWORK Ver 1.2\n");
	Lib_Uart_SendString("\tBuilt on ");
	Lib_Uart_SendString(builddata);
	Lib_Uart_SendString(" ");
	Lib_Uart_SendString(buildtime);
	Lib_Uart_SendString(".\n");
	Lib_Uart_SendString("\tWrite by HAN: 3366524@qq.com\n");
	Lib_Uart_SendString("============================================\n");
}

/*===================================================================
//	函数功能:	串口等待接收一字节数据
//	形参:		void		要送出的数据
//	返回:		unsigned char	接收到的字符
//	编写:		2004/6/26
===================================================================*/
unsigned char	Lib_Uart_GetCh(void)
{
	while(!(UCSRA & (1<<RXC)));					//	等待接收缓冲区有数据
	return UDR;
}

/*===================================================================
//	函数功能:	串口无等待接收一字节数据
//	形参:		unsigned char *	存储的数据指针
//	返回:		unsigned char	数据可用为真,不可用为假
//	编写:		2004/6/26
===================================================================*/
unsigned char	Lib_Uart_GetChar(unsigned char *pddata)
{
	if(UCSRA & (1<<RXC))						//	接收缓冲区有数据
	{
		*pddata = UDR;
		return true;
	}
	else										//	接收缓冲区无数据
		return false;
}

/*===================================================================
//	函数功能:	串口等待接收一字符串
//	形参:		unsigned char *	存储的字符串指针
//	返回:		void
//	编写:		2004/6/26
//	备注:		等待字符串以回车结尾,最长29字符
===================================================================*/
void	Lib_Uart_GetString(unsigned char *pbString)
{
        unsigned char 	*pbString2 = pbString;
        unsigned char 	bC;

        while((bC = Lib_Uart_GetCh()) != '\r')	//	wait input enter
        {
                if((int)pbString2 <= (int)pbString - 29)		//	max 29 chars
                {
                	break;
                }
                if(bC == '\b')					//	input backspace
                {
                        if((int)pbString2<(int)pbString)
                        {
                        	Lib_Uart_SendString("\b \b");
                        	pbString--;
                        }
                }
                else
                {
                        *pbString++ = bC;
                        Lib_Uart_SendCh(bC);
                }
        }
        *pbString='\0';							//	end of string	
        Lib_Uart_SendCh('\n');
}

⌨️ 快捷键说明

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