以下代码本人已测试通过,希望朋友们批评指教!
完整工程下载:
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
}
}