急~~~Atmega128 usart程序,为何实现不了pc与单片机通信?用的是avr studio4的编译环境。。。

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h>
#define XTAL 8 //晶振频率,以MHz为单位
void avr_USART1_setup(void)
{
UCSR1B=0b00011000;
UCSR1C=0b00000110;
UBRR1H=0;
UBRR1L=207; //波特率寄存器,2400波特率,使用11.0592Mhz晶振
UCSR1A=0b00100000;
return;
}
void uart1_sendbyte(uchar us_data)
{
UCSR1A &= 0b10111111; //清发送标志位
UCSR1A |= 0b00100000; //提示MCU发送寄存器为空
UDR1=us_data; //写入发送数据
while ((UCSR1A & 0b01000000)==0x00); //等待发送完毕
return;
}
uchar uart1_recievebyte(void)
{
UCSR1A &= 0b01111111; //清接收标志位
UCSR1A |= 0b00100000; //提示MCU发送寄存器为空
while ((UCSR1A & 0b10000000) == 0x00); //等待接收数据
return UDR1;
}
int main(void)
{
uchar data;
avr_USART1_setup();
while(1)
{
data = uart1_recievebyte();
_delay_ms(1);
uart1_sendbyte(data);
_delay_ms(1);*/
}
}
UBRR1L=207; //波特率寄存器,2400波特率,使用11.0592Mhz晶振
_delay_ms(1);*/
上面这两句写错了,改为:
UBRR1L=207; //波特率寄存器,2400波特率,用的是内部的8M的晶振
_delay_ms(1);

首先,你要确认你的接收和发送是可以用的,程序运行没有死机,然后把接收和发送两个脚用22欧电阻(主要是为了保护引脚)连接起来。然后你发送一个数,看能否接收到
其次,你要确实你的单片机与电脑的串口线连接正确,接收对发送,发送对接收,不能错
然后,电脑的波特率,校验位,停止位设置正确
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-20
对于时钟时序要求比较高的UART,一般都是不使用内部的RC震荡电路的,UART允许误差范围是+/- 4%,而内部时钟误差较大,从规格书上看,频率随电压和温度变化的范围达30%,这个是不能和PC通讯的最大原因,所以还是需要外接外部晶振。
第2个回答  2013-08-20
这个也要看看 内部的熔丝是不是正确,如果不正确是实现不了的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网