以下代码本人已测试通过,希望朋友们批评指教!

完整工程下载:

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.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__) */

 

 

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

    }    
}