一、串行通讯技术概述
串行通讯的通俗定义:
串行通讯的分类
时钟线、数据线、通过时钟保持数据同步
异步串口通信
UART
波特率
帧格式
idle 空闲时候保持高电平
在发送数据的时候先发送一位起始位 低电平0
然后数据 0 1 。。。。8 位
P这位是可选的一般在多级通讯的时候需要发送9位数据在第9位时候 是地址位
SP1(必选的一位停止位 是1) 也可以选2位 加一个SP2
之后数据继续保持空闲高电平
接线图
RS232电平标准
DB9 接口定义
TXD /RXD /GDN 三根线即可瞒足绝大数应用场合
MAX3232标示的是3.3V的芯片我们用的是5V MAX232 芯片标示错了 不论引脚封装还是顺序都是完全相同的。
MAX 232 芯片能提供2路串口我们只用一个。由于这个电路图上是按照DB9定义的走线了所以我们就得用交叉线来跟PC通讯了。
M16的USART特点
USART
寄存器
Three Separate Interrupts (3个 分离 独立的中断 ) TX
complete 发送完成中断
以下是整段中文解释
通用同步和异步串行接收器合转发器(USART)是一个高度灵活的串行通讯设备。主要特点为:
噪声滤波使用起来通信质量相比其他单片机的通信质量大大提升,怎么操作USART呢 ?
首先介绍下有关的寄存器
第一个寄存器I/O
数据寄存器 UDR
share the same I/O address
其实就是发送数据和接受数据寄存器都采样同一个名称UDR
写 就是 发送
第二个寄存器是
UCSRA
第七位和第六位
第5位是 数据寄存器空 ,就是检测UDR 是否准备好接受新的数据。indicates 表明
the UDRE flag indicates if
第4位:帧错误
第1位:双 发送 速度
this bit only has effect for the asynchronous
operation
第0位:多处理器 communication 通讯 模式
所以这个UCSRA
这个控制状态寄存器一般用的最多的是第五位
第三个寄存器是控制状态寄存器B
第七位:RXCIE
如果是使用USART
writing
this bit to one enables interrupt on the
一个USART
接受中断结束
第六位:TXCIE
别人的解释:置位后使能TXC中断,当TXCIE
当然第六位我们一边用不到的。
第五位:USART
数据寄存器空中断使能
第3位:发送使能
这两位非常重要如果要用串行口 这两位必须使能。取代了通用端口了。
这UCSZ2 位combined
(结合)UCSRC寄存器的
一般我们用8位 。 可以设置成5--9位 当然在AVR 上电复位之后它的寄存器默认设置就是8位所以这我们也不用设置
这个第1位和第0位分别是 :接受数据位8
这两位仅仅对于数据长度设置成9位的时候才是有作用的他们分别是第9个数据位,所以我们这也是用不到。
这个位选择开始访问 UCSRC 或 UBRRH
寄存器。读UCSRC
估计 UCSRC
默认是置0 :异步操作
these bits enable and set type of parity generation and check .这两位设置奇偶校验模式并使能奇偶校验。
Disabled (禁止)
一般我们不用校验 所以不用设置这两位
可以看到 8位是 0 1
而我们去看看UCSRC 寄存器上电复位的初始值为
0 1
第0位:最后一位是 :时钟极性
这一项仅对同步的时候有用,this bit is used for synchronous mode only. 同步模式我们也用不到所以这一位我们也不用管。
第五个寄存器波特率寄存器
相当于一个12位的二进制数:低8位是UBRRL
解释:UCSRC寄存器与UBRRH 寄存器公用相同的I/O地址。对该寄存器的访问,请参见P162 访问 UBRRH/RCSRC寄存器。
我们计算波特率的时候只要将计算出的值的低8位写入这个UBRRL就行了。高8位写入UBRRH
下面的表格就粘贴了太累了!!
下面就讲讲怎样使用这个USART、、、
---------------------------------------------------------------
第一步:设置波特率
#define F_CPU 16000000
#define BAUD 9600
UBRRH = (FOSC / BAUD0/16-1)/256
UBRRL = (FPSC/BAUD0/16-1)%6
第二步:使能发送、接受接受完成中断
UCSRB |= (1<< RXEN)|(1<<TXEN)|(1<<RXCIE);
第三步:使能全局中断
sei();
第四步:查询方式发送、中断方式接受
发送: while(!(UCSRA & (1<< UDRE))); UDR =c;
接受中断:c = UDR ;
波特率怎么算的呢?在UART 下的时钟产生 下有波特率发生器下图
正常我们使用非倍速的时候
equations 方程
一个是波特率的计算公式一个是UBRR值的计算公式
UBRR
UBRR
用宏定义的好处 修改波特率方便。
实际演示下
编译如下代码:
然后下载进入,打开串口调试工具
反正我测试接受到的都是0 不知道为什么?
其实9600的波特率每秒最多发送多少字符 是9600 /10 960个字符因此串行速度还是非常快的
这就是串口发送的程序我们通常写成一个函数
中断方式使用USART步骤
第一步:设置波特率
#define F_CPU 16000000
#define BAUD 9600
UBRRH = (F_CPU/BAUD/16-1)/256
UBRRL = (F_CPU/BAUD/16-1)%6
第二步:使能发送
UCSRRB |= (1<<RXEN)|(1<<TXEN)|(1<<RICIE);
第三步:使能全局中断
sei();
第四步:查询方式发送、中断方式接受
发送:
UDR =c;
接受中断:c = UDR;
如果用中断接受必须在GCC单片机程序 找中断向量名称
中断接受、就讲到这里!