AVR ATmega16 & ATmega128 串口源代码

本文介绍了一个基于ATmega16和ATmega128的UART通信程序实现,包括UART驱动的初始化、发送字节、字符串及格式化输出等功能,并提供完整的源代码供读者参考。

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

完整工程下载:

http://www.vdisk.cn/down/index/4210747A4699

 

主要代码:

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

 

 

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

 

 

ExpandedBlockStart.gif 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

    }    
}

 

 

转载于:https://www.cnblogs.com/chenlidong/articles/1686605.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值