搜索
bottom↓
回复: 31

发个带有可选回车换行符输出的MEGA162的双UART程序给大家。

[复制链接]

出0入0汤圆

发表于 2005-3-17 16:30:12 | 显示全部楼层 |阅读模式
发送采用查询方式,接收采用中断方式。晶振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);

出0入0汤圆

 楼主| 发表于 2005-3-17 20:03:00 | 显示全部楼层
大家不要光看,光下哦!:)多提点意见啊,没意见也顶一下支持一下哦:)
头像被屏蔽

出0入0汤圆

发表于 2005-3-17 20:06:58 | 显示全部楼层
帮你顶一下!

出0入0汤圆

 楼主| 发表于 2005-3-17 20:11:19 | 显示全部楼层
呵呵 谢谢ARMOK啦!

出0入0汤圆

发表于 2005-3-17 21:15:10 | 显示全部楼层
icc的风格啊,我喜欢!哈哈

出0入0汤圆

 楼主| 发表于 2005-3-18 07:36:19 | 显示全部楼层
呵呵 就是用ICC做的哦!

出0入0汤圆

发表于 2006-5-12 16:20:26 | 显示全部楼层
写得好

正好满足需要

出0入0汤圆

发表于 2006-5-26 16:23:32 | 显示全部楼层
谢谢借鉴一下

出0入0汤圆

发表于 2006-5-26 16:46:56 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2006-5-26 17:06:17 | 显示全部楼层
这个一定要顶一下。

出0入0汤圆

发表于 2006-6-13 15:12:54 | 显示全部楼层
非常感谢!

出0入54汤圆

发表于 2006-6-13 15:15:02 | 显示全部楼层
UP一下

出0入0汤圆

发表于 2006-6-13 15:30:55 | 显示全部楼层
刚才仔细看了一下

void puts(unsigned char *s,int upart,int senter0,int senter1,int stringl)



//senter0表示结尾是否使用0x0d,0表示使用,其他表示不使用

//senter1表示结尾是否使用0x0a,0表示使用,其他表示不使用

其中senter0和senter1建议使用BOOLEAN类型,以增强程序的可读性;

typedef BOOLEAN unsigned char;

出0入0汤圆

发表于 2006-6-13 16:15:08 | 显示全部楼层
还有发送以及接收中断里的

if(stringlon>=100)

在发送中断里是不是应该为

if(stringlon>=50)

出0入0汤圆

 楼主| 发表于 2006-6-13 18:38:06 | 显示全部楼层
确实有错误,不好意思了。

帖子已经不能改了,后来的看到后注意下吧。

出0入0汤圆

发表于 2007-4-2 15:39:38 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2007-8-6 17:51:21 | 显示全部楼层
顶一个,正好要用

出0入0汤圆

发表于 2007-10-24 13:38:35 | 显示全部楼层
我刚好也要写这段程序,谢谢,可受益拉

出0入0汤圆

发表于 2007-11-3 15:45:33 | 显示全部楼层
不错!

出0入0汤圆

发表于 2007-12-5 09:30:59 | 显示全部楼层
顶下!

出0入0汤圆

发表于 2008-3-14 21:55:09 | 显示全部楼层
写得很好,
学习了

出0入0汤圆

发表于 2008-3-22 09:42:32 | 显示全部楼层
怎么发送汉字呢?

出0入0汤圆

 楼主| 发表于 2008-4-19 11:18:11 | 显示全部楼层
直接写就可以啦,ICC的编译器会自己把汉字转成相应的ASCII码的,只要接收端能够接收显示中文就行了。

出0入0汤圆

发表于 2008-4-19 12:03:07 | 显示全部楼层
好帖。

出0入0汤圆

发表于 2008-4-19 13:57:15 | 显示全部楼层
收到!回去琢磨琢磨

出0入0汤圆

发表于 2008-6-25 21:16:40 | 显示全部楼层
学习了,正在找这样的资料

出0入0汤圆

发表于 2008-6-26 00:55:05 | 显示全部楼层
puts("OURAVR 我们的AVR!\r\n")   这么写不行吗?

出0入0汤圆

发表于 2010-1-7 15:01:47 | 显示全部楼层
能够发生的数据量太小了吧!能不能发个支持大数据量的啊!!

出0入0汤圆

发表于 2010-1-7 15:02:04 | 显示全部楼层
能够发生的数据量太小了吧!能不能发个支持大数据量的啊!!

出0入0汤圆

发表于 2010-4-28 16:12:55 | 显示全部楼层
厉害

出0入0汤圆

发表于 2013-3-4 15:21:09 | 显示全部楼层
谢谢,我是初学者,看到你的程序,学到了很多,我也会将这份爱心接力下去的,让后来的初学者有资源可学。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 18:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表