您的位置 首页 方案

Atmega16 单片机串口通讯与外部中止介绍

一串口通信ATmega16单片机带有一个全双工的通用同步/异步串行收发模块USART,该接口是一个高度灵活的串行通讯设备。其主要特点如下:全双工…

串口通讯

ATmega16单片机带有一个全双工的通用同步/异步串行收发模块USART,该接口是一个高度灵敏的串行通讯设备。其主要特色如下:

全双工操作,可一起进行收发操作;

支撑同步或异步操作;

支撑5、6、7、8和9位数据位,1位或许2位中止位的串行数据帧结构;

三个彻底独立的中止,TX发送完结,TX发送数据寄存器空,RX接纳完结;

支撑多机通讯形式;

相关寄存器:

USART数据寄存器—UDR;

USART操控和状况寄存器—UCSRA,UCSRB,UCSRC;

波特率寄存器—UBRRL和UBRRH;

串口布景常识

(1)串行通讯简介

串行同步通讯简略了解,约好一个同步时钟,每一时刻传输线上的信息便是要传送的信息单元。串行异步通讯是把一个字符看作一个独立的信息单元,每一个字符中的各位是以固定的时刻传送。因而,这种传送办法在同一字节内部是同步的,而字符间是异步的。在异步通讯中收发两边获得同步的办法是采用在字符格局中设置开端位,而在字符完毕时发送1~2个中止位。当接纳器检测到开端位时,便能知道经接着的是有用的字符位,所以开端接纳字符,检测到中止位时,就将接纳到的有用字符装载到接纳缓冲器中。最简略的串口通讯运用3根线完结:(1)地线,(2)发送,(3)接纳。由于串口通讯是异步的,端口能够在一根线上发送数据一起在另一根线上接纳数据。其他线用于握手,可是不是有必要的。串口通讯最重要的参数是波特率、数据位、中止位和奇偶校验。关于两个进行通行的端口,这些参数有必要匹配:

a,波特率:这是一个衡量通讯速度的参数。它标明每秒钟传送的bit的个数。例如300波特标明每秒钟发送300个bit。当咱们说到时钟周期时,咱们便是指波特率例如假如协议需求4800波特率,那么时钟是4800Hz。这意味着串口通讯在数据线上的采样率为4800Hz。一般电话线的波特率为14400,28800和36600。波特率能够远远大于这些值,可是波特率和间隔成反比。高波特率常常用于放置的很近的仪器间的通讯,典型的比方便是GPIB设备的通讯。

b,数据位:这是衡量通讯中实践数据位的参数。当计算机发送一个信息包,实践的数据不会是8位的,规范的值是5、7和8位。怎么设置取决于你想传送的信息。比方,规范的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。假如数据运用简略的文本(规范ASCII码),那么每个数据包运用7位数据。每个包是指一个字节,包括开端/中止位,数据位和奇偶校验位。由于实践数据位取决于通讯协议的选取,术语“包”指任何通讯的状况。

c,中止位:用于标明单个包的最终一位。典型的值为1,1.5和2位。由于数据是在传输线上守时的,并且每一个设备有其自己的时钟,很或许在通讯中两台设备间呈现了小小的不同步。因而中止位不仅仅是标明传输的完毕,并且供给计算机校对时钟同步的时机。适用于中止位的位数越多,不一起钟同步的忍受程度越大,可是数据传输率一起也越慢。

d,奇偶校验位:在串口通讯中一种简略的检错办法。有四种检错办法:偶、奇、高和低。当然没有校验位也是能够的。关于偶和奇校验的状况,串口会设置校验位(数据位后边的一位),用一个值确保传输的数据有偶个或许奇个逻辑高位。例如,假如数据是011,那么关于偶校验,校验位为0,确保逻辑高的位数是偶数个。假如是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真实的查看数据,简略置位逻辑高或许逻辑低校验。这样使得接纳设备能够知道一个位的状况,有时机判别是否有噪声搅扰了通讯或许是否传输和接纳数据是否不同步

一般异步通讯的格局如图:

USART承受以下30种组合的数据帧格局:

&8226; 1个开端位

&8226; 5、6、7、8或9个数据位

&8226;无校验位、奇校验或偶校验位

&8226; 1或2个中止位

数据帧以开端位开端;紧接着是数据字的最低位,数据字最多能够有9个数据位,以数据的最高位完毕。假如使能了校验位,校验位将紧接着数据位,最终是完毕位。当一个完好的数据帧传输后,能够当即传输下一个新的数据帧,或使传输线处于闲暇状况。

