中科因仑“3+1”工程特种兵精英论坛

标题: 发个带有可选回车换行符输出的MEGA162的双UART程序给大家 [打印本页]

作者: liliuyang    时间: 2016-6-17 14:37
标题: 发个带有可选回车换行符输出的MEGA162的双UART程序给大家
发送采用查询方式,接收采用中断方式。晶振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);





欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4