PROTUES仿真avr16串口不发送
以下是一个AVR16的测试程序,外部8MHz晶振。为什么能收到信息。但是串口不发送。求指教。。#include<avr/io.h>#include<avr/interru...
以下是一个AVR16的测试程序,外部8MHz晶振。为什么能收到信息。但是串口不发送。求指教。。
#include <avr/io.h>
#include <avr/interrupt.h>
#define PIN_TX 1
#define PIN_RX 0
char temp = 0x55;
//9200,8,n,1
void uart_init(void)
{
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 <<UCSZ0);
UBRRH = 0;
UBRRL = 51;
UCSRA = 0x00;
UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
}
void uart_char_send(void)
{
while( !(UCSRA & (1 << UDRE)) ) ;
UDR = temp;
while( !(UCSRA & (1 << TXC)) );
UCSRA |= 1 << TXC;
}
ISR(USART_RXC_vect)
{
while( !(UCSRA & (1 << RXC)) );
PORTB = UDR;
uart_char_send();
}
int main(void)
{
DDRB = 0xff;
PORTB = 0x55;
DDRD = (1 << PIN_TX);
PORTD = 0xff;
uart_init();
sei();
while(1) {
//PORTB = temp;
}
return 0;
}
Atmega16的芯片啊。。 展开
#include <avr/io.h>
#include <avr/interrupt.h>
#define PIN_TX 1
#define PIN_RX 0
char temp = 0x55;
//9200,8,n,1
void uart_init(void)
{
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 <<UCSZ0);
UBRRH = 0;
UBRRL = 51;
UCSRA = 0x00;
UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
}
void uart_char_send(void)
{
while( !(UCSRA & (1 << UDRE)) ) ;
UDR = temp;
while( !(UCSRA & (1 << TXC)) );
UCSRA |= 1 << TXC;
}
ISR(USART_RXC_vect)
{
while( !(UCSRA & (1 << RXC)) );
PORTB = UDR;
uart_char_send();
}
int main(void)
{
DDRB = 0xff;
PORTB = 0x55;
DDRD = (1 << PIN_TX);
PORTD = 0xff;
uart_init();
sei();
while(1) {
//PORTB = temp;
}
return 0;
}
Atmega16的芯片啊。。 展开
2个回答
展开全部
开启发送中断了吗?还有我记得接收到的数据是在UDRE里面的吧?读出UDRE就可以得到数据,还有UDRE==null的发送完成,再打开接收,mega16的发送接收让锋的数据寄存器是公用的,所以发送枯碧后再开启坦败晌接收,接收后再打开发送,时序控制好。
更多追问追答
追问
UDRE只是一个标志位啊。。UDR是数据放的地方啊。。中断我也开了。。UCSRB里面的中断不都开了么。。
追答
UDR里面的数据有可能接收到就被发出去了,所以你做一个控制,发送完UDR把0<< TXEN,再1 << RXEN,UDR接收完1<< TXEN,再0 << RXEN.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询