数据帧的结构由UCSRB和UCSRC寄存器中的UCSZ2:0、UPM1:0、USBS设定。接纳与发送运用相同的设置。设置的任何改动都或许损坏正在进行的数据传送与接纳。

(2)串口的组成

串口由阴阳两种接口组成。最常运用的信号引脚是TD、RD和SG,因而最简略的串口调试只需求包括3条引线就能够了。在RS232(一种串行工业总线规范)规范中,运用RD、TD作为接纳、发送信号线,参加地线,约好好通讯的波特率,完结串行信号传输。

(3)串口电平转化电路

PC的串口作业TTL信号是12V的,而在咱们一般运用的电路板上,电源信号和TTL电平是5V的(在低功耗电路中是3.3V的),为了将信号转化为可用,需求做串口的电平转化。这一部分电路现已有相应的出产厂商做出了各种集成芯片,例如MAXIM公司的MAX232/MAX233芯片,便是完结5V电路中和PC完结串口通讯的电平转化芯片,而MAX3232/MAX3233能够完结3.3V的电平转化。

串口寄存器介绍

USART I/O数据寄存器-UDR

USART发送数据缓冲寄存器和USART接纳数据缓冲寄存器同享相同的I/O地址,称为USART数据寄存器或UDR。将数据写入UDR时实践操作的是发送数据缓冲器存器(TXB),读UDR时实践回来的是接纳数据缓冲寄存器(RXB)的内容。在5、6、7比特字长形式下,未运用的高位被发送器疏忽,而接纳器则将它们设置为0。只需当UCSRA寄存器的UDRE标志置位后才能够对发送缓冲器进行写操作。假如UDRE没有置位,那么写入UDR的数据会被USART发送器疏忽。当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。然后数据串行地从TxD引脚输出。接纳缓冲器包括一个两级FIFO,一旦接纳缓冲器被寻址FIFO就会改动它的状况。因而不要对这一存储单元运用读-修正-写指令(SBI和CBI)。运用位查询指令(SBIC和SBIS)时也要当心,由于这也有或许改动FIFO的状况。

USART操控和状况寄存器A-UCSRA

&8226; Bit 7 – RXC: USART接纳完毕

接纳缓冲器中有未读出的数据时RXC置位,不然清零。接纳器制止时,接纳缓冲器被改写,导致RXC清零。RXC标志可用来产生接纳完毕中止(见对RXCIE位的描绘)。

&8226; Bit 6 – TXC: USART发送完毕

发送移位缓冲器中的数据被送出,且当发送缓冲器(UDR)为空时TXC置位。履行发送完毕中止时TXC标志主动清零,也能够经过写1进行铲除操作。TXC标志可用来产生发送完毕中止(见对TXCIE位的描绘)。

&8226; Bit 5 – UDRE: USART数据寄存器空

UDRE标志指出发送缓冲器(UDR)是否准备好接纳新数据。UDRE为1阐明缓冲器为空,已准备好进行数据接纳。UDRE标志可用来产生数据寄存器空中止(见对UDRIE位的描绘)。复位后UDRE置位,标明发送器现已安排妥当。

&8226; Bit 4 – FE:帧过错

假如接纳缓冲器接纳到的下一个字符有帧过错,即接纳缓冲器中的下一个字符的第一个中止位为0,那么FE置位。这一位一向有用直到接纳缓冲器(UDR)被读取。当接纳到的中止位为1时,FE标志为0。对UCSRA进行写入时,这一位要写0。

&8226; Bit 3 – DOR:数据溢出

数据溢出时DOR置位。当接纳缓冲器满(包括了两个数据),接纳移位寄存器又有数据,若此刻检测到一个新的开端位,数据溢出就产生了。这一位一向有用直到接纳缓冲器(UDR)被读取。对UCSRA进行写入时,这一位要写0。

&8226; Bit 2 – PE:奇偶校验过错

当奇偶校验使能(UPM1 = 1),且接纳缓冲器中所接纳到的下一个字符有奇偶校验过错时UPE置位。这一位一向有用直到接纳缓冲器(UDR)被读取。对UCSRA进行写入时,这一位要写0。

&8226; Bit 1 – U2X:倍速发送

这一位仅对异步操作有影响。运用同步操作时将此位清零。此方位1可将波特率分频因子从16降到8,然后有用的将异步通讯形式的传输速率加倍。

&8226; Bit 0 – MPCM:多处理器通讯形式

