#avr单片机异步串行通信USART实验.docx
- 文档编号:9792041
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:24
- 大小:185.42KB
#avr单片机异步串行通信USART实验.docx
《#avr单片机异步串行通信USART实验.docx》由会员分享,可在线阅读,更多相关《#avr单片机异步串行通信USART实验.docx(24页珍藏版)》请在冰豆网上搜索。
#avr单片机异步串行通信USART实验
AVR单片机异步串行通信 -------基于LT_Mini_M16 5.1.3、电路 本实例的电路包含RS323的串口电平转换芯片MAX3232,电路图如下图所示。 1、电路原理 在本实例中利用MAX3232芯片使单片机输出的TTL电平转换为标准的RS232电平,从而使计算机能够识别。 同时将计算机输出的RS232电平转换为单片机可以识别的TTL电平。 2、电路连接 电路中MAX3232芯片的9、10引脚分别连接单片机的PD0、PD1端口,MAX3232的13、14引脚分别连接计算机串口线的3、2脚。 3、特别说明 本学习板采用的是串口插座是公头的,所以与计算机相连的串口连接线应该是交叉串口线,而不是串口延长线。 5.1.4、程序设计 1、程序功能 程序的功能是使用单片机的串行接口PD0、PD1设计串口通信程序,通过单片机向计算机发送一个字节的数据。 程序调试的时候需要在计算机上安装串口助手,以观察接收的串口数据。 2、单片机与计算机串行通信结果的观察 在本例中,只是简单的发送一个字节到计算机,因为单片机运行速度比较快,所以当程序烧写到单片机后再打开串口助手观察接收到的数据的时候,可能会看不到接收的数据,我们可以提前打开串口助手以便观察。 也可以按一下学习板上的复位按键,这时候程序会重新运行,这样就可以在串口助手上观察到接收的数据了 3、数据通信格式的设定 要实现单片机和计算机的串行通信,首先要使双方的通信波特率和数据格式一致,这样才能观察到正确的结果。 在本例中,单片机发送串口数据采用的波特率是9600bps,数据格式是8位数据位,1位停止位,无奇偶校验。 在计算机上的串口助手里面,我们也要将波特率和数据格式设置成一样的。 4、关于串行数据发送函数的编写 因为我们在这个实例中只是实现了从单片机发送一个字节的数据到计算机,所以编写起来相对比较简单。 首先我们要设置好串口寄存器的内容,然后查询数据缓冲器是否为空,如果数据缓冲器为空,则表示可以发送数据,这时候我们就可以将要发送的那个字节写入数据发送寄存器中。 5、程序的简单模块化 从这个程序开始,我们试着将程序模块化。 程序模块化有两个好处: ●程序结构清晰,容易读懂。 ●程序便于移植 程序的模块化是一个系统的项目,在本实例中,我们先简单的把程序的不同功能封装成不同的函数,然后再主程序里面调用这些函数;这样编写出来的程序,主程序比较简洁,并且易读。 而每一个函数都具有各自不同的功能,以后我们用到这些功能的时候,就可以直接调用这些函数了。 本实例用到了3个函数,分别是: 端口初始化函数,串口初始化函数,字节发送函数。 6、使用WINAVR开发环境,从这个例子开始,我们要使用外部晶振了,所以makefile文件中的时钟频率要修改一下,我们使用的是外部12M的晶振,所以需要将MAKEFILE文件中的时钟频率修改为12M。 另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振<注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序。 我今天就犯了这样的错误,最后只好用外部振荡器恢复了一下才把单片机弄正常了)。 7、程序代码 #include #include #include //常量声明 #defineBAUD9600//波特率定义 //全局变量声明 unsignedcharTransmit。 //函数声明 voidPort_Init(void>。 //端口初始化配置 voidUsart_Init(void>。 //USART寄存器设置 voidUsart_PutChar(unsignedcharcTXData>。 //字节发送函数 intmain(void> { Port_Init(>。 Usart_Init(>。 Transmit=0X31。 Usart_PutChar(Transmit>。 sei(>。 //使能全局中断 while(1> { } } //端口状态初始化设置函数 voidPort_Init(> { PORTD=0X00。 //USART的发送接收端口分别为PD0和PD1 DDRD|=(1< //PD0为接收端口,置为输入口;PD1为发送端口,置为输出口 } //USART寄存器配置函数 voidUsart_Init(> { UCSRA=0X00。 UCSRC|=(1< //异步,数据格式8,N,1 //UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写UCSRC时,URSEL应设置为1。 UBRRL=(F_CPU/BAUD/16-1>%256。 //波特率设置 UBRRH=(F_CPU/BAUD/16-1>/256。 UCSRB|=(1< //发送使能 } //字节发送函数 voidUsart_PutChar(unsignedcharcTXData> { while(! (UCSRA&(1< //只有数据寄存器为空时才能发送数据 UDR=cTXData。 } 5.2USART的接收发送实验 5.2.1、实例功能 在上一个实例中,我们已经用单片机的串口实现了向计算机发送一个字节的例子。 在本实例中,我们将编写程序实现将计算机发送过来的串口数据原样再发送回计算机。 本实例共有3个功能模块,分别描述如下: ●单片机系统: 使用单片机的串口实现将接收到的数据原样发送回去的功能。 ●外围电路: RS232电平转换电路,DB9串行接口插座。 ●软件程序: 进一步熟悉单片机的串行通信 5.2.2、器件和原理 关于串行接口的原理已接单片机与计算机的串口的连接在上一实例中进行了描述,在本实例中不再重复。 本实例只介绍单片机在同时收发数据模式下寄存器的配置。 1、ATmega16单片机的串口收发模式时的寄存器设置 寄存器在不同模式下的设置各不相同,混在一起介绍不容易记住。 在这里只介绍本实例中用到的寄存器设置。 <1) 在编写程序的时候,我们可以不必理会过多,只要知道接收串口数据的时候,把UDR中的数据送到我们定义的接收变量中,发送数据的时候,把要发送的数据送入UDR中就可以了。 <2) 该寄存器主要是发送、接收结束的结束标志,以及各种数据错误检查方式。 在一般的串口通信中,我们可以不必关心。 一般我们只关心第五位的设置。 ●Bit5–UDRE: USART数据寄存器空 UDRE标志指出发送缓冲器(UDR>是否准备好接收新数据。 UDRE为1说明缓冲器为空,已准备。 在非中断方式发送数据的时候,每发送一个字节都要检测缓冲期是否为空,即检测UDRE是否为1,只有在UDRE为1的情况下,才能向缓冲器UDR中写入数据。 在本例中我们就用查询的方式发送数据,所以要检测这一位是否为1. <3) ●Bit7–RXCIE: 接收结束中断使能 置位后使能RXC中断。 当RXCIE为1,全局中断标志位SREG置位,UCSRA寄存器 的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这两位使能,同时我们还用到了数据接收中断,所以还要设置接收中断允许。 <4) UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。 如果对UCSRC执行写操作,则URSEL应设置为1。 •Bit7–URSEL: 寄存器选择 通过该位选择访问UCSRC寄存器或UBRRH寄存器。 当读UCSRC时,该位为1;当 写UCSRC时,URSEL为1。 •Bit6–UMSEL: USART模式选择 通过这一位来选择同步或异步工作模式。 •Bit5: 4–UPM1: 0: 奇偶校验模式 这两位设置奇偶校验的模式并使能奇偶校验。 如果使能了奇偶校验,那么在发送数据,发 送器都会自动产生并发送奇偶校验位。 对每一个接收到的数据,接收器都会产生一奇偶 值,并与UPM0所设置的值进行比较。 如果不匹配,那么就将UCSRA中的PE置位。 •Bit3–USBS: 停止位选择 通过这一位可以设置停止位的位数。 接收器忽略这一位的设置。 •Bit2: 1–UCSZ1: 0: 字符长度 UCSZ1: 0与UCSRB寄存器的UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长 度>。 •Bit0–UCPOL: 时钟极性 这一位仅用于同步工作模式。 使用异步模式时,将这一位清零。 UCPOL设置了输出数据 的改变和输入数据采样,以及同步时钟XCK之间的关系。 本例中,我们使用异步通信模式,数据格式为: 一位停止位,无校验,8位数据位。 需要注意的是: 在写这个寄存器的时候,需要将bit7位置1. <5) •Bit15–URSEL: 寄存器选择 通过该位选择访问UCSRC寄存器或UBRRH寄存器。 当读UBRRH时,该位为0;当写UBRRH时,URSEL为0。 •Bit14: 12–保留位 这些位是为以后的使用而保留的。 为了与以后的器件兼容,写UBRRH时将这些位清零。 •Bit11: 0–UBRR11: 0: USART波特率寄存器 这个12位的寄存器包含了USART的波特率信息。 其中UBRRH包含了USART波特率高4位,UBRRL包含了低8位。 波特率的改变将造成正在进行的数据传输受到破坏。 写UBRRL将立即更新波特率分频器。 5.2.3、电路 本实例的电路与上一实例完全相同,这里不再重复。 1、电路原理 在本实例中利用MAX3232芯片使单片机输出的TTL电平转换为标准的RS232电平,从而使计算机能够识别。 同时将计算机输出的RS232电平转换为单片机可以识别的TTL电平。 2、电路连接 电路中MAX3232芯片的9、10引脚分别连接单片机的PD0、PD1端口,MAX3232的13、14引脚分别连接计算机串口线的3、2脚。 3、特别说明 本学习板采用的是串口插座是公头的,所以与计算机相连的串口连接线应该是交叉串口线,而不是串口延长线。 5.2.4、程序设计 1、程序功能 程序的功能是通过单片机的串行接口,将计算机发送过来的数据原样发送回计算机。 ●单片机串行接收中断的编程 在本例中,我们用到了单片机的串行接收中断,需要编写串行接收中断服务程序,通过查询WINAVR 据此我们可以编写串行接收中断服务程序,如下: //接收中断函数 ISR(USART_RXC_vect> { unsignedcharRev。 Rev=UDR。 //从USARTI/O数据寄存器-UDR中读出数据 Usart_PutChar(Rev>。 //将接收到的数据发送 } 在中断服务程序中,我们首先把单片机串口接收到的数据放入变量Rev中,然后调用上一实例中编写的串行接口字节发送函数将变量Rev中的数据发送到计算机。 2、单片机与计算机串行通信结果的观察 在观察本例运行结果时,我们同样要用到串口助手,本例中,单片机发送串口数据采用的波特率是9600bps,数据格式是8位数据位,1位停止位,无奇偶校验。 在串口助手里面,我们也要将波特率和数据格式设置成一样的。 3、程序的简单模块化 本实例用到了4个函数,分别是: 端口初始化函数,串口初始化函数,字节发送函数以及串行接收的中断服务函数。 4、使用WINAVR开发环境,在本例中我们使用的是外部12M的晶振,所以需要将MAKEFILE文件中的时钟频率修改为12M。 另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振<注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。 5、程序代码 #include #include #include //常量声明 #defineBAUD9600 //全局变量声明 unsignedcharTransmit。 //函数声明 voidPort_Init(void>。 //端口初始化配置 voidUsart_Init(void>。 //USART寄存器设置 voidUsart_PutChar(unsignedcharcTXData>。 //字节发送函数 intmain(void> { Port_Init(>。 Usart_Init(>。 Transmit=0X31。 Usart_PutChar(Transmit>。 sei(>。 //使能全局中断 while(1> { } } //端口状态初始化设置函数 voidPort_Init(> { PORTD=0X00。 //USART的发送接收端口分别为PD0和PD1 DDRD|=(1< //PD0为接收端口,置为输入口;PD1为发送端口,置为输出口 } //USART寄存器配置函数 voidUsart_Init(> { UCSRA=0X00。 UCSRC|=(1< //异步,数据格式8,N,1 //写UCSRC时,URSEL应设置为1。 UBRRL=(F_CPU/BAUD/16-1>%256。 //波特率设置 UBRRH=(F_CPU/BAUD/16-1>/256。 UCSRB|=(1< //发送使能 } //字节发送函数 voidUsart_PutChar(unsignedcharcTXData> { while(! (UCSRA&(1< //只有数据寄存器为空时才能发送数据 UDR=cTXData。 //发送数据送USARTI/O数据寄存器-UDR } //接收中断函数 ISR(USART_RXC_vect> { unsignedcharRev。 Rev=UDR。 //从USARTI/O数据寄存器-UDR中读出数据 Usart_PutChar(Rev>。 //将接收到的数据发送 } 5.3USART的完整数据收发例程 5.3.1、实例功能 在关于USART串口通信的这三个实例中,我们是用的都是异步串行通信模式。 我们知道,串行通信分为异步和同步模式。 那么什么是异步通信呢? 关于这一点我们将在附录中进行说明。 在上一个实例中,我们已经用单片机的串口实现了向计算机发送一个字节的例子。 在本实例中,我们将编写程序实现将计算机发送过来的串口数据原样再发送回计算机。 本实例共有3个功能模块,分别描述如下: ●单片机系统: 使用单片机的串口实现一个完整的数据收发例程。 ●外围电路: RS232电平转换电路,DB9串行接口插座。 ●软件程序: 进一步熟悉单片机的串行通信 5.3.2、器件和原理 关于串行接口的原理已接单片机与计算机的串口的连接在上一前面实例中进行了描述,在本实例中不再重复。 本实例只介绍单片机在同时收发数据模式下寄存器的配置。 1、ATmega16单片机的串口收发模式时的寄存器设置 寄存器在不同模式下的设置各不相同,混在一起介绍不容易记住。 在这里只介绍本实例中用到的寄存器设置。 <1) 在编写程序的时候,我们可以不必理会过多,只要知道接收串口数据的时候,把UDR中的数据送到我们定义的接收变量中,发送数据的时候,把要发送的数据送入UDR中就可以了。 <2) 该寄存器主要是发送、接收结束的结束标志,以及各种数据错误检查方式。 在一般的串口通信中,我们可以不必关心。 一般我们只关心第五位的设置。 ●Bit5–UDRE: USART数据寄存器空 UDRE标志指出发送缓冲器(UDR>是否准备好接收新数据。 UDRE为1说明缓冲器为空,已准备。 在非中断方式发送数据的时候,每发送一个字节都要检测缓冲期是否为空,即检测UDRE是否为1,只有在UDRE为1的情况下,才能向缓冲器UDR中写入数据。 在本例中我们就用查询的方式发送数据,所以要检测这一位是否为1. <3) ●Bit7–RXCIE: 接收结束中断使能 置位后使能RXC中断。 当RXCIE为1,全局中断标志位SREG置位,UCSRA寄存器 的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这两位使能,同时我们还用到了数据接收中断,所以还要设置接收中断允许。 <4) UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。 如果对UCSRC执行写操作,则URSEL应设置为1。 •Bit7–URSEL: 寄存器选择 通过该位选择访问UCSRC寄存器或UBRRH寄存器。 当读UCSRC时,该位为1;当 写UCSRC时,URSEL为1。 •Bit6–UMSEL: USART模式选择 通过这一位来选择同步或异步工作模式。 •Bit5: 4–UPM1: 0: 奇偶校验模式 这两位设置奇偶校验的模式并使能奇偶校验。 如果使能了奇偶校验,那么在发送数据,发 送器都会自动产生并发送奇偶校验位。 对每一个接收到的数据,接收器都会产生一奇偶 值,并与UPM0所设置的值进行比较。 如果不匹配,那么就将UCSRA中的PE置位。 •Bit3–USBS: 停止位选择 通过这一位可以设置停止位的位数。 接收器忽略这一位的设置。 •Bit2: 1–UCSZ1: 0: 字符长度 UCSZ1: 0与UCSRB寄存器的UCSZ2结合在一起可以设置数据帧包含的数据位数(字符长 度>。 •Bit0–UCPOL: 时钟极性 这一位仅用于同步工作模式。 使用异步模式时,将这一位清零。 UCPOL设置了输出数据 的改变和输入数据采样,以及同步时钟XCK之间的关系。 本例中,我们使用异步通信模式,数据格式为: 一位停止位,无校验,8位数据位。 需要注意的是: 在写这个寄存器的时候,需要将bit7位置1. <5) •Bit15–URSEL: 寄存器选择 通过该位选择访问UCSRC寄存器或UBRRH寄存器。 当读UBRRH时,该位为0;当写UBRRH时,URSEL为0。 •Bit14: 12–保留位 这些位是为以后的使用而保留的。 为了与以后的器件兼容,写UBRRH时将这些位清零。 •Bit11: 0–UBRR11: 0: USART波特率寄存器 这个12位的寄存器包含了USART的波特率信息。 其中UBRRH包含了USART波特率高4位,UBRRL包含了低8位。 波特率的改变将造成正在进行的数据传输受到破坏。 写UBRRL将立即更新波特率分频器。 5.3.3、电路 本实例的电路与上一实例完全相同,这里不再重复。 1、电路原理 在本实例中利用MAX3232芯片使单片机输出的TTL电平转换为标准的RS232电平,从而使计算机能够识别。 同时将计算机输出的RS232电平转换为单片机可以识别的TTL电平。 2、电路连接 电路中MAX3232芯片的9、10引脚分别连接单片机的PD0、PD1端口,MAX3232的13、14引脚分别连接计算机串口线的3、2脚。 3、特别说明 本学习板采用的是串口插座是公头的,所以与计算机相连的串口连接线应该是交叉串口线,而不是串口延长线。 5.3.4、程序设计 1、程序功能 程序的功能是通过单片机的串行接口,实现数据的收发。 ●单片机串行接收中断的编程 在本例中,我们用到了单片机的串行接收中断,需要编写串行接收中断服务程序,通过查询WINAVR 据此我们可以编写串行接收中断服务程序,如下: //接收中断函数 ISR(USART_RXC_vect> { unsignedcharRev。 Rev=UDR。 //从USARTI/O数据寄存器-UDR中读出数据 Usart_PutChar(Rev>。 //将接收到的数据发送 } 在中断服务程序中,我们首先把单片机串口接收到的数据放入变量Rev中,然后调用上一实例中编写的串行接口字节发送函数将变量Rev中的数据发送到计算机。 2、单片机与计算机串行通信结果的观察 在观察本例运行结果时,我们同样要用到串口助手,本例中,单片机发送串口数据采用的波特率是9600bps,数据格式是8位数据位,1位停止位,无奇偶校验。 在串口助手里面,我们也要将波特率和数据格式设置成一样的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- avr 单片机 异步 串行 通信 USART 实验