打印
[AVR单片机]

大家帮忙看看这个USART的程序有什么问题?

[复制链接]
963|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenqing870714|  楼主 | 2015-7-7 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机型号:atmega2560,选择的是单片机的USART2口,但是,老是调试不通,上位机接收到的数据不对,下面附上程序:

#define fosc 16000000   //晶振16M
#define baud 9600  //波特率定义

void WaitMs(uint16_t time)
{
uint16_t i=0,j=0;

for(i=0; i<time; i++)
{
   for(j=0;j<5000;j++);
}
}
void usart_init(void)
{
UCSR2B = 0x00;    //关闭USART2
UCSR2A = 0x00;  //串口控制与状态寄存器,不使用倍速
UCSR2C = (0<<UCSZ22)|(1<<UCSZ21)|(1<<UCSZ20);  //异步,数据格式8,N,1
UBRR2H = (fosc/baud/16-1)/256;
UBRR2L = (fosc/baud/16-1)%256;

UCSR2B = (1<<RXEN2)|(1<<TXEN2);  //接收使能,发送使能
}
//发送数据函数
void send(unsigned char i)
{
while(!(UCSR2A&(1<<UDRE2)));  //只有数据寄存器为空时才能发送数据
UDR2=i;
}
//接收数据函数
unsigned char receive(void)
{
while(!(UCSR2A&(1<<RXC2)));  //等待接收完成
return UDR2;
}

int main(void)
{
     
// unsigned char temp;
DDRH|=(1<<PD1);//RXD(PH0)设置为输入,TXD(PH1)设置为输出
PORTH = 0x00;
usart_init();


while(1)
     {
         send(0x42);
         WaitMs(5000);
     }
}
沙发
shenxfs| | 2015-7-7 21:10 | 只看该作者
#define fosc 16000000 这句有问题,应为:#define fosc 16000000UL

使用特权

评论回复
板凳
shenxfs| | 2015-7-7 21:19 | 只看该作者
注意c语言中常量的默认类型是int,而一般是16位,因此fosc的值就被编译器视为0x2400,16000000的十六制数是0xf42400,高16位数0x00f4被忽略。

使用特权

评论回复
地板
wenqing870714|  楼主 | 2015-7-11 08:28 | 只看该作者
shenxfs 发表于 2015-7-7 21:19
注意c语言中常量的默认类型是int,而一般是16位,因此fosc的值就被编译器视为0x2400,16000000的十六制数是 ...

谢谢,以后一定注意这个问题,我这个程序里也还存在其他一些小问题,不过现在已经解决了,非常感谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

46

帖子

2

粉丝