| 
 | 
 
发送采用查询方式,接收采用中断方式。晶振7.3728M,无分频。 
 
 
 
unsigned char uartrbuffer[100];                        //uart接受缓存100字节 
 
unsigned char uarttbuffer[50];                           //uart发送缓存50字节 
 
int stringlon=0; 
 
 
 
//UART0 initialisation 
 
// desired baud rate:115200 
 
// actual baud rate:115200 (0.0%) 
 
// char size: 8 bit 
 
// parity: Disabled 
 
void uart0_init(void) 
 
{ 
 
UCSR0B = 0x00; //disable while setting baud rate 
 
UCSR0A = 0x00; //disable while setting baud rate 
 
UBRR0L =0x03; //set baud rate 
 
UBRR0H=0x00; 
 
UCSR0C =(1<<URSEL0)|0b00000110; 
 
UCSR0B=0b10011000; //enable 
 
} 
 
 
 
#pragma interrupt_handler uart0_rx_isr:20 
 
void uart0_rx_isr(void) 
 
{ 
 
//uart has received a character in UDR 
 
uartrbuffer[stringlon]=UDR0; 
 
stringlon++; 
 
urflag=1; 
 
if(stringlon>=100) 
 
        stringlon=0; 
 
} 
 
 
 
 
 
//UART1 initialisation 
 
// desired baud rate: 4800 
 
// actual: baud rate:4800 (0.0%) 
 
// char size: 7 bit 
 
// parity: Even 
 
void uart1_init(void) 
 
{ 
 
 
 
UCSR1B = 0x00; //disable while setting baud rate 
 
UCSR1A = 0x00; //disable while setting baud rate 
 
UCSR1C = 0b10100100; 
 
UBRR1L =0x5F; //set baud rate 
 
UBRR1H =0x00; 
 
UCSR1B = 0b10011000; //enable 
 
} 
 
 
 
#pragma interrupt_handler uart1_rx_isr:21 
 
void uart1_rx_isr(void) 
 
{ 
 
//uart has received a character in UDR 
 
uartrbuffer[stringlon]=UDR1; 
 
stringlon++; 
 
urflag=1; 
 
if(stringlon>=100) 
 
        stringlon=0;  
 
} 
 
 
 
//*******************************************uart字符输出*************************** 
 
void putchar(int upart,unsigned char charx)                                 
 
//upart表示UART标号,0表示UART0,其他表示UART1;char0表示要发出的数据; 
 
{ 
 
if(upart==0) 
 
        { 
 
        while(!(UCSR0A&(1<<UDRE0))); 
 
                UDR0=charx; 
 
        } 
 
else 
 
        { 
 
        while(!(UCSR1A&(1<<UDRE1))); 
 
                UDR1=charx; 
 
        } 
 
} 
 
 
 
//******************************************uart字符输出函数结束*************** 
 
 
 
 
 
//*******************************带可选回车换行的字符串输出函数****** 
 
//upart表示发出数据使用的端口号0表示使用UART0,其他表示使用UART1; 
 
//*s表示要发出数据的指针 
 
//senter0表示结尾是否使用0x0d,0表示使用,其他表示不使用 
 
//senter1表示结尾是否使用0x0a,0表示使用,其他表示不使用 
 
//stringl表示所要输出的字符串长度,0表示无限制 
 
void puts(unsigned char *s,int upart,int senter0,int senter1,int stringl) 
 
{ 
 
stringlon=0; 
 
if(upart==0) 
 
        { 
 
        if(stringl==0) 
 
                { 
 
                while(*s) 
 
                        { 
 
                        outchar=*s;         
 
                        putchar(0,outchar); 
 
                        s++; 
 
                        } 
 
                if(senter0==0) 
 
                        putchar(0,0x0d); 
 
                if(senter1==0) 
 
                        putchar(0,0x0a); 
 
                } 
 
        else 
 
                { 
 
                while(stringlon<=(stringl-1)) 
 
                        { 
 
                        outchar=*(s+stringlon); 
 
                        putchar(0,outchar); 
 
                        stringlon++; 
 
                        } 
 
                if(senter0==0) 
 
                        putchar(0,0x0d); 
 
                if(senter1==0) 
 
                        putchar(0,0x0a);                 
 
                } 
 
        } 
 
else 
 
        { 
 
        if(stringl==0) 
 
                { 
 
                while(*s) 
 
                        { 
 
                        outchar=*s; 
 
                        putchar(1,outchar); 
 
                        s++; 
 
                        } 
 
                if(senter0==0) 
 
                        putchar(1,0x0d); 
 
                if(senter1==0) 
 
                        putchar(1,0x0a); 
 
                } 
 
        else 
 
                { 
 
                while(stringlon<=(stringl-1)) 
 
                        { 
 
                        outchar=*(s+stringlon); 
 
                        putchar(1,outchar); 
 
                        stringlon++; 
 
                        } 
 
                if(senter0==0) 
 
                        putchar(1,0x0d); 
 
                if(senter1==0) 
 
                        putchar(1,0x0a);                 
 
                } 
 
        } 
 
 
 
 
 
} 
 
//************************************函数结束************************************ 
 
 
 
字符串输出函数使用方法: 
 
比如要在UART0输出“OURAVR 我们的AVR!”,并且带有回车,换行符, 
 
请使用如下语句: 
 
puts("OURAVR 我们的AVR!",0,0,0,0); 
 
如果要输出确定长度的字符串,则请这样使用: 
 
比如要在UART1输出数组String[10]中的10个字符,不带有回车换行符。 
 
puts(String,1,1,1,10); 
 |   
 
 
 
 |