使用AVR的USART进行自发自收(将发送引脚RXD短接到接收引脚TXD),发出数据:0,1,2。。。数据,能接收到自己发出的数据:0,1,2。。。使用LED作出简单指示。
USART自发自收,使用PB口的LED指示接收到的数据,观察是否与发送的数据一致。
#include
#define DISP_PORT PORTB
#define DISP_DDR DDRB
/*
程序功能:初始化UART为:8位,9.6K,接收中断
注意事项:基于7.3728M晶振
程序名称:UART初始化程序
*/
void uart0_init (void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00; //U2X = 0,不加倍数率
UCSRC = 0x86; //固定的
/* 设置帧格式 : 8 个数据位 , 2 个停止位 */
//UCSRC = (1<
UBRRL = 47; //set baud rate lo,波特率为9.6K
//UBRRL=(fosc/16/(baud+1))%256; fosc是晶振,baud为波特率
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98; //接收中断允许,接收缓冲自动清空,接收允许
}
/*程序名称:UART接收中断服务程序*/
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
DISP_PORT = UDR;//显示接收到的数据
//如:接收到"1",显示0X31
//delay50ms(1);
}
void mcu_init(void)
{
CLI();
uart0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
}
void main()
{
uint8 counter=0;
mcu_init();
DISP_DDR=0xFF;
while(1)
{
UDR=counter++; //发送数据,数据为变量counter
while(!(UCSRA&0x40)); //等待发送结束
//Bit 6 – TXC: USART 发送结束
//发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时
//TXC 置位。执行发送结束中断时 TXC 标志自动清零,
//也可以通过写 1 进行清除操作。
UCSRA|=0x40; //清除发送结束标志位
delay50ms(4);
}
}