设置此位将发动多处理器通讯形式。MPCM置位后,USART接纳器接纳到的那些不包括地址信息的输入帧都将被疏忽。发送器不受MPCM设置的影响。详细信息请参阅P150“多处理器通讯形式”。

USART操控和状况寄存器B-UCSRB

&8226; Bit 7 – RXCIE:接纳完毕中止使能

置位后使能RXC中止。当RXCIE为1,大局中止标志位SREG置位,UCSRA寄存器的RXC亦为1时能够产生USART接纳完毕中止。

&8226; Bit 6 – TXCIE:发送完毕中止使能

置位后使能TXC中止。当TXCIE为1,大局中止标志位SREG置位,UCSRA寄存器的TXC亦为1时能够产生USART发送完毕中止。

&8226; Bit 5 – UDRIE: USART数据寄存器空中止使能

置位后使能UDRE中止。当UDRIE为1,大局中止标志位SREG置位,UCSRA寄存器的UDRE亦为1时能够产生USART数据寄存器空中止。

&8226; Bit 4 – RXEN:接纳使能

置位后将发动USART接纳器。RxD引脚的通用端口功用被USART功用所替代。制止接纳器将改写接纳缓冲器,并使FE、DOR及PE标志无效。

&8226; Bit 3 – TXEN:发送使能

置位后将发动将发动USART发送器。TxD引脚的通用端口功用被USART功用所替代。TXEN清零后,只需比及一切的数据发送完结后发送器才能够真实制止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器制止后,TxD引脚康复其通用I/O功用。

&8226; Bit 2 – UCSZ2:字符长度

UCSZ2与UCSRC寄存器的UCSZ1:0结合在一起能够设置数据帧所包括的数据位数(字符长度)。

&8226; Bit 1 – RXB8:接纳数据位8

对9位串行帧进行操作时,RXB8是第9个数据位。读取UDR包括的低位数据之前首要要读取RXB8。

&8226; Bit 0 – TXB8:发送数据位8

对9位串行帧进行操作时,TXB8是第9个数据位。写UDR之前首要要对它进行写操作。

USART操控和状况寄存器C-UCSRC

&8226; Bit 7 – URSEL:寄存器挑选

经过该位挑选拜访UCSRC寄存器或UBRRH寄存器。当读UCSRC时,该位为1;当写UCSRC时,URSEL为1。

&8226; Bit 6 – UMSEL: USART形式挑选

经过这一位来挑选同步或异步作业形式。

&8226; Bit 5:4 – UPM1:0:奇偶校验形式

这两位设置奇偶校验的形式并使能奇偶校验。假如使能了奇偶校验,那么在发送数据,发送器都会主动产生并发送奇偶校验位。对每一个接纳到的数据,接纳器都会产生一奇偶值,并与UPM0所设置的值进行比较。假如不匹配,那么就将UCSRA中的PE置位。

&8226; Bit 3 – USBS:中止位挑选

经过这一位能够设置中止位的位数。接纳器疏忽这一位的设置。

&8226; Bit 2:1 – UCSZ1:0:字符长度

UCSZ1:0与UCSRB寄存器的UCSZ2结合在一起能够设置数据帧包括的数据位数(字符长度)。

&8226; Bit 0 – UCPOL:时钟极性

这一位仅用于同步作业形式。运用异步形式时,将这一位清零。UCPOL设置了输出数据的改动和输入数据采样,以及同步时钟XCK之间的联系。

USART波特率寄存器-UBRRL和UBRRH

UCSRC寄存器与UBRRH寄存器共用相同的I/O地址。

&8226; Bit 15 – URSEL:寄存器挑选

经过该位挑选拜访UCSRC寄存器或
UBRRH寄存器。当读UBRRH时,该位为0;当写UBRRH时,URSEL为0。

&8226; Bit 14:12 –保存位

这些位是为今后的运用而保存的。为了与今后的器材兼容,写UBRRH时将这些位清零。

&8226; Bit 11:0 – UBRR11:0: USART波特率寄存器

这个12位的寄存器包括了USART的波特率信息。其间UBRRH包括了USART波特率高4位,UBRRL包括了低8位。波特率的改动将形成正在进行的数据传输受到损坏。写UBRRL将当即更新波特率分频器

进行通讯之前首要要对USART进行初始化。初始化进程一般包括波特率的设定,帧结构的设定,以及依据需求使能接纳器或发送器。关于中止驱动的USART操作,在初始化时首要要清零大局中止标志位(大局中止被屏蔽)

串口初始化:

