AVR单片机串口代码while(!(UCSR0A&(BIT(UDRE0)))) ;
UDR0=data;
具体是什么意思。
UDREO只能是1或0,那么UCSR0A与0X01或者0x02,可是这也不能证明就可以发送数据呀。 展开
UDREO既不是1,也不是0 ,而是5 。
UCSR0A的Bit5-为1说明发送缓冲器为空,可以把下一个要发送的数据放进去。
while(!(UCSR0A&(BIT(UDRE0)))) ;// 等待发送缓冲区空
UDR0=data; // 发送
还是不懂呀1,能详细点么?
你用软件环境avr 的头文件中定义了 UDRE0 是一个宏,值是 5
macros.h中有bit(x) 定义,#define BIT(x) (1 << (x));
bit(5) 就是二进制的 00100000
UCSR0A&(BIT(UDRE0)) 就是取出UCSR0A的bit5
while(!(UCSR0A&(BIT(UDRE0)))) ; 的意思就是 如果UCSR0A 的 bit5为0就等在这里
UDR0=data; 的意思就是 ......................这个不用说了吧
位 7 – RXCn: USART 接收结束
接收缓冲器中有未读出的数据时 RXCn 置位,否则清零。接收器禁止时,接收缓冲器被刷
新,导致 RXCn 清零。 RXCn 标志可用来产生接收结束中断(见对 RXCIEn 位的描述)。
• 位 6 – TXCn: USART 发送结束
发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDRn) 为空时 TXCn 置位。执行发送
结束中断时 TXCn 标志自动清零,也可以通过写1 进行清除操作。TXCn 标志可用来产生
发送结束中断(见对 TXCIEn 位的描述)。
• 位 5 – UDREn: USART数据寄存器空
UDREn 标志指出发送缓冲器(UDRn)是否准备好接收新数据。UDREn为1说明缓冲器为
空,已准备好进行数据接收。 UDREn 标志可用来产生数据寄存器空中断(见对 UDRIEn
位的描述)。
复位后 UDREn 置位,表明发送器已经就绪。• 位 4 – FEn:帧错误
如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个
停止位为 0,那么 FEn 置位。这一位一直有效直到接收缓冲器 (UDRn) 被读取。当接收到
的停止位为 1 时, FEn 标志为 "0”。对 UCSRnA进行写入时,这一位要写 "0”。
• 位 3 – DORn: 数据溢出
数据溢出时DORn置位。当接收缓冲器满(包含了两个数据),接收移位寄存器又有数据,
若此时检测到一个新的起始位,数据溢出就产生了。这一位一直有效直到接收缓冲器
(UDRn) 被读取。对 UCSRnA进行写入时,这一位要写 "0”。
• 位 2 – UPEn: USART 奇偶校验错误
当奇偶校验使能 (UPMn1 = 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时
UPEn 置位。这一位一直有效直到接收缓冲器 (UDRn) 被读取。对 UCSRnA 进行写入时,
这一位要写 "0”。
• 位 1 – U2Xn: 倍速发送
这一位仅对异步操作有影响。使用同步操作时将此位清零。
此位置1可将波特率分频因子从16降到8,从而有效的将异步通信模式的传输速率加倍。
• 位 0 – MPCMn: 多处理器通信模式
设置此位将启动多处理器通信模式。MPCMn 置位后,USART 接收器接收到的那些不包
含地址信息的输入帧都将被忽略。发送器不受 MPCMn 设置的影响。详细信息请参考
P168” 多处理器通信模式 ” 。