avr单片机异步串行通信USART实验Word文档格式.docx
《avr单片机异步串行通信USART实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《avr单片机异步串行通信USART实验Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
4、关于串行数据发送函数的编写
由于我们在这个实例中只是实现了从单片机发送一个字节的数据到计算机,所以编写起来相对比较简单。
首先我们要设置好串口寄存器的内容,然后查询数据缓冲器是否为空,如果数据缓冲器为空,则表示可以发送数据,这时候我们就可以将要发送的那个字节写入数据发送寄存器中。
jLBHrnAILg
5、程序的简单模块化
从这个程序开始,我们试着将程序模块化。
程序模块化有两个好处:
●程序结构清晰,容易读懂。
●程序便于移植
程序的模块化是一个系统的工程,在本实例中,我们先简单的把程序的不同功能封装成不同的函数,然后再主程序里面调用这些函数;
这样编写出来的程序,主程序比较简洁,并且易读。
而每一个函数都具有各自不同的功能,以后我们用到这些功能的时候,就可以直接调用这些函数了。
xHAQX74J0X
本实例用到了3个函数,分别是:
端口初始化函数,串口初始化函数,字节发送函数。
6、使用WINAVR开发环境,从这个例子开始,我们要使用外部晶振了,所以makefile文件中的时钟频率要修改一下,我们使用的是外部12M的晶振,所以需要将MAKEFILE文件中的时钟频率修改为12M。
另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振<
注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序。
我今天就犯了这样的错误,最后只好用外部振荡器恢复了一下才把单片机弄正常了)。
LDAYtRyKfE
7、程序代码
#include<
avr/io.h>
util/delay.h>
avr/interrupt.h>
//中断函数头文件
//常量声明
#defineBAUD9600//波特率定义
//全局变量声明
unsignedcharTransmit。
//函数声明
voidPort_Init(void>
。
//端口初始化配置
voidUsart_Init(void>
//USART寄存器设置
voidUsart_PutChar(unsignedcharcTXData>
//字节发送函数Zzz6ZB2Ltk
intmain(void>
{
Port_Init(>
Usart_Init(>
Transmit=0X31。
Usart_PutChar(Transmit>
sei(>
//使能全局中断
while(1>
{
}
}
//端口状态初始化设置函数
voidPort_Init(>
PORTD=0X00。
//USART的发送接收端口分别为PD0和PD1
DDRD|=(1<
<
PD1>
//PD0为接收端口,置为输入口;
PD1为发送端口,置为输出口dvzfvkwMI1
//USART寄存器配置函数
voidUsart_Init(>
UCSRA=0X00。
UCSRC|=(1<
URSEL>
|(1<
UCSZ1>
UCSZ0>
//异步,数据格式8,N,1rqyn14ZNXI
//UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。
EmxvxOtOco
UBRRL=(F_CPU/BAUD/16-1>
%256。
//波特率设置
UBRRH=(F_CPU/BAUD/16-1>
/256。
UCSRB|=(1<
TXEN>
//发送使能
//字节发送函数
while(!
(UCSRA&
(1<
UDRE>
>
>
//只有数据寄存器为空时才能发送数据SixE2yXPq5
UDR=cTXData。
5.2USART的接收发送实验
5.2.1、实例功能
在上一个实例中,我们已经用单片机的串口实现了向计算机发送一个字节的例子。
在本实例中,我们将编写程序实现将计算机发送过来的串口数据原样再发送回计算机。
本实例共有3个功能模块,分别描述如下:
●单片机系统:
使用单片机的串口实现将接收到的数据原样发送回去的功能。
●外围电路:
RS232电平转换电路,DB9串行接口插座。
●软件程序:
进一步熟悉单片机的串行通信
5.2.2、器件和原理
关于串行接口的原理已接单片机与计算机的串口的连接在上一实例中进行了描述,在本实例中不再重复。
本实例只介绍单片机在同时收发数据模式下寄存器的配置。
1、ATmega16单片机的串口收发模式时的寄存器设置
寄存器在不同模式下的设置各不相同,混在一起介绍不容易记住。
在这里只介绍本实例中用到的寄存器设置。
1)
在编写程序的时候,我们可以不必理会过多,只要知道接收串口数据的时候,把UDR中的数据送到我们定义的接收变量中,发送数据的时候,把要发送的数据送入UDR中就可以了。
6ewMyirQFL
2)
该寄存器主要是发送、接收结束的结束标志,以及各种数据错误检查方式。
在一般的串口通信中,我们可以不必关心。
一般我们只关心第五位的设置。
kavU42VRUs
●Bit5–UDRE:
USART数据寄存器空
UDRE标志指出发送缓冲器(UDR>
是否准备好接收新数据。
UDRE为1说明缓冲器为空,已准备。
在非中断方式发送数据的时候,每发送一个字节都要检测缓冲期是否为空,即检测UDRE是否为1,只有在UDRE为1的情况下,才能向缓冲器UDR中写入数据。
在本例中我们就用查询的方式发送数据,所以要检测这一位是否为1.y6v3ALoS89
3)
●Bit7–RXCIE:
接收结束中断使能
置位后使能RXC中断。
当RXCIE为1,全局中断标志位SREG置位,UCSRA寄存器M2ub6vSTnP
的RXC亦为1时可以产生USART接收结束中断。
●Bit4–RXEN:
接收使能
置位后将启动USART接收器。
RxD引脚的通用端口功能被USART功能所取代。
禁止
接收器将刷新接收缓冲器,并使FE、DOR及PE标志无效。
●Bit3–TXEN:
发送使能
置位后将启动将启动USART发送器。
TxD引脚的通用端口功能被USART功能所取代。
TXEN清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存
器与发送缓冲寄存器中没有要传送的数据。
发送器禁止后,TxD引脚恢复其通用I/O功能。
●Bit2–UCSZ2:
字符长度
UCSZ2与UCSRC寄存器的UCSZ1:
0结合在一起可以设置数据帧所包含的数据位数(字符
长度>
该寄存器主要设置接受和发送寄存器的使能以及接收和发送中断标志,在本例中我们只是既用到了串口数据的发送功能,也用到了数据的接收功能,所以要将TXEN和RXEN这两位使能,同时我们还用到了数据接收中断,所以还要设置接收中断允许。
0YujCfmUCw
4)
UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。
如果对UCSRC执行写操作,则URSEL应设置为1。
eUts8ZQVRd
•Bit7–URSEL:
寄存器选择
通过该位选择访问UCSRC寄存器或UBRRH寄存器。
当读UCSRC时,该位为1;
当
写UCSRC时,URSEL为1。
•Bit6–UMSEL:
USART模式选择
通过这一位来选择同步或异步工作模式。
•Bit5:
4–UPM1:
0:
奇偶校验模式
这两位设置奇偶校验的模式并使能奇偶校验。
如果使能了奇偶校验,那么在发送数据,发
送器都会自动产生并发送奇偶校验位。
对每一个接收到的数据,接收器都会产生一奇偶
值,并与UPM0所设置的值进行比较。
如果不匹配,那么就将UCSRA中的PE置位。
•Bit3–USBS:
停止位选择
通过这一位可以设置停止位的位数。
接收器忽略这一位的设置。
•Bit2:
1–UCSZ1:
UCSZ1:
0与UCSRB寄存器的UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长
度>
•Bit0–UCPOL:
时钟极性
这一位仅用于同步工作模式。
使用异步模式时,将这一位清零。
UCPOL设置了输出数据
的改变和输入数据采样,以及同步时钟XCK之间的关系。
本例中,我们使用异步通信模式,数据格式为:
一位停止位,无校验,8位数据位。
需要注意的是:
在写这个寄存器的时候,需要将bit7位置1.sQsAEJkW5T
5)
•Bit15–URSEL:
当读UBRRH时,该位为0;
当写UBRRH时,URSEL为0。
GMsIasNXkA
•Bit14:
12–保留位
这些位是为以后的使用而保留的。
为了与以后的器件兼容,写UBRRH时将这些位清零。
•Bit11:
0–UBRR11:
USART波特率寄存器
这个12位的寄存器包含了USART的波特率信息。
其中UBRRH包含了USART波特率高4位,UBRRL包含了低8位。
波特率的改变将造成正在进行的数据传输受到破坏。
写UBRRL将立即更新波特率分频器。
TIrRGchYzg
5.2.3、电路
本实例的电路与上一实例完全相同,这里不再重复。
7EqZcWLZNX
lzq7IGf02E
5.2.4、程序设计
程序的功能是通过单片机的串行接口,将计算机发送过来的数据原样发送回计算机。
●单片机串行接收中断的编程
在本例中,我们用到了单片机的串行接收中断,需要编写串行接收中断服务程序,通过查询WINAVR<
GCC)的中断库函数手册,可以查找到ATmega16单片机串行接收中断的中断向量为USART_RXC_vect。
据此我们可以编写串行接收中断服务程序,如下:
zvpgeqJ1hk
//接收中断函数
ISR(USART_RXC_vect>
unsignedcharRev。
Rev=UDR。
//从USARTI/O数据寄存器-UDR中读出数据
Usart_PutChar(Rev>
//将接收到的数据发送
在中断服务程序中,我们首先把单片机串口接收到的数据放入变量Rev中,然后调用上一实例中编写的串行接口字节发送函数将变量Rev中的数据发送到计算机。
NrpoJac3v1
在观察本例运行结果时,我们同样要用到串口助手,本例中,单片机发送串口数据采用的波特率是9600bps,数据格式是8位数据位,1位停止位,无奇偶校验。
在串口助手里面,我们也要将波特率和数据格式设置成一样的。
1nowfTG4KI
3、程序的简单模块化
本实例用到了4个函数,分别是:
端口初始化函数,串口初始化函数,字节发送函数以及串行接收的中断服务函数。
fjnFLDa5Zo
4、使用WINAVR开发环境,在本例中我们使用的是外部12M的晶振,所以需要将MAKEFILE文件中的时钟频率修改为12M。
注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。
tfnNhnE6e5
5、程序代码
#defineBAUD9600
//字节发送函数HbmVN777sL
PD1为发送端口,置为输出口V7l4jRB8Hs
//异步,数据格式8,N,183lcPA59W9
//写UCSRC时,URSEL应设置为1。
RXCIE>
RXEN>
//发送使能mZkklkzaaP
//只有数据寄存器为空时才能发送数据AVktR43bpw
//发送数据送USARTI/O数据寄存器-UDRORjBnOwcEd
5.3USART的完整数据收发例程
5.3.1、实例功能
在关于USART串口通信的这三个实例中,我们是用的都是异步串行通信模式。
我们知道,串行通信分为异步和同步模式。
那么什么是异步通信呢?
关于这一点我们将在附录中进行说明。
2MiJTy0dTT
使用单片机的串口实现一个完整的数据收发例程。
5.3.2、器件和原理
关于串行接口的原理已接单片机与计算机的串口的连接在上一前面实例中进行了描述,在本实例中不再重复。
gIiSpiue7A
uEh0U1Yfmh
在本例中我们就用查询的方式发送数据,所以要检测这一位是否为1.IAg9qLsgBX
当RXCIE为1,全局中断标志位SREG置位,UCSRA寄存器WwghWvVhPE
asfpsfpi4k
ooeyYZTjj1
在写这个寄存器的时候,需要将bit7位置1.BkeGuInkxI
PgdO0sRlMo
3cdXwckm15
5.3.3、电路
h8c52WOngM
v4bdyGious
5.3.4、程序设计
程序的功能是通过单片机的串行接口,实现数