介绍

USART是最原始的设备间通信协议之一。现代计算机中没有使用USART。但仍有一些主板附带USART通信所需的模块。在PC机中,该端口称为COM端口,遵循RS232协议。除了电压电平和一些参数外,它与USART没有区别附加信号。通常使用MAX232 IC转换电压电平。MAX232是一个简单的电压转换器缓冲区,用于将RS232的+12/-12V转换为USART的5/0V。其他规格与USART和RS232类似。了解有关USART读取的更多信息本文来自维基百科。

ATmega8中的USART模块

USART指通用同步异步发射机和接收机。USART通信提供了全双工通信,即同时传输和接收。同步意味着单个时钟源将由终端设备共享,以方便通信。异步意味着,不存在与终端设备同步的时钟源。但要接收串行传入数据,始终需要采样。除此之外,还应知道符号速率(即波特率)。这就是为什么每个USART或UART模块都有一个内部波特率发生器模块。在早期的微控制器中,没有单独的波特率生成单元。他们使用一个内部定时器计数器来产生波特率。
帧(即每次传输中的位数)可以由5、6、7、8或9个数据位组成。开始位开始数据传输。还包括一个/两个停止位。可能包括偶数/奇数奇偶校验位,也可能没有任何奇偶校验位。USART数据寄存器(AVR微控制器称为UDR)是一个双缓冲寄存器。它由发射机缓冲器和接收机缓冲器组成。它们都共享相同的I/O地址。但当数据写入UDR时,数据保存到变送器缓冲区,并从TXD引脚串行移出。当读取UDR时,将读取接收器缓冲区中的内容,该缓冲区存储来自RXD引脚的串行输入位。

在ATmega8中启用USART的最低设置

ATmega8中的USART模块有5个与之相关联的寄存器(4个8位,1-16位)。它们是

  • 1.UCSRA:USART控制和状态寄存器A。在该寄存器中,三位表示传输和接收的状态。只有两位足以进行基本编程。这些是:

a) TXC-传输完成
b) RXC-接收完成
在将数据读取或写入UDR(USART数据寄存器)之前,检查这些位

  • 2.UCSRB:控制和状态寄存器B。该寄存器对于启用USART发射机和接收机非常重要。相关位为

a) TXEN:发射机启用位。这将启用USART发射机。
b) RXEN:接收器启用位。这将启用USART接收器。

  • 3.UCSRC:这是USART最重要的控制寄存器。让我们看看。

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

一点

7.

6.

5.

4.

3.

2.

1.

0

位名称 昂塞尔 乌姆塞尔 UPM1 UPM0 美国广播公司 UCSZ1 UCSZ0 UCPOL
读/写

RW

RW

RW

RW

RW

RW

RW

RW

初始值

1.

0

0

0

0

1.

1.

0

UCSRC寄存器与UBRRH寄存器共享相同的I/O位置。对该I/O位置进行写访问时,写入值的高位USART寄存器选择(URSEL)位控制将写入的两个寄存器中的哪一个。如果在写入操作期间URSEL为零,则将更新UBRRH值。如果URSEL为1,则将更新UCSRC设置。

位7–URSEL:寄存器选择

此位在访问UCSRC或UBRRH寄存器之间进行选择。在读取UCSRC时,它作为一读取。在写入UCSRC时,URSEL必须为一。

位6–UMSEL:USART模式选择

该位在异步和同步操作模式之间进行选择。

UMSEL位设置

乌姆塞尔

模式

0

异步操作

1.

同步操作
位5:4–UPM1:0:奇偶校验模式

这些位启用并设置奇偶校验生成和检查的类型。如果启用,发射机将自动生成并发送每个帧内传输数据位的奇偶校验。接收器将为传入数据生成奇偶校验值,并将其与UPM0设置进行比较。如果检测到不匹配,将设置UCSRA中的PE标志。

UPM位设置

UPM1

UPM0

奇偶模

0

0

残废

0

1.

含蓄的

1.

0

启用,偶数奇偶校验

1.

1.

启用奇偶校验

位3–USBS:停止位选择

该位选择变送器插入的停止位的数量。接收器忽略此设置。

USBS位设置

