急!急!急!!! 很简单的Atmega16单片机串口通信程序,请大家看一下哪有问题

程序如下,主要现象是波特率分析写的9600,可在串口助手中必须改为1200,同理19200必须改为4800,忘玩过的大神解答#include<iom16v.h>#incl... 程序如下,主要现象是波特率分析写的9600,可在串口助手中必须改为1200,同理19200必须改为4800,忘玩过的大神解答
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int

#define mclk 8000000

void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}

void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=0x86;
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0X02; //配置TX为输出(很重要)

}

void uart_sendB(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))) ;
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}

void main()
{
uchar i=9;
uchar j='c';
uart_init(9600);
uart_sendB(i);delay(30);
uart_sendB(j);delay(30);
}
展开
 我来答
c3344c
2013-08-07 · TA获得超过2418个赞
知道小有建树答主
回答量:966
采纳率:57%
帮助的人:682万
展开全部

AVR单片机C语言的int类型变量是16位的,最大能容纳的数字是65535,而你的baud怎能容下8000000的数字呢,将函数参数中的uint baud改为loog或float baud试试,或者在mega16的数据手册中按照提供的参数设置波特率:

更多追问追答
追问
8M不是系统时钟频率吗,改的话我改成:
baud=51 ; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
还是不行啊

请你帮我试一下,非常感谢
追答
放弃baud=mclk/16/baud-1 ;   //波特率最大为65K
采用:
UBRRL=51;
UBRRH=0; //设置波特率为9600Hz
这样就可以了。从mega18的数据表中可以看出,8M的晶体的误差是0.2%,可能不会影响正常通信,但如果想获得精准的波特率,最好选择误差=0的晶振配置选项,比较常用的是7.3728M。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式