急!急!急!!! 很简单的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);
} 展开
#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);
} 展开
1个回答
展开全部
更多追问追答
追问
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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询