mega8 iccavr的串口程序(已修正)-中断方式(简明版)

查询方式:串口查询方式

中断完整方式:串口中断完整方式

简明版:串口中断程序简明版

自己太撮了,网上找到的中断例程都看着挺混乱,自己写一个简单明了的吧。

这里程序只是为了验证一下串口中断,实用的程序参见。

大概步骤就是:

1、关闭中断;

2、初始化;

3、打开中断;

另外,将中断服务程序与相应的中断向量对应起来。

稍微有点不太一样的是发送中断。一般,可以通过向寄存器写数直接发送。这里,用中断发送有两个好处:省时间、容易操作。当发送数据时,打开发送寄存器空中断;发送完成,关闭该中断。

/******************************************/
/*         http://truemans.inf            */
/*         RS232通讯框架                  */
/*         作者:HB                        */
/*         2010年8月5日                   */
/*  目标MCU:MEGA8   晶振:内部晶振  8MHZ   */
/******************************************/
#include <iom8v.h>
#include <macros.h>

#define FOSC 8000000 //晶振8MHZ
#define BAUDRATE 19200     //波特率

unsigned char dataout,datain;

/*       字符输出函数       */
void _putchar(unsigned char c)
{     
     while (!(UCSRA&(1<<UDRE)));
      UDR=c;    
}
/*       字符输入函数       */   
unsigned char _getchar(void)
{
     while(!(UCSRA& (1<<RXC)));
     return UDR;
}

/* 串口初始化 */
void InitUSART()
{
UBRRL=(FOSC/16/(BAUDRATE+1))%256;
UBRRH=(FOSC/16/(BAUDRATE+1))/256;
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);/*RX Complete Interrupt Enable, Receiver Enable and Transmitter Enable*/
}
/* 接收中断 */
#pragma interrupt_handler USART_RX_interrupt:12
void USART_RX_interrupt( void )
{
    datain = UDR; /* read the received data */
}

/* 发送中断 */
#pragma interrupt_handler USART_TX_interrupt:14
void USART_TX_interrupt( void )
{
    UDR = dataout; /* start transmition */
    UCSRB &= ~(1<<UDRIE); /* disable UDRE interrupt */

void main(void)
{
    unsigned char temp;
    CLI(); //disable all interrupts
    InitUSART();
    SEI(); //re-enable interrupts
    _putchar(‘W’);
    _putchar(‘e’);
    _putchar(‘l’);
    _putchar(‘c’);
    _putchar(‘o’);
    _putchar(‘m’);
    _putchar(‘e’);   
    _putchar(‘!’);
    _putchar(‘\r’);    //return
    _putchar(‘\n’);    //换行
    UCSRB |= (1<< UDRE); /* enable UDRE interrupt */   
    while(1)
    {
        if(datain)
        {
            dataout=datain;
            datain=0;
            UCSRB |= (1<< UDRE); /* enable UDRE interrupt */
        }
    }
}

Leave a comment

1 Comments.

Leave a Reply


[ Ctrl + Enter ]