AVR ATmega16简单的串行通讯原理

单片机同PC通讯是用的都是UART进行通讯,其实各种单片机的串行通讯原理是完全相同的,而不同的仅仅是器控制的寄存器不同。对于mega16来说比51功能强大些,完全不用占用任何别的资源。


ATmega16具有两个USART:USART0和USART1。USART0和USART1使用不同的IO寄存器。

USARTn 数据寄存器-UDRn:接受和发送数据寄存器

只有当UCSRA寄存器的UDRE标志置位后才可以对发送缓冲器进行写操作。如果UDRE没有置位,那么写入UDR 的数据会被USART 发送器忽略。当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。然后数据串行地从TxD 引脚输出。

接收缓冲器包括一个两级FIFO,一旦接收缓冲器被寻址FIFO 就会改变它的状态。因此不要对这一存储单元使用读- 修改- 写指令(SBI 和CBI)。使用位查询指令(SBIC 和SBIS)时也要小心,因为这也有可能改变FIFO 的状态。

USARTn 控制和状态寄存器A -UCSRnA:

Bit 7 – RXCn: USART 接收结束

接收缓冲器中有未读出的数据时RXCn 置位,否则清零。接收器禁止时,接收缓冲器被刷新,导致RXCn 清零。RXCn 标志可用来产生接收结束中断( 见对RXCIEn 位的描述)。

Bit 6 – TXCn: USART 发送结束

发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDRn) 为空时TXCn 置位。执行发送结束中断时TXCn 标志自动清零,也可以通过写1 进行清除操作。TXCn 标志可用来产生发送结束中断( 见对TXCIEn 位的描述)。

Bit 5 – UDREn: USART 数据寄存器空

UDREn 标志指出发送缓冲器(UDRn) 是否准备好接收新数据。UDREn 为1 说明缓冲器为空,已准备好进行数据接收。UDREn 标志可用来产生数据寄存器空中断( 见对UDRIEn位的描述)。复位后UDREn 置位,表明发送器已经就绪。

Bit 4 – FEn: 帧错误

如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个停止位为0,那么FEn 置位。这一位一直有效直到接收缓冲器(UDRn) 被读取。当接收到的停止位为1 时, FEn 标志为0。对UCSRnA 进行写入时,这一位要写0。

Bit 3 – DORn: 数据过速

数据过速时DORn 置位。当接收缓冲器满( 包含了两个数据),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。这一位一直有效直到接收缓冲器(UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。

Bit 2 – UPEn: 奇偶校验错误

当奇偶校验使能(UPMn1 = 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时UPEn 置位。这一位一直有效直到接收缓冲器 (UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。

Bit 1 – U2Xn: 倍速发送

这一位仅对异步操作有影响。使用同步操作时将此位清零。此位置1 可将波特率分频因子从16 降到8,从而有效的将异步通信模式的传输速率加倍。

Bit 0 – MPCMn: 多处理器通信模式

设置此位将启动多处理器通信模式。MPCMn 置位后, USARTn 接收器接收到的那些不包含地址信息的输入帧都将被忽略。发送器不受MPCMn 设置的影响。

USARTn 控制和状态寄存器B -UCSRnB:

Bit 7 – RXCIEn: 接收结束中断使能

置位后使能RXCn 中断。当RXCIEn 为1,全局中断标志位SREG 置位,UCSRnA 寄存器的RXCn 亦为1 时可以产生USARTn 接收结束中断。

Bit 6 – TXCIE: 发送结束中断使能

置位后使能TXCn 中断。当TXCIEn 为1,全局中断标志位SREG 置位, UCSRnA 寄存器的TXCn 亦为1 时可以产生USARTn 发送结束中断。

Bit 5 – UDRIEn: USART 数据寄存器空中断使能

置位后使能UDREn 中断。当UDRIEn 为1,全局中断标志位SREG 置位, UCSRnA 寄存器的UDREn 亦为1 时可以产生USARTn 数据寄存器空中断。

Bit 4 – RXENn: 接收使能

置位后将启动USARTn 接收器。RxDn 引脚的通用端口功能被USARTn 功能所取代。禁止接收器将刷新接收缓冲器,并使 FEn、DORn 及UPEn 标志无效。

Bit 3 – TXENn: 发送使能

置位后将启动将启动USARTn 发送器。TxDn 引脚的通用端口功能被USARTn 功能所取代。TXENn 清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器禁止后,TxDn 引脚恢复其通用I/O 功能。

Bit 2 – UCSZn2: 字符长度

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

Bit 1 – RXB8n: 接收数据位8

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

Bit 0 – TXB8n: 发送数据位8

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





附:实验程序

/***************************************************** 

 函 数 名:void uart_init(void)

 功    能:初始化串口

 说    明:根据要求设置好波特率和数据位

 入口参数:无 

 返 回 值:无  

 *****************************************************/ 

void uart_init(void)

{

UBRR0H=0; /* 设置波特率9600,时钟8MHz,查表UBRR=51 */

UBRR0L=51;    /* UBR=51 */

UCSR0B=(1<<RXEN0)|(1<<TXEN0);





UCSR0C=0x06;  /* 设置数据格式,8位数据位,1位停止位 */

}





/***************************************************** 

 函 数 名:void Uart_Transmit(unsigned char c) 

 功    能:向串口发送一字符(查询方式)

 说    明:只有当寄存器UCSRA的UDRE标志置位后,才可以对发送缓冲进行写操作

 入口参数:无 

 返 回 值:无  

 *****************************************************/

void Uart_Transmit(unsigned char c)

{

while( !( UCSR0A & (1<<UDRE0)) )

UDR0=c;   /* 发送数据 */

}


/***************************************************** 
 函 数 名:void Uart_Transmits(unsigned char *arr) 
 功    能:向串口写入字符串(查询方式)
 说    明:
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void Uart_Transmits(unsigned char *arr)
{
   do
{
   Uart_Transmit(*arr);
arr++;
}while(*arr!='/0');