atmega8 串口收发错误请教
本帖最后由 liweiyuangangan 于 2013-1-11 14:17 编辑#include <iom8v.h>
#include <macros.h>
void port_init(void)
{
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00; //m103 output only
DDRC= 0x00;
PORTD = 0x00;
DDRD= 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR= 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/************************************
Name :小延时程序
Target :atmega8
Crystal(晶振):8M
************************************/
void delay()
{
unsigned int i;//最大值65536
for (i=0;i<40000;i++)
{;}
}
/***********************************************************
用 途:串口发送接收程序
Taget :mega8
crystal :8M
介 绍:
**********************************************************/
//晶振和波特率
#define fosc 8000000
#define baud 9600
//UART初始化函数
void init_uart()
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
}
//字符输出
void uart_putchar(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
UDR=c;
}
//字符输入
unsigned char uart_getchar()
{
while(!(UCSRA&(1<<RXC))){;}//有没有接收到数据
return UDR;
}
//带回车的字符串输出
int uart_print(char *s)
{
while(*s)
{
uart_putchar(*s);
s++;
}
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);
return 1;
}
//不带回车换行的字符串输出
void uart_prints(char *s)
{
while(*s)
{
uart_putchar(*s);
s++;
}
}
//接收中断
#pragma interrupt_handler uart_rec_int:iv_USART_RX
void uart_rec_int()
{
uart_putchar(UDR);
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);
}
//**************************************************************************
void main()
{
port_init();
init_devices();
init_uart();
uart_print("xiaozhiyong");
while(1)
{
uart_print("aaa");
//delay();
}
}
上面的程序,但是设置的是9600波特率,连电脑后,看以9600波特率看数据不行,都是一个乱码,换成1200就可以看出数据而且正确,好奇怪,是不是程序有问题,求教育,忘说了,用的是8m外部晶振
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
改为
UBRRH=0;
UBRRL=51; //9600
也是不行,参考帖子http://www.amobbs.com/forum.php?mod=viewthread&tid=3544768&highlight=mega8%2BUSART
请问程序有没有错啊?当发送就电脑显示跟设置的不一样,各位大牛,求指教啊 这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率 不用看了 就是波特率设置的问题 误差太大 通信当然错误的 shjw 发表于 2013-1-11 08:57 static/image/common/back.gif
这个应该是你的错,注意阅读数据手册。你可以发个0b10101010数据在示波器上求证一下数据波特率 ...
已经查阅过资料啦,改波特率有10多次了,你说UBRR = 51也改过,UBRR =37也改过,有可能是熔丝设置错了么?还是电路有问题啊? yklstudent 发表于 2013-1-11 12:09 static/image/common/back.gif
不用看了 就是波特率设置的问题 误差太大 通信当然错误的
但是按照atmega8后面的数据fosc = 8.0000Mhz时,对应9600波特率,并且U2X=0时,UBRR = 51 ,误差是0。2%,这个也试过了 UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
???????
你这个计算结果值是多少????? yklstudent 发表于 2013-1-11 13:13 static/image/common/back.gif
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
???????
这只是其中一个版本,后来我也按芯片资料改过了,但是还是不行,你是想说改为UBRRL = ((fosc/16/baud)-1)%256;UBRRH = ((fosc/16/baud)-1)/256;或者UBRR = fosc/16/baud- 1 ;//就是UBRR = 51;9600波特率,这个我也改过了,已经改过不下10种程序 proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问题的
波特率设置可以
UBRR = (fosc/16/(baud))-1;
这样就可以了 yklstudent 发表于 2013-1-11 14:46 static/image/common/back.gif
proteus仿真 没什么问题 估计多半硬件有点问题吧 或者芯片坏了 自己不凡找找硬件的问题看看 软件是没什么问 ...
非常感谢你,耽误左你一日的时间,多谢,{:2_31:} 我再去查查电路,毕竟电路不是我做的 liweiyuangangan 发表于 2013-1-11 15:13 static/image/common/back.gif
非常感谢你,耽误左你一日的时间,多谢, 我再去查查电路,毕竟电路不是我做的 ...
自己去查查吧 小心说硬件有问题 人家跟你拼命
页:
[1]