AVR编译环境搭建
安装Window XP虚拟机,ICCAVR V6在该系统上才能稳定运行,如有需要自行下载更高版本。
安装ICCAVR编译器
安装Protuse进行仿真

了解ATmega16的寄存器映射
SART 分为了三个主要部分 : 时钟发生器,发送器和接收器。控制寄存器由三个单元共享。时钟发生器包含同步逻辑,通过它将波特率发生器及为从机同步操作所使用的外部输入时钟同步起来。 XCK ( 发送器时钟 ) 引脚只用于同步传输模式。发送器包括一个写缓冲器,串行移位寄存器,奇偶发生器以及处理不同的帧格式所需的控制逻辑。写缓冲器可以保持连续发送数据而不会在数据帧之间引入延迟。由于接收器具有时钟和数据恢复单元,它是 USART 模块中最复杂的。恢复单元用于异步数据的接收。除了恢复单元,接收器还包括奇偶校验,控制逻辑,移位寄存器和一个两级接收缓冲器 UDR。接收器支持与发送器相同的帧格式,而且可以检测帧错误,数据过速和奇偶校验错误。
时钟产生
时钟产生逻辑为发送器和接收器产生基础时钟。 USART 支持 4 种模式的时钟 : 正常的异步模式,倍速的异步模式,主机同步模式,以及从机同步模式。 USART 控制位 UMSEL和状态寄存器 C (UCSRC) 用于选择异步模式和同步模式。倍速模式 ( 只适用于异步模式) 受控于 UCSRA 寄存器的 U2X。使用同步模式 (UMSEL = 1) 时, XCK 的数据方向寄存器(DDR_XCK)决定时钟源是由内部产生(主机模式)还是由外部生产(从机模式)。仅在同步模式下 XCK 有效。
波特率发生器:
USART 的波特率寄存器 UBRR 和降序计数器相连接,一起构成可编程的预分频器或波特率发生器。降序计数器对系统时钟计数,当其计数到零或 UBRRL 寄存器被写时,会自动装入 UBRR 寄存器的值。当计数到零时产生一个时钟,该时钟作为波特率发生器的输出时钟,输出时钟的频率为 fosc/(UBRR+1)。发生器对波特率发生器的输出时钟进行 2、 8或 16 的分频,具体情况取决于工作模式。波特率发生器的输出被直接用于接收器与数据恢复单元。数据恢复单元使用了一个有2、 8或16个状态的状态机,具体状态数由UMSEL、U2X 与 DDR_XCK 位设定的工作模式决定。
数据寄存器-UDR
要发送串口信息时,将要发送的消息写入UDR寄存器内,当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。然后数据串行地从 TxD 引脚输出。
接收串口信息时,外部串口数据经由两级fifo、接收移位寄存器后写入UDR,通过判断接收完成标志可以读出UDR的值达到读出接收数据的功能。
控制状态寄存器-UASRA
Bit 7 – RXC: USART 接收结束
接收缓冲器中有未读出的数据时 RXC 置位,否则清零。接收器禁止时,接收缓冲器被刷新,导致 RXC 清零。 RXC 标志可用来产生接收结束中断 ( 见对 RXCIE 位的描述 )。
• Bit 6 – TXC: USART 发送结束
发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDR) 为空时 TXC 置位。执行发送结束中断时 TXC 标志自动清零,也可以通过写 1 进行清除操作。 TXC 标志可用来产生发送结束中断 ( 见对 TXCIE 位的描述 )。
• Bit 5 – UDRE: USART 数据寄存器空
UDRE标志指出发送缓冲器(UDR)是否准备好接收新数据。 UDRE为1说明缓冲器为空,已准备好进行数据接收。 UDRE标志可用来产生数据寄存器空中断(见对UDRIE位的描述)。复位后 UDRE 置位,表明发送器已经就绪。
• Bit 4 – FE: 帧错误
如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个停止位为 0,那么 FE 置位。这一位一直有效直到接收缓冲器 (UDR) 被读取。当接收到的停止位为 1 时, FE 标志为 0。对 UCSRA 进行写入时,这一位要写 0。
• Bit 3 – DOR: 数据溢出
数据溢出时 DOR 置位。当接收缓冲器满 ( 包含了两个数据 ),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。这一位一直有效直到接收缓冲器(UDR) 被读取。对 UCSRA 进行写入时,这一位要写 0。
• Bit 2 – PE: 奇偶校验错误
当奇偶校验使能 (UPM1 = 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时UPE 置位。这一位一直有效直到接收缓冲器 (UDR) 被读取。对 UCSRA 进行写入时,这一位要写 0。
• Bit 1 – U2X: 倍速发送
这一位仅对异步操作有影响。使用同步操作时将此位清零。
此位置 1 可将波特率分频因子从 16 降到 8,从而有效的将异步通信模式的传输速率加倍。
• Bit 0 – MPCM: 多处理器通信模式
设置此位将启动多处理器通信模式。 MPCM 置位后, USART 接收器接收到的那些不包含地址信息的输入帧都将被忽略。发送器不受MPCM设置的影响。
控制状态寄存器-UCSRB
• Bit 7 – RXCIE: 接收结束中断使能
置位后使能 RXC 中断。当 RXCIE 为 1,全局中断标志位 SREG 置位, UCSRA 寄存器的 RXC 亦为 1 时可以产生 USART 接收结束中断。
• Bit 6 – TXCIE: 发送结束中断使能
置位后使能 TXC 中断。当 TXCIE 为 1,全局中断标志位 SREG 置位, UCSRA 寄存器的TXC 亦为 1 时可以产生 USART 发送结束中断。
• Bit 5 – UDRIE: USART 数据寄存器空中断使能
置位后使能 UDRE 中断。当 UDRIE 为 1,全局中断标志位 SREG 置位, UCSRA 寄存器的 UDRE 亦为 1 时可以产生 USART 数据寄存器空中断。
• Bit 4 – RXEN: 接收使能
置位后将启动 USART 接收器。 RxD 引脚的通用端口功能被 USART 功能所取代。禁止接收器将刷新接收缓冲器,并使 FE、 DOR 及 PE 标志无效。
• Bit 3 – TXEN: 发送使能
置位后将启动将启动 USART 发送器。 TxD 引脚的通用端口功能被 USART 功能所取代。TXEN 清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器禁止后, 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 之前首先要对它进行写操作。
控制状态寄存器-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 之间的关系。
本次串口调试,使用的晶振为外部高速晶振14.31818Mhz,经过波特率计算
波特率9600时,向UBRR寄存器中写入95
波特率19200时,向UBRR寄存器中写入47
波特率115200时,向UBRR寄存器中写入7
主要程序如图:
经由调试,确定上述代码能在ATMEGA16单片机上稳定执行,可实现串口收发的功能,也预留了为后续项目需求数据的接口,方便后续更改。
ATmega16单片机串口开发