AVR USART接收中断程序

使用AVR的USART进行自发自收(将发送引脚RXD短接到接收引脚TXD),发出数据:0,1,2。。。数据,能接收到自己发出的数据:0,1,2。。。使用LED作出简单指示。
USART自发自收,使用PB口的LED指示接收到的数据,观察是否与发送的数据一致。

#include <iom16v>
#define DISP_PORT PORTB
#define DISP_DDR  DDRB

/*
程序功能:初始化UART为:8位,9.6K,接收中断
注意事项:基于7.3728M晶振  
程序名称:UART初始化程序
*/
void uart0_init (void)
{
    UCSRB = 0x00;   //disable while setting baud rate
    UCSRA = 0x00;   //U2X = 0,不加倍数率
    UCSRC = 0x86;   //固定的
    /*  设置帧格式 : 8 个数据位 , 2 个停止位 */
    //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    UBRRL = 47;     //set baud rate lo,波特率为9.6K   
    //UBRRL=(fosc/16/(baud+1))%256; fosc是晶振,baud为波特率
    UBRRH = 0x00;   //set baud rate hi
    UCSRB = 0x98;   //接收中断允许,接收缓冲自动清空,接收允许  
}
/*程序名称:UART接收中断服务程序*/
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
  DISP_PORT = UDR;//显示接收到的数据
                  //如:接收到"1",显示0X31
//delay50ms(1);
}

void mcu_init(void)
{
    CLI(); 
    uart0_init();
    MCUCR = 0x00;
    GICR  = 0x00;
    TIMSK = 0x00;   //timer interrupt sources
    SEI();          //re-enable interrupts
}
void main()
{
    uint8 counter=0;

    mcu_init();

    DISP_DDR=0xFF;

    while(1)
    {
        UDR=counter++;          //发送数据,数据为变量counter
        while(!(UCSRA&0x40));   //等待发送结束
         //Bit 6 – TXC: USART  发送结束
//发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时
//TXC 置位。执行发送结束中断时 TXC 标志自动清零,
//也可以通过写 1 进行清除操作。
        UCSRA|=0x40;            //清除发送结束标志位 
        delay50ms(4);
    }
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值