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

📄 uart.c

📁 AVR单片机C语言程序设计实例精粹
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************************************************************
// File Name : UART.c
// Author    : Steaven
// Created   : 2008-10-05
// Modified  : 
// Revision  : V0.0
//********************************************************************

#include "includes.h" 

struct SCI_Buffer stSciBuffer;

INT8U bSCI_Event = 0;    //SCI Event
INT8U bBuzzer_Count = 0; //Buzzer ON Time

//********************************************************************
// Function    : sSet_SCI_Event
// Input       : event - SCI Event
// Output      : none
// Description : Interface Function
//********************************************************************
void sSet_SCI_Event(INT8U event)
{
	bSCI_Event = event;
}

//********************************************************************
// Function    : sbGet_SCI_Event
// Input       : none
// Output      : SCI Event
// Description : Interface Function
//********************************************************************
INT8U sbGet_SCI_Event(void)
{
	INT8U event;
	event = bSCI_Event;
	bSCI_Event = 0;
	return(event);
}

//********************************************************************
// Function    : sSet_Buzzer_Count
// Input       : bCount - Buzzer ON Time
// Output      : none
// Description : Interface Function
//********************************************************************
void sSet_Buzzer_Count(INT8U bCount)
{
	bBuzzer_Count = bCount;
}

//********************************************************************
// Function    : sbGet_Buzzer_Count
// Input       : none
// Output      : Buzzer ON Time
// Description : Interface Function
//********************************************************************
INT8U sbGet_Buzzer_Count(void)
{
	return(bBuzzer_Count);
}
		
//********************************************************************
// Function    : Init_UART
// Input       : none
// Output      : none
// Description : ATmega16 UART Initialization,9600/N/8/1
//********************************************************************
void Init_UART(void)
{
	UCSRA = 0x00;
	UCSRB = 0xD8;
	UCSRC = 0x86;
	UBRRL = 0x33;
	SCI_Task_Init();
}

//********************************************************************
// Function    : SCI_Task_Init
// Input       : none
// Output      : none
// Description : Enable UART RX Interrupt and Initialize Buffer
//********************************************************************
void SCI_Task_Init(void)
{
	Enable_UART_RX_INT();
	SciBuffer_Init(&stSciBuffer);
}

//********************************************************************
// Function    : Enable_UART_RX_INT
// Input       : none
// Output      : none
// Description : Enable UART RX Interrupt
//********************************************************************
void Enable_UART_RX_INT(void)
{
	UCSRB |= 0x80;
}

//********************************************************************
// Function    : Enable_UART_TX_INT
// Input       : none
// Output      : none
// Description : Enable UART TX Interrupt
//********************************************************************
void Enable_UART_TX_INT(void)
{
	UCSRB |= 0x40;
}

//********************************************************************
// Function    : Disable_UART_RX_INT
// Input       : none
// Output      : none
// Description : Disable UART RX Interrupt
//********************************************************************
void Disable_UART_RX_INT(void)
{
	UCSRB &= ~0x80;
}

//********************************************************************
// Function    : Disable_UART_TX_INT
// Input       : none
// Output      : none
// Description : Disable UART TX Interrupt
//********************************************************************
void Disable_UART_TX_INT(void)
{
	UCSRB &= ~0x40;
}

//********************************************************************
// Function    : UART_TX_DATA
// Input       : bData-data to be send
// Output      : none
// Description : Write Data to UART TX Reigster
//********************************************************************
void UART_TX_DATA(INT8U bData)
{
	UDR = bData;
}

//********************************************************************
// Function    : UART_RX_DATA
// Input       : none
// Output      : data received
// Description : Get Received Data from Register
//********************************************************************
INT8U UART_RX_DATA(void)
{
	return(UDR);
}

//********************************************************************
// Function    : sUART_RX_ISR
// Input       : none
// Output      : none
// Description : UART RX Interrupt Service Routine
//********************************************************************
#pragma interrupt_handler sUART_RX_ISR:12  
void sUART_RX_ISR(void)
{
	INT8U data;
	//step1:read receive register to clear interrupt flag
	data = UART_RX_DATA();
	//step2:report event or store received char to buffer
	if((data == 0x0A) || (data == 0x0D))
	{
		if(sbGetRxBufferEmptyStatus(&stSciBuffer) == false)
		{
			SciBuffer_Rx_Reset(&stSciBuffer);
			sSet_SCI_Event(1);
		}
	}
	else
	{
		SciBuffer_Rx_In(&stSciBuffer,data);
	}
}

