嗨,我是新手,我需要帮助。它假设只是在realterm中显示'S'而不是'null'。会出现什么问题?它可以是注册吗?还是代码本身?
#include <avr/io.h>
#include <util/delay.h>
void UART_Init(unsigned int ubrr)
{
UBRRH=(unsigned int)(ubrr>>8);
UBRRL=(unsigned int)ubrr;
UCSRA=0x00;
UCSRB=(1<<TXEN)|(1<<RXEN);
UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
}
void UART_Tx(unsigned char chr)
{
while (bit_is_clear(UCSRA,UDRE)){}
UDR=chr;
}
int main(void)
{
UART_Init(95);
DDRD|=0B11111111;
PORTD|=0B11111111;
while(1){
_delay_ms(10);
UART_Tx('S');
}
}
系统正在使用14745600 Hz的xtal运行。主机速度为9600波特。所有设置应为8N1。
答案 0 :(得分:2)
写入UCSRC寄存器时需要设置URSEL。
更改
UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
到
UCSRC=(1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
从数据表中:
UBRRH寄存器与UCSRC寄存器共享相同的I / O位置。因此有些 访问此I / O位置时必须特别注意。在对此I / O位置进行写访问时,写入的值的高位USART寄存器选择(URSEL)位控制将写入的两个寄存器之一。如果URSEL是 在写操作期间,0将更新UBRRH值。如果URSEL是UCSRC,那就是UCSRC 设置将更新。
其余代码对我来说很好。
答案 1 :(得分:0)
更改UART_Tx('S');使用UART_Tx(“S”);