微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > atmega16串口通信

atmega16串口通信

时间:12-01 来源:互联网 点击:

清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器禁止后,TxD引脚恢复其通用I/O功能。

• Bit 2 – UCSZ2: 字符长度

UCSZ2与UCSRC寄存器的UCSZ1:0结合在一起可以设置数据帧所包含的数据位数(字符长度)。

• Bit 1 – RXB8: 接收数据位 8

对9 位串行帧进行操作时,RXB8 是第9 个数据位。读取UDR 包含的低位数据之前首先要读取RXB8。

• Bit 0 – TXB8: 发送数据位8

对9 位串行帧进行操作时,TXB8 是第9 个数据位。写UDR 之前首先要对它进行写操作。

USART 控制和状态寄存器C -UCSRC

• Bit 7 – URSEL: 寄存器选择

通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读UCSRC 时,该位为1 ;当写UCSRC 时, URSEL 为1。

• Bit 6 – UMSEL: USART 模式选择

通过这一位来选择同步或异步工作模式。

• Bit 5:4 – UPM1:0: 奇偶校验模式

这两位设置奇偶校验的模式并使能奇偶校验。如果使能了奇偶校验,那么在发送数据,发送器都会自动产生并发送奇偶校验位。对每一个接收到的数据,接收器都会产生一奇偶值,并与UPM0 所设置的值进行比较。如果不匹配,那么就将UCSRA 中的PE 置位。

• Bit 3 – USBS: 停止位选择

通过这一位可以设置停止位的位数。接收器忽略这一位的设置。

• Bit 2:1 – UCSZ1:0: 字符长度

UCSZ1:0与UCSRB寄存器的 UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长度)。

• Bit 0 – UCPOL: 时钟极性

这一位仅用于同步工作模式。使用异步模式时,将这一位清零。UCPOL 设置了输出数据的改变和输入数据采样,以及同步时钟XCK 之间的关系。

USART 波特率寄存器- UBRRL和UBRRH

UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。

• Bit 15 – URSEL: 寄存器选择

通过该位选择访问UCSRC 寄存器或UBRRH 寄存器。当读UBRRH 时,该位为0 ;当写UBRRH 时, URSEL 为0。

• Bit 14:12 – 保留位

这些位是为以后的使用而保留的。为了与以后的器件兼容,写UBRRH 时将这些位清零。

• Bit 11:0 – UBRR11:0: USART 波特率寄存器

这个12 位的寄存器包含了USART 的波特率信息。其中UBRRH 包含了USART 波特率高4 位,UBRRL 包含了低8 位。波特率的改变将造成正在进行的数据传输受到破坏。写UBRRL 将立即更新波特率分频器。

进行通信之前首先要对USART 进行初始化。初始化过程通常包括波特率的设定,帧结构的设定,以及根据需要使能接收器或发送器。对于中断驱动的USART 操作,在初始化时首先要清零全局中断标志位( 全局中断被屏蔽)

串口初始化:

使用串口->使能接收 ->使能发送->波特率(本例使用 9600)->奇偶校验(disable)->数据位数(8bit)->中断(RX Complete interrupt)

//ICC-AVR application builder : 2007-5-10 下午 08:51:56

// Target : M16

// Crystal: 11.059Mhz

//UART0 initialisation

// desired baud rate: 9600

// actual: baud rate:9600 (0.0%)

// char size: 8 bit

// parity: Disabled

void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = 0x86;

UBRRL = 0x47; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98;

}

//省略了端口初始化

//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

uart0_init(); //注意这句 调用串口初始化

MCUCR = 0x00;

GICR = 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialised

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top