请教马老师一个AVR单片机串口通信的问题【恢复】
我现在用的单片机是ATMEGA168。需要使用该单片机的串口发送和接收数据。可是程序写好了,用串口调试助手和单片机进行通讯,怎么通信都不能通讯上!
程序如下:
#include "iom168v.h"
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
volatile float height=12.0; //实际当前高度
volatile signed char h=15; //设定高度
void initialize(void);
void USART_Init(void);
void USART_Transmit(void);
void USART_Receive(void);
void main(void)
{
initialize();
USART_Init();
while(1)
{
USART_Transmit();
USART_Receive();
}
}
void initialize(void)
{
DDRB=(1<<PB0)|(1<<PB3)|(1<<PB5);
PORTB=(1<<PB3)|(1<<PB5);
DDRC=(1<<PC2)|(1<<PC3);
DDRD=(1<<PD1)|(1<<PD2)|(1<<PD6)|(1<<PD7);
//PORTD=(1<<PD2)|(1<<PD6)|(1<<PD7);
PORTD=1<<PD2;
}
void USART_Init(void)
{
UCSR0A |=1<<U2X0;
//UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE0);
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
UBRR0H = 0x00;
UBRR0L = 0x67;
}
void USART_Receive(void)
{
while (!(UCSR0A & (1<<RXC0)))
;
h=UDR0;
}
void USART_Transmit(void)
{
while (!(UCSR0A & (1<<UDRE0)))
;
UDR0=height;
}
按道理说,串口调试助手应该能显示h的值,在接受缓冲区!
发送数据也不能成功!
希望马老师能给予解答! 呵呵!
马老师不愧是高手! 哈,我在2楼提醒过的。 问题已经解决!
是硬件封装的问题!
谢谢各位! 【6楼】 ba_wang_mao
===================================
我试过了!
还是不行!
采用中断方式!
硬件也没有发现有什么问题呀? 用ICC向导生成初始化代码。
如果不行,则是硬件的问题。 马老师:
我现在将
void USART_Transmit(void)
{
while (!(UCSR0A & (1<<UDRE0)))
;
UDR0=height;
}
中的语句改为任意一个数比如UDR0=83;
串口调试助手还是没能收到任何信号!
为什么呢?
波特率为9600
应该也没有问题的?
本贴被 sun_changdong 编辑过,最后修改时间:2009-01-15,11:18:05. 你先慢慢把基础打好吧。东拼西凑点代码没有用。真正学会使用单片机没有捷径可走。
volatile float height=12.0; //实际当前高度
。。。。。。。
UDR0 = height;
height是什么类型?UDR0是什么类型?我都不知道如何送出去,你的编译能通过吗?
本贴被 machao 编辑过,最后修改时间:2009-01-14,21:58:51. 仔细检查了一下,没发现马老师您所说的错误!
可是实在找不出其他的错误来!
我用的是ICCAVR,马老师能根据以往的经验,给继续指导一下吗?
多谢!
我现在只让单片机做两件事情,一个是发送,一个是接收。
可是串口调试助手还是什么反映都没有!
现在改为中断方式也不行!真的很奇怪! 你能肯定没有犯其它的错误吗?如接线不对,RX与TX接反了,双方的波特率设置不对等? 发送和接收均采用查询方式! 马老师请教下 握手通讯怎么来写呢?
从来没写过都没什么概念。 建议你买本我编写的教程,参考通信的部分。 什么名字啊?有介绍握手通信的嘛? mark
页:
[1]