美国广播公司

停止位

0

1位

1.

2位
位2:1–UCSZ1:0:字符大小

UCSRB中的UCSZ1:0位与UCSZ2位相结合,设置接收机和发射机使用的帧中的数据位数(字符大小)。

UPM位设置

UCSZ 2*

UCSZ

UCSZ

字符大小

0

0

0

5位

0

0

1.

6位

0

1.

0

7位

0

1.

1.

8位

1.

0

0

含蓄的

1.

0

1.

含蓄的

1.

1.

0

含蓄的

1.

1.

1.

9位

*UCSZ2属于UCSRB
  • 4.UBRR:如前所述,向UBRR写入信息很棘手。无论我们是否将数据写入UBRRH和UCSRC,都使用相同的I/O位置。唯一使destiny不同的是要写入的数据的MSB。如果数据字节的MSB为1,则destiny为UCSRC,否则它将被写入UBRRH。以及的地址UBRRL与UBRRH不相邻。因此,尽管UBRRL和UBRRH的组合为16位,但我们无法将16位数据(如整数变量)直接写入UBRR寄存器。我们需要将较高的字节写入UBRRH,并在写入之前从中剥离MSB。我们必须单独写入较低的字节。
  • UDR:UDR是数据传输或接收过程中的数据存储。它是一个双缓冲寄存器。因此,它可以支持全双工传输。以下是我在Atmel的ATmega8数据表中发现的内容:

USART数据寄存器–UDR

一点

7.

6.

5.

4.

3.

2.

1.

0

UDR(读取)

RXB[7:0]

UDR(写入)

TXB[7:0]

读/写

RW

RW

RW

RW

RW

RW

RW

RW

初始值

1.

0

0

0

0

1.

1.

0

USART传输数据缓冲寄存器和USART接收数据缓冲寄存器共享称为USART数据寄存器或UDR的相同I/O地址。传输数据缓冲寄存器(TXB)将是写入UDR寄存器位置的数据的目的地。读取UDR寄存器位置将返回接收数据缓冲寄存器(RXB)的内容。对于5位、6位或7位字符,发射机将忽略上面未使用的位,接收机将其设置为零。

只有在UCSRA寄存器中设置UDRE标志时,才能写入传输缓冲区。未设置UDRE标志时写入UDR的数据将被USART变送器忽略。当数据写入传输缓冲区时(变送器启用)然后,当移位寄存器为空时,变送器将数据加载到传输移位寄存器中。然后,数据将串行传输到TxD引脚。

接收缓冲区由两级FIFO组成。每当访问接收缓冲区时,FIFO将改变其状态。由于接收缓冲区的这种行为,请勿在此位置使用读-修改-写指令(SBI和CBI)。使用位测试指令(SBIC和SBI)时要小心,因为这些也会改变FIFO的状态。

此实验的目标设置为:

  • A.传输和接收都将启用。
  • b、 将有8个数据位
  • c、 将有2个停止位
  • D没有奇偶校验位
  • e、 传输将是异步的
  • F传输的波特率为1200波特
  • g、 波特率的UBRR值根据数据表中给出的公式计算。公式为

查看PDF PC-Atmega8通信

图:电路图

文本框:微控制器的代码

#定义F_CPU 1000000
#包括
#包括

#定义波特率1200
#定义MYUBRR(F_CPU/(16*波特-1))

