以下代码本人已测试通过,希望朋友们批评指教!
完整工程下载:
http://www.vdisk.cn/down/index/4210747A4699
主要代码:
UART.h
//
*****************************************
// UART Driver
// File Name: UART.h
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#ifndef __UART_H__
#define __UART_H__
#include < avr / io.h >
#include < avr / interrupt.h >
#include < stdio.h >
#ifndef F_CPU
# error " F_CPU not defined !!! "
#endif
#define UART0_BAUD 115200
#define UART1_BAUD 115200
#define UART0_UBRR (F_CPU/16/UART0_BAUD-1)
#define UART1_UBRR (F_CPU/16/UART1_BAUD-1)
#if defined (__AVR_ATmega16__)
#define UART0 UART
#define UCSR0C UCSRC
#define UBRR0L UBRRL
#define UBRR0H UBRRH
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UDR0 UDR
#define SIG_UART0_RECV SIG_UART_RECV
#define UART0_DDR DDRD
#define RXD0 0
#define TXD0 1
#elif defined (__AVR_ATmega128__)
#define UART0_DDR DDRE
#define UART1_DDR DDRD
#define RXD0 0
#define TXD0 1
#define RXD1 2
#define TXD1 3
#endif /* MCU type */
#define UART_RxBuf UART0_RxBuf
#define UART_IRQ UART0_IRQ
#define UART_Init UART0_Init
#define UART_SendByte UART0_SendByte
#define UART_SendString UART0_SendString
#define UART_Printf UART0_Printf
extern volatile char UART0_RxBuf;
extern volatile char UART0_IRQ;
extern volatile char UART1_RxBuf;
extern volatile char UART1_IRQ;
extern void UART0_Init( void );
extern void UART0_SendByte( char byte );
extern void UART0_SendString( char * str);
extern void UART0_Printf( char * fmt,...);
extern void UART1_Init( void );
extern void UART1_SendByte( char byte );
extern void UART1_SendString( char * str);
extern void UART1_Printf( char * fmt,...);
#endif /* __UART_H__ */
// UART Driver
// File Name: UART.h
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#ifndef __UART_H__
#define __UART_H__
#include < avr / io.h >
#include < avr / interrupt.h >
#include < stdio.h >
#ifndef F_CPU
# error " F_CPU not defined !!! "
#endif
#define UART0_BAUD 115200
#define UART1_BAUD 115200
#define UART0_UBRR (F_CPU/16/UART0_BAUD-1)
#define UART1_UBRR (F_CPU/16/UART1_BAUD-1)
#if defined (__AVR_ATmega16__)
#define UART0 UART
#define UCSR0C UCSRC
#define UBRR0L UBRRL
#define UBRR0H UBRRH
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UDR0 UDR
#define SIG_UART0_RECV SIG_UART_RECV
#define UART0_DDR DDRD
#define RXD0 0
#define TXD0 1
#elif defined (__AVR_ATmega128__)
#define UART0_DDR DDRE
#define UART1_DDR DDRD
#define RXD0 0
#define TXD0 1
#define RXD1 2
#define TXD1 3
#endif /* MCU type */
#define UART_RxBuf UART0_RxBuf
#define UART_IRQ UART0_IRQ
#define UART_Init UART0_Init
#define UART_SendByte UART0_SendByte
#define UART_SendString UART0_SendString
#define UART_Printf UART0_Printf
extern volatile char UART0_RxBuf;
extern volatile char UART0_IRQ;
extern volatile char UART1_RxBuf;
extern volatile char UART1_IRQ;
extern void UART0_Init( void );
extern void UART0_SendByte( char byte );
extern void UART0_SendString( char * str);
extern void UART0_Printf( char * fmt,...);
extern void UART1_Init( void );
extern void UART1_SendByte( char byte );
extern void UART1_SendString( char * str);
extern void UART1_Printf( char * fmt,...);
#endif /* __UART_H__ */
UART.c
//
*****************************************
// UART Driver
// File Name: UART.c
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#include " UART.h "
volatile char UART0_RxBuf, UART0_IRQ = 0 ;
void UART0_Init()
{
UART0_DDR |= ( 1 << TXD0);
UART0_DDR &= ~ ( 1 << RXD0);
UCSR0C = 0x06 ;
UBRR0L = UART0_UBRR;
UBRR0H = UART0_UBRR >> 8 ;
UCSR0A = 0x00 ;
UCSR0B = ( 1 << RXCIE) | ( 1 << RXEN) | ( 1 << TXEN);
}
void UART0_SendByte( char byte )
{
while ( ! (UCSR0A & ( 1 << UDRE)));
UDR0 = byte ;
}
void UART0_SendString( char * str)
{
while ( * str)
{
UART0_SendByte( * (str ++ ));
}
}
void UART0_Printf( char * fmt,...)
{
va_list ap;
char string [ 256 ];
va_start(ap, fmt);
vsprintf( string , fmt, ap);
UART0_SendString( string );
va_end(ap);
}
SIGNAL(SIG_UART0_RECV)
{
UART0_RxBuf = UDR0;
UART0_IRQ = 1 ;
}
#if defined (__AVR_ATmega128__)
volatile char UART1_RxBuf, UART1_IRQ = 0 ;
void UART1_Init()
{
UART1_DDR |= ( 1 << TXD1);
UART1_DDR &= ~ ( 1 << RXD1);
UCSR1C = 0x06 ;
UBRR1L = UART1_UBRR;
UBRR1H = UART1_UBRR >> 8 ;
UCSR1A = 0x00 ;
UCSR1B = ( 1 << RXCIE1) | ( 1 << RXEN1) | ( 1 << TXEN1);
}
void UART1_SendByte( char byte )
{
while ( ! (UCSR1A & ( 1 << UDRE1)));
UDR1 = byte ;
}
void UART1_SendString( char * str)
{
while ( * str)
{
UART1_SendByte( * (str ++ ));
}
}
void UART1_Printf( char * fmt,...)
{
va_list ap;
char string [ 256 ];
va_start(ap, fmt);
vsprintf( string , fmt, ap);
UART1_SendString( string );
va_end(ap);
}
SIGNAL(SIG_UART1_RECV)
{
UART1_RxBuf = UDR1;
UART1_IRQ = 1 ;
}
#endif /* defined (__AVR_ATmega128__) */
// UART Driver
// File Name: UART.c
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#include " UART.h "
volatile char UART0_RxBuf, UART0_IRQ = 0 ;
void UART0_Init()
{
UART0_DDR |= ( 1 << TXD0);
UART0_DDR &= ~ ( 1 << RXD0);
UCSR0C = 0x06 ;
UBRR0L = UART0_UBRR;
UBRR0H = UART0_UBRR >> 8 ;
UCSR0A = 0x00 ;
UCSR0B = ( 1 << RXCIE) | ( 1 << RXEN) | ( 1 << TXEN);
}
void UART0_SendByte( char byte )
{
while ( ! (UCSR0A & ( 1 << UDRE)));
UDR0 = byte ;
}
void UART0_SendString( char * str)
{
while ( * str)
{
UART0_SendByte( * (str ++ ));
}
}
void UART0_Printf( char * fmt,...)
{
va_list ap;
char string [ 256 ];
va_start(ap, fmt);
vsprintf( string , fmt, ap);
UART0_SendString( string );
va_end(ap);
}
SIGNAL(SIG_UART0_RECV)
{
UART0_RxBuf = UDR0;
UART0_IRQ = 1 ;
}
#if defined (__AVR_ATmega128__)
volatile char UART1_RxBuf, UART1_IRQ = 0 ;
void UART1_Init()
{
UART1_DDR |= ( 1 << TXD1);
UART1_DDR &= ~ ( 1 << RXD1);
UCSR1C = 0x06 ;
UBRR1L = UART1_UBRR;
UBRR1H = UART1_UBRR >> 8 ;
UCSR1A = 0x00 ;
UCSR1B = ( 1 << RXCIE1) | ( 1 << RXEN1) | ( 1 << TXEN1);
}
void UART1_SendByte( char byte )
{
while ( ! (UCSR1A & ( 1 << UDRE1)));
UDR1 = byte ;
}
void UART1_SendString( char * str)
{
while ( * str)
{
UART1_SendByte( * (str ++ ));
}
}
void UART1_Printf( char * fmt,...)
{
va_list ap;
char string [ 256 ];
va_start(ap, fmt);
vsprintf( string , fmt, ap);
UART1_SendString( string );
va_end(ap);
}
SIGNAL(SIG_UART1_RECV)
{
UART1_RxBuf = UDR1;
UART1_IRQ = 1 ;
}
#endif /* defined (__AVR_ATmega128__) */
main.c
//
*****************************************
// UART Test Program
// File Name: main.c
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#include < avr / io.h >
#include " UART.h "
int main( void )
{
UART0_Init();
UART0_SendString(
" //*****************************************\n "
" // UART Test Program \n "
" // Version: 1.0 \n "
" // IDE: AVR Studio V4.18 \n "
" // Compiler: AVR GCC 20100110 \n "
" // MCU: ATmega16 & ATmega128 \n "
" // Fosc: 11.0592MHz \n "
" // Author: Chen Lidong \n "
" // Date: 2010/03/15 \n "
" //*****************************************\n "
" Using UART0 ...\n " );
#if defined (__AVR_ATmega128__)
UART1_Init();
UART1_SendString(
" //*****************************************\n "
" // UART Test Program \n "
" // Version: 1.0 \n "
" // IDE: AVR Studio V4.18 \n "
" // Compiler: AVR GCC 20100110 \n "
" // MCU: ATmega16 & ATmega128 \n "
" // Fosc: 11.0592MHz \n "
" // Author: Chen Lidong \n "
" // Date: 2010/03/15 \n "
" //*****************************************\n "
" Using UART1 ...\n " );
#endif
SREG |= ( 1 << 7 );
while ( 1 )
{
if (UART0_IRQ)
{
UART0_IRQ = 0 ;
UART0_Printf( " UART0 Receive : %c HEX: 0X%X\n " , UART0_RxBuf, UART0_RxBuf);
}
#if defined (__AVR_ATmega128__)
if (UART1_IRQ)
{
UART1_IRQ = 0 ;
UART1_Printf( " UART1 Receive : %c HEX: 0X%X\n " , UART1_RxBuf, UART1_RxBuf);
}
#endif
}
}
// UART Test Program
// File Name: main.c
// Version: 1.0
// IDE: AVR Studio V4.18
// Compiler: AVR GCC 20100110
// MCU: ATmega16 & ATmega128
// Fosc: 11.0592MHz
// Author: Chen Lidong
// Date: 2010/03/15
// *****************************************
#include < avr / io.h >
#include " UART.h "
int main( void )
{
UART0_Init();
UART0_SendString(
" //*****************************************\n "
" // UART Test Program \n "
" // Version: 1.0 \n "
" // IDE: AVR Studio V4.18 \n "
" // Compiler: AVR GCC 20100110 \n "
" // MCU: ATmega16 & ATmega128 \n "
" // Fosc: 11.0592MHz \n "
" // Author: Chen Lidong \n "
" // Date: 2010/03/15 \n "
" //*****************************************\n "
" Using UART0 ...\n " );
#if defined (__AVR_ATmega128__)
UART1_Init();
UART1_SendString(
" //*****************************************\n "
" // UART Test Program \n "
" // Version: 1.0 \n "
" // IDE: AVR Studio V4.18 \n "
" // Compiler: AVR GCC 20100110 \n "
" // MCU: ATmega16 & ATmega128 \n "
" // Fosc: 11.0592MHz \n "
" // Author: Chen Lidong \n "
" // Date: 2010/03/15 \n "
" //*****************************************\n "
" Using UART1 ...\n " );
#endif
SREG |= ( 1 << 7 );
while ( 1 )
{
if (UART0_IRQ)
{
UART0_IRQ = 0 ;
UART0_Printf( " UART0 Receive : %c HEX: 0X%X\n " , UART0_RxBuf, UART0_RxBuf);
}
#if defined (__AVR_ATmega128__)
if (UART1_IRQ)
{
UART1_IRQ = 0 ;
UART1_Printf( " UART1 Receive : %c HEX: 0X%X\n " , UART1_RxBuf, UART1_RxBuf);
}
#endif
}
}
本文介绍了一个基于ATmega16和ATmega128的UART通信程序实现,包括UART驱动的初始化、发送字节、字符串及格式化输出等功能,并提供完整的源代码供读者参考。
1344

被折叠的 条评论
为什么被折叠?