//********************************************************************
// Function    : sUART_TX_ISR
// Input       : none
// Output      : none
// Description : UART TX Interrupt Service Routine
//********************************************************************
#pragma interrupt_handler sUART_TX_ISR:14  
void sUART_TX_ISR(void)
{
	INT8U bData;
	if(sbGetTxBufferNoEmptyStatus(&stSciBuffer) == true)
	{
		bData = SciBuffer_Tx_Out(&stSciBuffer);
		UART_TX_DATA(bData);
	}
	else
	{
		Disable_UART_TX_INT();
		SciBuffer_Tx_Reset(&stSciBuffer);
	}
}

//********************************************************************
// Function    : SciBuffer_Init
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Initialization of SCI Buffer
//********************************************************************
void SciBuffer_Init(struct SCI_Buffer *ptr)
{
	ptr->bRxLength = 0;
	ptr->bTxLength = 0;
	ptr->bTxBufferLength = 0;
}

//********************************************************************
// Function    : SciBuffer_Rx_In
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Add data into the SCI RX Buffer
//********************************************************************
void SciBuffer_Rx_In(struct SCI_Buffer *ptr,INT8U bData)
{
	if(ptr->bRxLength < cMaxRxLength)
	{
		ptr->bRxBuffer[ptr->bRxLength] = bData;
		ptr->bRxLength++;
	}
	else
	{
		ptr->bRxBuffer[0] = bData;
		ptr->bRxLength = 1;
	}
}

//********************************************************************
// Function    : SciBuffer_Tx_Out
// Input       : ptr-pointer to SCI Buffer
// Output      : data from SCI TX Buffer
// Description : Get data from the SCI TX Buffer
//********************************************************************
INT8U SciBuffer_Tx_Out(struct SCI_Buffer *ptr)
{
	INT8U bData;
	bData = ptr->bTxBuffer[ptr->bTxLength];
	ptr->bTxLength++;
	return(bData);	
}

//********************************************************************
// Function    : SciBuffer_Tx_In
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Add data into the SCI TX Buffer
//********************************************************************
void SciBuffer_Tx_In(struct SCI_Buffer *ptr,INT8U bData)
{
	if(ptr->bTxBufferLength < cMaxTxLength)
	{
		ptr->bTxBuffer[ptr->bTxBufferLength] = bData;
		ptr->bTxBufferLength++;
	}
}
		
//********************************************************************
// Function    : sbGetTxBufferNoEmptyStatus
// Input       : ptr-pointer to SCI Buffer
// Output      : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetTxBufferNoEmptyStatus(struct SCI_Buffer *ptr)
{
	if(ptr->bTxLength < ptr->bTxBufferLength)
	{
		return(true);
	}
	return(false);
}

//********************************************************************
// Function    : sbGetTxBufferNoEmptyStatus
// Input       : ptr-pointer to SCI Buffer
// Output      : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetTxBufferEmptyStatus(struct SCI_Buffer *ptr)
{
	if(ptr->bTxBufferLength == 0)
	{
		return(true);
	}
	return(false);
}

//********************************************************************
// Function    : sbGetRxBufferEmptyStatus
// Input       : ptr-pointer to SCI Buffer
// Output      : Status of SCI TX Buffer
// Description : Check whether the SCI TX Buffer is empty or not
//********************************************************************
INT8U sbGetRxBufferEmptyStatus(struct SCI_Buffer *ptr)
{
	if(ptr->bRxLength == 0)
	{
		return(true);
	}
	return(false);
}

//********************************************************************
// Function    : SciBuffer_Rx_Reset
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Reset RX Buffer Length to zero
//********************************************************************
void SciBuffer_Rx_Reset(struct SCI_Buffer *ptr)
{
	ptr->bRxLength = 0;
}

//********************************************************************
// Function    : SciBuffer_Tx_Reset
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Reset TX Buffer Length to zero
//********************************************************************
void SciBuffer_Tx_Reset(struct SCI_Buffer *ptr)
{
	ptr->bTxLength = 0;
	ptr->bTxBufferLength = 0;
}

//********************************************************************
// Function    : SciBuffer_Tx_Inc
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Increase TX Buffer Length
//********************************************************************
void SciBuffer_Tx_Inc(struct SCI_Buffer *ptr)
{
	ptr->bTxLength++;
}

//********************************************************************
// Function    : UART_WRITE_DATA
// Input       : ptr-pointer to SCI Buffer
// Output      : none
// Description : Send the firstIncrease TX Buffer Length
//********************************************************************
void UART_WRITE_DATA(struct SCI_Buffer *ptr)
{
	UART_TX_DATA(ptr->bTxBuffer[0]);
	SciBuffer_Tx_Inc(ptr);
	Enable_UART_TX_INT();
}

//********************************************************************
// Function    : C1Command
// Input       : none

⌨️ 快捷键说明

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