AVR串口通信乱发数据问题

[复制链接]
3117|9
 楼主| ming2005vs 发表于 2013-1-22 17:07 | 显示全部楼层 |阅读模式
我用的是ATMEGA128,程序如下。程序烧进去后,串口助手显示单片机一直在发00,有时还有其他FF之类的数据,不是我要它发的数据。而且它在一直不停的发。为什么单片机会乱发数据呢?是程序有错吗?求助,谢谢

#include<iom128v.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 uart1_init(uint baud)
{
UCSR1B=0x00;
UCSR1A=0x00;             //控制寄存器清零
UCSR1C=0B10110110;//选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位                              

baud=mclk/16/baud-1    ;   //波特率最大为65K
UBRR1L=baud;                                
UBRR1H=baud>>8;            

}
void uart1_sendB(uchar data)
{
UCSR1B=0x08;
while(!(UCSR1A&(BIT(UDRE1)))) ;
UDR1=data;
UCSR1B=0x00;
}
void main(void)
{
uart1_init(4800);



uart1_sendB(0xE7);
delay(2);
uart1_sendB(0xf2);
delay(2);
uart1_sendB(0x01);

}
ayb_ice 发表于 2013-1-22 17:10 | 显示全部楼层
当然程序问题了
 楼主| ming2005vs 发表于 2013-1-22 17:15 | 显示全部楼层
ayb_ice 发表于 2013-1-22 17:10
当然程序问题了

高手可以指点指点吗?我是初学者,万分感谢啊~~~~
NE5532 发表于 2013-1-22 19:27 | 显示全部楼层
先不要调用发送函数,先看串口的TXD静态是不是高电平。另外波特率不对,接收的数据也是乱的。
ayb_ice 发表于 2013-1-23 08:03 | 显示全部楼层
程序先尽量简单,不要用中断,直接通过查询方式发送接收,甚至直接先发送,间接长点,比如1秒再发下一数据
sedatefire 发表于 2013-2-1 16:33 | 显示全部楼层
1.开始调的时候不用中断。
2.你最好搞个按键触发发送
sedatefire 发表于 2013-2-1 16:34 | 显示全部楼层
我估计你的系统一直在复位吧?看看电源,熔丝配置有没有对。
熔丝配置有电压BOD检测,启动时间,内部or外部晶振等等
gdxizhilang 发表于 2013-2-2 10:26 | 显示全部楼层
先硬件,看看芯片引脚啊,管脚啊等电路上有没有短路等问题;
如果没有问题,再看看熔丝位等有没有问题;
再没有问题,调你的程序吧,只发一个字节看看有木有问题。。
21ID 发表于 2013-2-2 14:14 | 显示全部楼层
先硬件,再软件,程序尽量要简单。
Raizo 发表于 2016-11-18 18:01 | 显示全部楼层
一、不使用UART时单片机引脚默认上电是否为高电平。
二、单片机熔丝位CKOPT是否置位,如果置位就可能出现这种现象。
三、void uart_init(uint32_t baud)
{
        UCSR0B=0x00; //关闭所有使用功能
        UCSR0A=0x00; //异步通信,不使用倍速模式发送
        UCSR0C=0x06; //异步串口通信模式,无奇偶校验,1位停止位,8位数据位
        UBRR0L=(((fosc/baud)/16)-1)%256; //设置波特率寄存器低位       
        UBRR0H=(((fosc/baud)/16)-1)/256; //设置波特率寄存器高位
        UCSR0B=0x98; //接收、发送使能,接收中断使能       
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部