运用串口->使能接纳->使能发送->波特率(本例运用9600)->奇偶校验(disable)->数据位数(8bit)->中止(RX Complete interrupt

//ICC-AVR application builder : 2007-5-10下午08:51:56

// Target : M16

// Crystal: 11.059Mhz

//UART0 initialisation

// desired baud rate: 9600

// actual: baud rate:9600 (0.0%)

// char size: 8 bit

// parity: Disabled

void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = 0x86;

UBRRL = 0x47; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0x98;

}

//省掉了端口初始化

//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

uart0_init();//留意这句调用串口初始化

MCUCR = 0x00;

GICR= 0x00;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialised

接纳模块(中止承受):

#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{

//uart has received a character in UDR

Data = UDR;

}

留意:Data有必要是大局变量才能从函数中回来得到的值。

发送模块(查询发送):

void USART_Transmit( unsigned char data )

{

/* Wait for empty transmit buffer */

while ( !( UCSRA & (1<

/* Put data into buffer, sends the data */

UDR = data;

}

小提示:

假如承受到一个字符后,立刻回复,只需求在接纳中止函数的最终写值到UDR中即可:

如:#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{ //uart has received a character in UDR

Data = UDR;//从电脑接纳的数据附值给变量Data

UDR = Send_data;//即将发送的数据放到缓存区Send_data与Data能够相同

}

注:Send_data,Data有必要是大局变量才能从函数中回来得到的值。

外部中止

首要回忆一下中止的意义。所谓中止,是指当计算机履行正常程序时,体系中呈现某些急需处理的异常状况和特别恳求,CPU暂时中止现行程序,转去对随机产生的更急迫事情进行处理,处理完结后回来本来的程序持续履行。前面讲的守时器中止和串口中止是中止的两种,现在介绍外部中止。

Atmega 16有三个外部中止源,经过引脚INT0、INT1与INT2触发。中止能够由下降沿、上升沿,或许是低电平触发(INT2为边缘触发中止)。当外部中止使能并且装备为电平触发( INT0/INT1),只需引脚电平为低,中止就会产生。

跟其他中止运用相同,运用外部中止也要使能该中止。

通用中止操控寄存器-GICR

&8226; Bit 7 – INT1:使能外部中止恳求1

当INT1为1’,并且状况寄存器SREG的I标志置位,相应的外部引脚中止就使能了。MCU通用操控寄存器– MCUCR的中止灵敏电平操控1位1/0 (ISC11与ISC10)决议中止是由上升沿、下降沿,仍是INT1电平触发的。只需使能,即便INT1引脚被装备为输出,只需引脚电平产生了相应的改动,中止可将产生。

&8226; Bit 6 – INT0:使能外部中止恳求0

&8226; Bit 5 – INT2:使能外部中止恳求2

功用与使能外部中止恳求1相同

MCU操控寄存器-MCUCRMCU操控寄存器包括中止触发操控位与通用MCU功用

&8226; Bit 3, 2 – ISC11, ISC10:中止1触发办法操控

外部中止1由引脚INT1激起,假如SREG寄存器的I标志位和相应的中止屏蔽方位位的话。触发办法如Table 34所示。在检测边缘前MCU首要采样INT1引脚上的电平。假如挑选了边缘触发办法或电平改动触发办法,那么持续时刻大于一个时钟周期的脉冲将触发中止,过短的脉冲则不能确保触发中止。假如挑选低电平触发办法,那么低电平有必要坚持到当时指令履行完结。

&8226; Bit 1, 0 – ISC01, ISC00:中止0触发办法操控

功用与中止1触发办法操控相同

MCU操控与状况寄存器-MCUCSR

&8226; Bit 6 – ISC2:中止2触发办法操控

异步外中止2由外部引脚INT2激活,假如SREG寄存器的I标志和GICR寄存器相应的中止屏蔽方位位的话。若ISC2写0,INT2的下降沿激活中止。 若ISC2写1,INT2的上升沿激活中止。INT2的边缘触发办法是异步的。只需INT2引脚上产生宽度大于Table 36所示数据的脉冲就会引发中止。若挑选了低电平中止,低电平有必要坚持到当时指令完结,然后才会产生中止。并且只需将引脚拉低,就会引发中止恳求。改动ISC2时有或许产生中止。因而主张首要在寄存器GICR里铲除相应的中止使能位INT2,然后再改动ISC2。最终,不要忘记在从头使能中止之前经过对GIFR寄存器的相应中止标志位INTF2写1’使其清零。

通用中止标志寄存器-GIFR

&8226; Bit 7 – INTF1:外部中止标志1

INT1引脚电平产生跳变时触发中止恳求,并置位相应的中止标志INTF1。假如SREG的位I以及GICR寄存器相应的中止使能位INT1为”1”,MCU即跳转到相应的中止向量。进入中止服务程序之后该标志主动清零。此外,标志位也能够经过写入”1”来清零。

&8226; Bit 6 – INTF0:外部中止标志0

&8226; Bit 5 – INTF2:外部中止标志2

功用与外部中止标志1相同

外部中止初始化:

运用中止IT0、IT1、IT2(详细依据实践状况选定)—— 挑选个中止触发办法

(本例IT0低电平、IT1下降沿、IT2上升沿)

//ICC-AVR application builder : 2007-5-11上午10:35:17

// Target : M16

// Crystal: 11.059Mhz

#include

#include

省掉端口初始化

#pragma interrupt_handler int0_isr:2

void int0_isr(void)//中止0

{

//external interupt on INT0

}

#pragma interrupt_handler int1_isr:3

void int1_isr(void)//中止1

{

//external interupt on INT1

}

#pragma interrupt_handler int2_isr:19

void int2_isr(void)中止2

{

//external interupt on INT2

}

//call this routine to initialise all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

MCUCR = 0x08;//INT0、INT1触发办法

MCUCSR = 0x40;//INT2触发办法(这句要人工输入)

GICR= 0xE0;

TIMSK = 0x00; //timer interrupt sources

SEI(); //re-enable interrupts

//all peripherals are now initialised

}

简略实例参阅程序

为了进一步了解串口和外部中止的运用,下面给出一简略实例。程序功用包括了串口和外部中止,留意程序main函数while循环体中为空,阐明单片机上电今后什么也不干,外部中止INT0,INT1,INT2分别为低电平,下降沿,上升沿触发。INT0触发后PORTA0为高,INT1触发后PORTA1为高,INT2触发后PORTA2为高。串口承受中止为边收边发——从电脑发送一数据给单片机后,单片机立刻又把该数据发送给电脑。请细心领会,然后做后边的练习题。

//ICC-AVR application builder : 2007-5-11 ÏÂÎç 09:56:04
// Target : M16
// Crystal: 11.059Mhz

#include
#include

unsignedintData=”0″;
voidport_init(void)
{
PORTA = 0x00;
DDRA= 0xFF;
PORTB = 0xFF;
DDRB= 0x00;
PORTC = 0xFF;//m103 output only
DDRC= 0x00;
PORTD = 0xFF;
DDRD= 0x00;
}

//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
voiduart0_init(void)
{
UCSRB = 0x00;//disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x86;
UBRRL = 0x47;//set baud rate lo
UBRRH = 0x00;//set baud rate hi
UCSRB = 0x98;
}

#pragma interrupt_handler uart0_rx_isr:12
voiduart0_rx_isr(void)//接纳模块
{
Data = UDR;//从电脑承受数据
//uart has received a character in UDR
UDR = Data;//将该数据发送给电脑,这样做的意图是为了调试

详细运用依据实践要求编写, 假如不要发送给电脑就删除此句
}

#pragma interrupt_handler int0_isr:2
voidint0_isr(void)
{
PORTA = 0x01;//中止0的函数体,在此写入INT0触发后要做的事
//external interupt on INT0
}

#pragma interrupt_handler int1_isr:3
voidint1_isr(void)
{
PORTA = 0x02;//中止1的函数体,在此写入INT1触发后要做的事
//external interupt on INT1
}

#pragma interrupt_handler int2_isr:19
voidint2_isr(void)
{
PORTA = 0x04;//中止2的函数体,在此写入INT2触发后要做的事
//external interupt on INT2
}

//call this routine to initialise all peripherals
voidinit_devices(void)
{
//stop errant interrupts until set up
CLI();//disable all interrupts
port_init();
uart0_init();

MCUCR = 0x08;
MCUCSR = 0x40;//INT2(这句要人工输入)

GICR= 0xE0;
TIMSK = 0x00;//timer interrupt sources
SEI();//re-enable interrupts
//all peripherals are now initialised
}

voidUSART_Transmit(unsignedchardata )//发送模块,该程序没用到
{
/* Wait for empty transmit buffer */
while( !( UCSRA & (1</* Put data into buffer, sends the data */
UDR = data;
}

voidmain()
{
init_devices();
while(1)
{
;

}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/275864.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部