无效USART_Init(未签名的整数ubrr)
{
UBRRH=(无符号字符)(ubrr>>8);
UBRRL=(无符号字符)ubrr;
UCSRB=(1<UCSRC=(1<}

无效USART_PUTCH(字符)
{while(!(UCSRA&(1<UDR=ch;
}

char USART_GETCH(无效)
{while(!(UCSRA&(1<=16)
{
printf(“”);
LCDcmd(0xc0);
i=0;
}
}

返回0;
}

文本框:头文件“LCD83.h”中的代码

#ifndef项目
#定义项目
#如果没有_
#包括
#恩迪夫
#如果没有使用延迟_
#包括
#恩迪夫
#如果没有_
#包括
#恩迪夫
#ifndef DPDDR
#定义DPDDR DDRC
#恩迪夫
#ifndef CPDDR
#定义CPDDR-DDRD
#恩迪夫
#ifndef CPORT
#定义CPORT-PORTD
#恩迪夫
#ifndef DPORT
#定义DPORT-PORTC
#恩迪夫
#ifndef RS
#定义RS PD2
#恩迪夫
#ifndef EN
#定义EN PD3
#恩迪夫
#定义DEL1 10
#定义DEL2 45
int LCD(字符通道,文件*fp);
int LCD(字符通道,文件*fp)
{DPORT=(ch>>4)&0x0f;
CPORT=(1<_延迟(DEL1);
CPORT=(1<_延迟(DEL1);
DPORT=(ch&0x0f);
CPORT=(1<_延迟(DEL1);
CPORT=(1<4)&0x0f;
CPORT=(0<_延迟(DEL1);
CPORT=(0<_延迟(DEL1);
DPORT=(ch&0x0f);
CPORT=(0<_延迟(DEL1);
CPORT=(0<_延迟(DEL2);

_延迟(DEL2);
如果(ch==0x01 | | ch==0x02)
_延迟时间(5);
}

void initLCD()
{DDRC=0x0f;
DDRD=(1<LCDcmd(0x28);
LCDcmd(0x0f);
LCDcmd(0x01);
LCDcmd(0x02);
标准输出=fdevopen(LCD,空);
}

#endif/\u项目

测试

1.超级终端

打开“开始菜单>附件>通信>超级终端”

它将向您展示一些表单,并逐一填写。首先,为连接命名:

然后选择电路连接到的端口。

设置连接的配置

通常,终端窗口仅显示从COM端口接收的字符,并传输键盘上键入的任何内容。但是,由于TXD和RXD引脚在MAX232的TTL侧短路,因此存在从COM端口传输的任何内容的回波。您可以在下面的窗口截图中看到这一点。

最后,电路也接收数据,并显示在LCD显示屏上。微控制器的编程方式是,每当接收到的字符填满下一行时,它就会清除整行。

2.COM端口仿真器

网上有许多免费的串行数据仿真器工具。其中之一是COM端口仿真器. 它简单易用。只需配置如下图所示的设置,输入文本并开始模拟。

参考链接

维基百科关于USART的文章
维基百科关于RS232的文章

MAX232数据表
ATmega8数据表

8.评论

  1. 奥斯卡

    嗨,拉凯什,

    我们正在做一个关于串行通信的学校项目,我们希望有在ATmega studio 6中使用的完整代码。你还有吗?你能给我们发送吗?

    非常感谢。

    待会儿见。

  2. 齐奥·拉哈曼博士

    你的计划对我们很有帮助。

    如何使用ATmega32微控制器测量频率?请给我一个十六进制文件的设计好吗?实际上,我应该学习它。如果你给我一个设计,对我会有很大的帮助。

    • 拉凯什

      嗨,齐奥,
      频率计数是可以进行的最简单的实验之一。首先需要将计时器/计数器配置为计数器。i、 e.定时器/计数器应配置为接受外部时钟信号。另外,设置相应引脚的数据方向作为输入。之后,您只需要从寄存器中读取读数。例如。:
      TCNT0=0xff;
      _延迟μms(1000);
      读数=TCNT0;

      它将提供直接的频率读数。

  3. K-AVR

    我有一个关于你建议的USART接口的问题。
    它可以工作,但当我查看max232数据表时,我看到引脚7和8是RS-232输入/输出,但连接到AVR RX,TX引脚开关应该是TTL,我认为。
    你能解释一下吗?

    • 拉凯什·布特

      是的,你说得对。
      谢谢你指出错误…
      我会改正的。

  4. K-AVR

    谢谢
    问题解决了。

  5. K-AVR

    你好
    谢谢你的文章。
    我想知道我可以使用comport来创建ISP程序员吗??

    谢谢

    • 拉凯什

      嗨,K-AVR,
      如果你的电脑中有一个com端口,那就意味着你的电脑中嵌入了一个用于燃烧微控制器的设备。
      请参阅今天关于电路的这篇文章:
      //www.snellingtn.com/isp-programmer

Baidu