AVR mega128简略的串行通讯原理
单片机同PC通讯是用的都是UART进行通讯,其实各种单片机的串行通讯原理是彻底相同的,而不同的仅仅是器操控的寄存器不同。关于mega128来说比51功用强大些,彻底不必占用任何其他资源。只需操控好相应的寄存器就好了。
ATmega128具有两个USART:USART0和USART1,这两个USART的详细功用将在下面描绘。USART0和USART1运用不同的IO寄存器留意:在ATmega103兼容形式中USART1.UBRR0H和UCRS0C无效.这意味ATmega128仅能够运用USART0以异步方法作业
USARTn 数据寄存器-UDRn:承受和发送数据寄存器
只要当UCSRA寄存器的UDRE标志置位后才能够对发送缓冲器进行写操作。假如UDRE没有置位,那么写入UDR 的数据会被USART 发送器疏忽。当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。然后数据串行地从TxD 引脚输出。
接纳缓冲器包括一个两级FIFO,一旦接纳缓冲器被寻址FIFO 就会改动它的状况。因而不要对这一存储单元运用读- 修正- 写指令(SBI 和CBI)。运用位查询指令(SBIC 和SBIS)时也要当心,由于这也有或许改动FIFO 的状况。
USARTn 操控和状况寄存器A -UCSRnA:
&8226;Bit 7 – RXCn: USART 接纳完毕
接纳缓冲器中有未读出的数据时RXCn 置位,不然清零。接纳器制止时,接纳缓冲器被改写,导致RXCn 清零。RXCn 标志可用来发生接纳完毕中止( 见对RXCIEn 位的描绘)。
&8226; Bit 6 – TXCn: USART 发送完毕
发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDRn) 为空时TXCn 置位。履行发送完毕中止时TXCn 标志主动清零,也能够经过写1 进行铲除操作。TXCn 标志可用来发生发送完毕中止( 见对TXCIEn 位的描绘)。
&8226; Bit 5 – UDREn: USART 数据寄存器空
UDREn 标志指出发送缓冲器(UDRn) 是否准备好接纳新数据。UDREn 为1 阐明缓冲器为空,已准备好进行数据接纳。UDREn 标志可用来发生数据寄存器空中止( 见对UDRIEn位的描绘)。复位后UDREn 置位,标明发送器现已安排妥当。
&8226; Bit 4 – FEn: 帧过错
假如接纳缓冲器接纳到的下一个字符有帧过错,即接纳缓冲器中的下一个字符的第一个中止位为0,那么FEn 置位。这一位一向有用直到接纳缓冲器(UDRn) 被读取。当接纳到的中止位为1 时, FEn 标志为0。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 3 – DORn: 数据过速
数据过速时DORn 置位。当接纳缓冲器满( 包括了两个数据),接纳移位寄存器又有数据,若此刻检测到一个新的开始位,数据溢出就发生了。这一位一向有用直到接纳缓冲器(UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 2 – UPEn: 奇偶校验过错
当奇偶校验使能(UPMn1 = 1),且接纳缓冲器中所接纳到的下一个字符有奇偶校验过错时UPEn 置位。这一位一向有用直到接纳缓冲器 (UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 1 – U2Xn: 倍速发送
这一位仅对异步操作有影响。运用同步操作时将此位清零。此方位1 可将波特率分频因子从16 降到8,然后有用的将异步通讯形式的传输速率加倍。
&8226; Bit 0 – MPCMn: 多处理器通讯形式
设置此位将发动多处理器通讯形式。MPCMn 置位后, USARTn 接纳器接纳到的那些不包括地址信息的输入帧都将被疏忽。发送器不受MPCMn 设置的影响。
USARTn 操控和状况寄存器B -UCSRnB:
&8226; Bit 7 – RXCIEn: 接纳完毕中止使能
置位后使能RXCn 中止。当RXCIEn 为1,大局中止标志位SREG 置位,UCSRnA 寄存器的RXCn 亦为1 时能够发生USARTn 接纳完毕中止。
&8226; Bit 6 – TXCIE: 发送完毕中止使能
置位后使能TXCn 中止。当TXCIEn 为1,大局中止标志位SREG 置位, UCSRnA 寄存器的TXCn 亦为1 时能够发生USARTn 发送完毕中止。
&8226; Bit 5 – UDRIEn: USART 数据寄存器空中止使能
置位后使能UDREn 中止。当UDRIEn 为1,大局中止标志位SREG 置位, UCSRnA 寄存器的UDREn 亦为1 时能够发生USARTn 数据寄存器空中止。
&8226; Bit 4 – RXENn: 接纳使能
置位后将发动USARTn 接纳器。RxDn 引脚的通用端口功用被USARTn 功用所替代。制止接纳器将改写接纳缓冲器,并使 FEn、DORn 及UPEn 标志无效。
&8226; Bit 3 – TXENn: 发送使能
置位后将发动将发动USARTn 发送器。TxDn 引脚的通用端口功用被USARTn 功用所替代。TXENn 清零后,只要比及一切的数据发送完成后发送器才能够真实制止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器制止后,TxDn 引脚康复其通用I/O 功用。
&8226; Bit 2 – UCSZn2: 字符长度
UCSZn2与UCSRnC寄存器的UCSZn1:0结合在一起能够设置数据帧所包括的数据位数(字符长度)。
&8226; Bit 1 – RXB8n: 接纳数据位8
对9 位串行帧进行操作时,RXB8n 是第9 个数据位。读取UDRn 包括的低位数据之前首要要读取RXB8n。
&8226; Bit 0 – TXB8n: 发送数据位8
对9位串行帧进行操作时,TXB8n是第9个数据位。写UDRn之前首要要对它进行写操作。
USARTn 操控和状况寄存器C -UCSRnC:
&8226; Bit 7 – 保存位
该位保存。为与未来器材兼容,对UCSRnC 写入时该位有必要写0 。
&8226; Bit 6 – UMSELn: USART 形式挑选
经过这一位来挑选同步或异步作业形式。
&8226; Bit 5:4 – UPMn1:0: 奇偶校验形式
这两位设置奇偶校验的形式并使能奇偶校验。假如使能了奇偶校验,那么在发送数据,发送器都会主动发生并发送奇偶校验位。对每一个接纳到的数据,接纳器都会发生一奇偶值,并与UPMn0所设置的值进行比较。假如不匹配,那么就将UCSRnA中的UPEn置位。
&8226; Bit 3 – USBSn: 中止位挑选
经过这一位能够设置中止位的位数。接纳器疏忽这一位的设置。
&8226; Bit 2:1 – UCSZn1:0: 字符长度
UCSZn1:0与UCSRnB寄存器的 UCSZn2结合在一起能够设置数据帧包括的数据位数(字符长度)。
Bit 0 – UCPOLn: 时钟极性
这一位仅用于同步作业形式。运用异步形式时,将这一位清零。UCPOLn 设置了输出数据的改动和输入数据采样,以及同步时钟XCKn 之间的联系。
USART 波特率寄存器-UBRRnL 和UBRRnH:
&8226; Bit 15:12 – 保存
这些位是为今后的运用而保存的。为了与今后的器材兼容,写UBRRnH 时将这些位清零。
&8226; Bit 11:0 – UBRRn11:0: USARTn 波特率寄存器
这个12 位的寄存器包括了USARTn 的波特率信息。其间UBRRnH 包括了USARTn 波特率高4 位,UBRRnL 包括了低8 位。波特率的改动将形成正在进行的数据传输受到破坏。写UBRRnL 将当即更新波特率分频器。
附:试验程序
/***************************************************** UCSR0C=0x06; /* 设置数据格式,8位数据位,1位中止位 */ /***************************************************** /***************************************************** }
函 数 名:void uart_init(void)
功 能:初始化串口
说 明:依据要求设置好波特率和数据位
进口参数:无
返 回 值:无
*****************************************************/
void uart_init(void)
{
UBRR0H=0; /* 设置波特率9600,时钟8MHz,查表UBRR=51 */
UBRR0L=51; /* UBR=51 */
UCSR0B=(1<
}
函 数 名:void Uart_Transmit(unsigned char c)
功 能:向串口发送一字符(查询方法)
说 明:只要当寄存器UCSRA的UDRE标志置位后,才能够对发送缓冲进行写操作
进口参数:无
返 回 值:无
*****************************************************/
void Uart_Transmit(unsigned char c)
{
while( !( UCSR0A & (1<
UDR0=c; /* 发送数据 */
}
函 数 名:void Uart_Transmits(unsigned char *arr)
功 能:向串口写入字符串(查询方法)
说 明:
进口参数:无
返 回 值:无
*****************************************************/
void Uart_Transmits(unsigned char *arr)
{
do
{
Uart_Transmit(*arr);
arr++;
}while(*arr!=/0);