Вы находитесь на странице: 1из 25

Serial Communication in 8051 Microcontroller

Microcontrollers need to communicate with external devices such as


sensors, computers and so on to collect data for further processing. Data
communication generally done by means of two methods : Parallel and
Serial mode. In the parallel mode data bits are transferred in a fast manner
using more number of lines. But when comes to a Microcontroller system,
we cannot afford to dedicate many lines for data transfer. So UART or Serial
communication in 8051 microcontroller will allow the controlller to send
and receive data’s just byusing two pins

Serial Communication uses only two data lines to establish communication


between Microcontroller and external devices. In this communication data
bits are transferred one bit at a time, so the process will be slow. This article
describes the Interfacing of 8051 with PC to establish communication
through a serial port RS232.
RS232 AND MAX232:
To establish communication between a controller and PC, we must use a
serial I/O standard RS-232 which was widely used in PC and several devices.
PC works on the RS-232 standards which operates at a logic level of -25V to
+25V. But Microcontrollers use TTL logic which works on 0-5V which is not
compatible with the RS-232 standards.

MAX232 is a specialized IC which offers intermediate link between the


Microcontroller and PC. The transmitters of this IC will convert the TTL input
level to the RS-232 Voltage standards. Meanwhile the receivers of this IC
will convert RS-232 input to 5V TTL logic levels.
PIN DESCRIPTION OF MAX232

MAX232 is a widely known IC used for establishing serial communication


between Microcontrollers and Personal Computers (PC). This IC is used to
convert TTL/CMOS logic levels to RS232 Logic levels during the process of
serial communication. Usually a Microcontroller operates at TTL (Transistor
Transistor Logic) of about 0-5V whereas a PC works on RS232 standards that
is (-25 to +25V). So it is not possible to interface a PC directly with a
Microcontroller and this is exactly where a MAX232 IC comes into Play.

WORKING OF MAX232:

MAX232 offers a intermediate link between the Microcontroller and your


PC. The transmitters of this IC will convert the TTL/CMOS input level into
RS232 voltage levels. The receiver pins are capable of taking input around
-30V to +30V. Meanwhile each receiver converts RS232 inputs to 5V
TTL/CMOS logic level which was fed into the Rx pin of a Microcontroller. So
summing up this IC acts as a intermediator by converting the voltage level
of signals.

The IC is capable of supplying RS232 standard voltage logic levels by means


of a single 5V power supply. This was done by means of a capacitive voltage
generator used within that IC. So we need to connect three external
capacitors whose value range from 1uF to 22uF. The capacitors are meant to
be connected across the pins C1+ & C1-, C2+ & C2-, C3+ & C3-.

SCON Register
SCON is a bit addressable register is used to set the mode in which the
serial communication takes in the controller. The above figure shows the
configuration of the SCON register. The functions of each bit are listed
below.

Serial Mode of 8051


SM0, SM1: Serial Mode control Bits

SM2: Multiprocessor mode control bit, logic 1 enables Multi processor


mode and 0 for normal mode.

REN: Enables Serial reception. If set it enables the reception, otherwise the
reception is disabled.

TB8: It is the 9th bit of the data that is to be transmitted.

RB8: It is used in modes 2 and 3, it is the 9th bit received by the


microcontroller.

TI: It is known as Transmit Interrupt flag which is set by the hardware to


indicate the end of a transmission. It has to be cleared by the software.

RI: It is known as Receive Interrupt flag which is set by the hardware to


indicate the end of a reception. It has to be cleared by the software.

BAUD RATE:
It is defined as number of bits transmitted or received per second and
usually expressed in Bits per second bps. For mode 0 and mode 2 the baud
rate is determined by means of 1/12, 1/32 or 1/64 of the crystal frequency
whereas for mode 1 and 3 it is determined by means of timer 1.

Baud Rate by Timer1

SBUF REGISTER:
It is a 8 bit register that holds the data needed to be transmitted or the data
that is received. The serial port of the 8051 is full duplex so the
microcontroller manages to transmit and receive data into the register
simultaneously.

CODE:
#include<reg51.h>

void initialize() // Initialize Timer 1 for serial communication

TMOD=0x20; //Timer1, mode 2, baud rate 9600 bps


TH1=0XFD; //Baud rate 9600 bps

SCON=0x50;

TR1=1; //Start timer 1

void receive() //Function to receive serial data

unsigned char value;

while(RI==0); //wait till RI flag is set

value=SBUF;

P1=value;

RI=0; //Clear the RI flag

void transmit() // Funtion to transmit serial data

SBUF='o'; //Load 'o' in SBUF to transmit

while(TI==0); //Wait till TI flag is set or data transmission ends

TI=0; //Clear TI flag

SBUF='k';

while(TI==0);

TI=0;

void main()
{

while(1)

initalize();

receive();

transmit();

initialize – Initialize timer for baud rate and set mode for serial
transmissionThe above program is coded in such a way to receive a
character from PC and in return transmits “ok” to it. This code have three
parts initialize,receive and transmit to perform the process of serial
communication. This can be tested using Hyperterminal software after
connecting your controller to PC through RS232.

Receive – Enable controller to receive data bit from PC.

Transmit – Enable transmission of data from 8051 to PC.

8051 UART Tutorial


Introduction
The microcontroller MCS51 has an inbuilt UART for carrying out serial
communication. The serial communication is done in the asynchronous
mode. A serial port, like other PC ports, is a physical interface to establish
data transfer between computer and an external hardware or device. This
transfer, through serial port, takes place bit by bit.

Bit Addressable : We can assign the values bit by bit. For example for single
bit we can set weather 1 or 0.
Byte Addressable : We cant assign the values bit by bit. We can set only
byte by byte.

First we will see the SFRs.

Registers used for UART

SCON (Serial Control Register) – Bit Addressable

SBUF (Serial Buffer Register) – Byte Addressable

PCON (Power Control Register) – Byte Addressable

SCON (Serial Control Register)

This register is bit addressable.

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

SM0 : Serial Port Mode Specifier 1 bit.

SM1 : Serial port Mode Specifier 2 bit

These Two bits are used to select the Mode of the UART.

SM0

SM1
Mode

Baudrate

Shift Register (Mode 0)

Fosc/12

8-bit UART (Mode 1)

Variable (Set by Timer 1)

9-bit UART (Mode 2)

Fosc/32 or Fosc/64

9-bit UART (Mode 3)

Variable (Set by Timer 1)

SM2 : Multiprocessor communications bit. Set/cleared by program to


enable multiprocessor communications in modes 2 and 3. When set to 1 an
interrupt is generated if bit 9 of the received data is a 1; no interrupt is
generated if bit 9 is a 0. If set to 1 for mode 1, no interrupt will be generated
unless a valid stop bit is received. Clear to 0 if mode 0 is in use.
REN : Receive enable bit. Set to 1 to enable reception; cleared to 0 to
disable reception.

TB8 : Transmitted bit 8. Set/cleared by program in modes 2 and 3.

RB8 : Received bit 8. Bit 8 of received data in modes 2 and 3; stop bit in
mode1. Not used in mode 0.

TI : Transmit Interrupt flag. Set to one at the end of bit 7 time in mode 0,
and at the beginning of the stop bit for other modes. Must be cleared by
the program.

RI : Receive Interrupt flag. Set to one at the end of bit 7 time in mode 0,
and halfway through the stop bit for other moves. Must be cleared by the
program.

Explanation

The first four bits (bits 4 through 7) are configuration bits. Bits SM0 and
SM1 let us set the serial mode to a value between 0 and 3, inclusive. The
four modes are defined in the chart immediately above. As you can see,
selecting the Serial Mode selects the mode of operation (8-bit/9-bit, UART
or Shift Register) and also determines how the baud rate will be calculated.
In modes 0 and 2 the baud rate is fixed based on the oscillator’s frequency.
In modes 1 and 3 the baud rate is variable based on how often Timer 1
overflows. We’ll talk more about the various Serial Modes in a moment.

The next bit, SM2, is a flag for “Multiprocessor communication.” Generally,


whenever a byte has been received the 8051 will set the “RI” (Receive
Interrupt) flag. This lets the program know that a byte has been received
and that it needs to be processed. However, when SM2 is set the “RI” flag
will only be triggered if the 9th bit received was a “1”. That is to say, if SM2
is set and a byte is received whose 9th bit is clear, the RI flag will never be
set. This can be useful in certain advanced serial applications. For now it is
safe to say that you will almost always want to clear this bit so that the flag
is set upon reception of any character.

The next bit, REN, is “Receiver Enable.” This bit is very straightforward: If
you want to receive data via the serial port, set this bit. You will almost
always want to set this bit.

The last four bits (bits 0 through 3) are operational bits. They are used when
actually sending and receiving data. They are not used to configure the
serial port.

The TB8 bit is used in modes 2 and 3. In modes 2 and 3, a total of nine data
bits are transmitted. The first 8 data bits are the 8 bits of the main value,
and the ninth bit is taken from TB8. If TB8 is set and a value is written to the
serial port, the data’s bits will be written to the serial line followed by a
“set” ninth bit. If TB8 is clear the ninth bit will be “clear.”

The RB8 also operates in modes 2 and 3 and functions essentially the same
way as TB8, but on the reception side. When a byte is received in modes 2
or 3, a total of nine bits are received. In this case, the first eight bits
received are the data of the serial byte received and the value of the ninth
bit received will be placed in RB8.

TI means “Transmit Interrupt.” When a program writes a value to the serial


port, a certain amount of time will pass before the individual bits of the
byte are “clocked out” the serial port. If the program were to write another
byte to the serial port before the first byte was completely output, the data
being sent would be garbled. Thus, the 8051 lets the program know that it
has “clocked out” the last byte by setting the TI bit. When the TI bit is set,
the program may assume that the serial port is “free” and ready to send the
next byte.

Finally, the RI bit means “Receive Interrupt.” It functions similarly to the “TI”
bit, but it indicates that a byte has been received. That is to say, whenever
the 8051 has received a complete byte it will trigger the RI bit to let the
program know that it needs to read the value quickly, before another byte is
read.
SBUF (Serial Buffer Register)
SBUF Register: For a byte of data to be transferred via the TxD line, it must
be placed in the SBUF.

SBUF holds the byte of data when it is received by the MCS51’s RxD line.

PCON (Power Control Register)


This Register is not Bit Addressable.

SMOD

GF1

GF0

PD

IDL

SMOD : Double baud rate bit. If Timer 1 is used to generate baud rate and
SMOD = 1, the baud rate is doubled when the serial port is used in modes 1,
2, or 3.

GF1 : General-purpose flag bit.

GF0 : General-purpose flag bit.

PD : Power Down bit. Setting this bit activates the Power Down
operation in the 8051BH. (Available only in CHMOS).

IDL : Idle Mode bit. Setting this bit activates Idle Mode operation in the
8051BH. (Available only in CHMOS).
Initialize the UART (Configuration)
That’s all about Registers. When using the integrated serial port, obviously
configure it. This lets us tell the 8051 how many data bits we want, the
baud rate we will be using, and how the baud rate will be determined.

Here we are going to use Mode 1. Because that is 8-bit UART and we can
generate Baudrate using Timer 1. If you dont know about the timer please
click Here for the reference.

So Mode 1 means we have to give 0x50 value to the SCON Register.

SCON = 0x50;

Generating Baudrate using Timer 1


Once the Serial Port Mode has been configured, as explained above, the
program must configure the serial port’s baud rate. This only applies to
Serial Port modes 1 and 3.

The Baud Rate is determined based on the oscillator’s frequency when in


mode 0 and 2. In mode 0, the baud rate is always the oscillator frequency
divided by 12. This means if you’re crystal is 11.0592Mhz, mode 0 baud rate
will always be 921,583 baud. In mode 2 the baud rate is always the
oscillator frequency divided by 64, so a 11.059Mhz crystal speed will yield a
baud rate of 172,797.

In modes 1 and 3, the baud rate is determined by how frequently timer 1


overflows. The more frequently timer 1 overflows, the higher the baud rate.
There are many ways one can cause timer 1 to overflow at a rate that
determines a baud rate, but the most common method is to put timer 1 in
8-bit auto-reload mode (timer mode 2) and set a reload value (TH1) that
causes Timer 1 to overflow at a frequency appropriate to generate a baud
rate.
To determine the value that must be placed in TH1 to generate a given baud
rate, we may use the following equation (assuming PCON.7 is clear).

Calculation
TH1 = 256 - ((Crystal / 384) / Baud)

If PCON.7 is set then the baud rate is effectively doubled, thus the equation
becomes:

TH1 = 256 - ((Crystal / 192) / Baud)

For example, if we have an 11.0592Mhz crystal and we want to configure


the serial port to 19,200 baud we try plugging it in the first equation:

TH1 = 256 - ((Crystal / 384) / Baud)

TH1 = 256 - ((11059000 / 384) / 19200 )

TH1 = 256 - ((28,799) / 19200)

TH1 = 256 - 1.5 = 254.5

As you can see, to obtain 19,200 baud on a 11.059Mhz crystal we’d have to
set TH1 to 254.5. If we set it to 254 we will have achieved 14,400 baud and
if we set it to 255 we will have achieved 28,800 baud. Thus we’re stuck…

But not quite… to achieve 19,200 baud we simply need to set PCON.7
(SMOD). When we do this we double the baud rate and utilize the second
equation mentioned above. Thus we have:

TH1 = 256 - ((Crystal / 192) / Baud)

TH1 = 256 - ((11059000 / 192) / 19200)

TH1 = 256 - ((57699) / 19200)

TH1 = 256 - 3 = 253


Here we are able to calculate a nice, even TH1 value. Therefore, to obtain
19,200 baud with an 11.059MHz crystal we must:

Configure Serial Port mode 1 or 3.

Configure Timer 1 to timer mode 2 (8-bit auto-reload).

Set TH1 to 253 to reflect the correct frequency for 19,200 baud.

Set PCON.7 (SMOD) to double the baud rate.

Code For Generating 9600 baudrate

SCON=0x50; //Mode 1, Baudrate generating using Timer 1

TMOD=0x20; //Timer 1 Auto reload mode

TH1=TL1=0xfd; //Values Calculated for 9600 baudrate

TR1=1; //Run the timer

Programming For UART

Program 1
This program is used to send the data “embetronicx” via serial port to the
computer.

#include<reg51.h>

void send(unsigned char *s)

while(*s) {

SBUF=*s++;

while(TI==0);

TI=0;
}

void main()

unsigned int i;

SCON=0x50;

TMOD=0x20;

TH1=TL1=0xfd;

TR1=1;

while(1) {

send("Embetronicx ");

for(i=0; i<=35000; i++);

Program 2
In this program i have added the receiver code also. This code sends the
data to 8051 microcontroller whatever i’m typing in the keyboard of the
computer. Then microcontroller again resend the data to computer.

#include<reg51.h>

void main()

unsigned char a;
SCON=0x50;

TMOD=0x20;

TH1=TL1=0xfd;

TR1=1;

while(1) {

while(RI==0);

RI=0;

a=SBUF; //Received data is stored into the a variable

SBUF=a; //Send the character in the variable a

while(TI==0);

TI=0;

ASSEMBLY CODE
Serial_Init:

;Set timer 1 mode to 8-bit Auto-Reload

mov TMOD,#20H

;Enable reception

;Set Serial port mode to 8-bit UART

mov SCON,#50H

;Set baudrate to 9600 at 11.0592MHz

mov TH1,#0FDH
mov TL1,#0FDH

;Start Timer

setb TR1

ret

Serial_Send:

;wait for last data to be

;sent completely

jnb TI,Serial_Send

;clear the transmit interrupt flag

clr TI

;Then move the data to send in SBUF

mov SBUF,A

ret

Serial_Read:

;Wait for Receive interrupt flag

jnb RI,Serial_Read

;If flag is set then clear it

clr RI

;Then read data from SBUF

mov A,SBUF

ret
a.) Mode selection § The different modes of serial communication can be
set by setting the values of SM0 & SM1.
b.) There are four modes; we will be discussing here only mode one. § The
mode1 can be selected by setting SM0=0 & SM1=1
c.) 1.The first mode allows the baud rate (discussed below) to be variable. It
has one start and one stop bit.
2. REN (receive enable): If we wish to both transfer and receive, we can set
REN= 1 otherwise receiving can be disabled by making REN= 0. c.) SM2,
TB8, RB8: are set to zero in mode 1
d.) TI (transmit interrupt): when 8051 finishes the transfer; it raises this
flag to indicate that it is ready for transfer of another byte.
e.) RI (receiving interrupt): when the data is received serially via RxD, it gets
rid of start and stop bit and the byte is placed in SBUF register. Then the RI
flag is raised to indicate that a byte has been received and should be picked.
Rate of data transmission (baud rate): The rate of transfer and reciving can
be changed by a programmer. This is done with the help of ‘timer1’.
crystal frequency ÷12=machine cycle machine cycle÷32=baud rate
In case we are using a crystal of frequency 11.0592MHz; machine cycle
frequency = 921.6 KHz; baud rate= 28,800 Hz. To set timer1 to this baud
rate we have to program it in mode2 (8 bit auto-reload).
To set a particular baud rate what should be the value of TH1->
·0 TH1=? Let’s discuss this with an example. Suppose we wish to set
‘9600’ baud rate:
·1 28,800/9600= 3;
·2 TH1= -3 or FD hex.

Serial Port Programming: 8051 Serial Communication


One of the 8051’s many powerful features -integrated UART, known as a
serial port to easily read and write values to the serial port instead of
turning on and off one of the I/O lines in rapid succession to properly "clock
out" each individual bit, including start bits, stop bits and parity bits.
Setting the Serial Port Mode configures it by specifying 8051 how many
data bits we want, the baud rate we will be using and how the baud rate
will be determined. First, let’s present the "Serial Control" (SCON) SFR and
define what each bit of the SFR
represents:
Table 5.3 Definition of SCON SFR

Additionally, it is necessary to define the function of SM0 and SM1 by an


additional table: Table 5.4 SCON as serial Port
Table 5.4 Modes of SCON
The SCON SFR allows us to configure the Serial Port. The first four bits (bits
4 through 7) are configuration bits:
Bits SM0 and SM1 is to set the serial mode to a value between 0 and 3,
inclusive as in table above selecting the Serial Mode selects the mode of
operation (8-bit/9-bit, UARTor Shift Register) and also determines how the
baud rate will be calculated. In modes 0 and 2 the baud rate is fixed based
on the oscillator’s frequency. In modes 1 and 3 the baud rate is variable
based on how often Timer 1 overflows.
The next bit, SM2, is a flag for " Multiprocessor communication whenever a
byte has been received the 8051 will set the "RI" (Receive Interrupt) flag to
let the program know that a byte has been received and that it needs to be
processed.
However, when SM2 is set the "RI" flag will only be triggered if the 9th bit
received was a "1". if SM2 is set and a byte is received whose 9th bit is clear,
the RI flag will never be set .You will almost always want to clear this bit so
that the flag is set upon reception of any character.
The next bit, REN, is "Receiver Enable." is set indicate to data received via
the serial port.The last four bits (bits 0 through 3) are operational bits. They
are used when actually sending and receiving data--they are not used to
configure the serial port.
The TB8 bit is used in modes 2 and 3. In modes 2 and 3, a total of nine data
bits are transmitted. The first 8 data bits are the 8 bits of the main value,
and the ninth bit is taken from TB8. If TB8 is set and a value is written to the
serial port, the data’s bits will be written to the serial line followed by a
"set" ninth bit. If TB8 is clear the ninth bit will be "clear."
The RB8 also operates in modes 2 and 3and functions essentially the same
way as TB8, but on the reception side. When a byte is received in modes 2
or 3, a total of nine bits are received. In this case, the first eight bits
received are the data of the serial byte received and the value of the nineth
bit received will be placed in RB8.TI means "Transmit Interrupt."
When a program writes a value to the serial port, a certain amount of time
will pass before the individual bits of the byte are "clocked out" the serial
port. If the program were to write another byte to the serial port before the
first byte was completely output, the data being sent would be garbled.
Thus, the8051 lets the program know that it has "clocked out" the last byte
by setting the TI bit.
When the TI bit is set, the program may assume that the serial port is
"free" and ready to send the next byte. Finally, the RI bit means "Receive
Interrupt." It functions similarly to the "TI" bit, but it indicates that a byte
has been received. Whenever the 8051 has received a complete byte it will
trigger the RI bit to let the program know that it needs to read the value
quickly, before another byte is read.

Setting the Serial Port Baud Rate


Once the Serial Port Mode has been configured, the program must
configure the serial port’s baud rate. This only applies to Serial Port modes
1 and 3. The Baud Rate is determined based on the oscillator’s frequency
when in mode 0 and 2. In mode 0, the baud rate is always the oscillator
frequency divided by 12. This means if you’re crystal is 1.059 Mhz, mode 0
baud rate will always be 921,583 baud. In mode 2 the baud rate is always
the oscillator frequency divided by 64, so a 11.059Mhz crystal speed will
yield a baud rate of172,797.
In modes 1 and 3, the baud rate is determined by how frequently timer 1
overflows. The more frequently timer 1 overflows, the higher the baud rate.
There are many ways one can cause timer 1 to overflow at a rate that
determines a baud rate, but the most common method is to put timer 1 in
8-bit auto-reload mode (timer mode2) and set a reload value (TH1) that
causes Timer 1 to overflow at a frequency appropriate to generate a baud
rate.
To determine the value that must be placed in TH1 to generate a given
baud rate, (assuming PCON.7 is clear).
TH1 = 256 - ((Crystal / 384) / Baud)
If PCON.7 is set then the baud rate is effectively doubled, thus the equation
becomes:
TH1 = 256 - ((Crystal / 192) / Baud)
For example, if we have an 11.059 Mhz crystal and we want to configure
the serial port to 19,200 baud we try plugging it in the first equation: TH1 =
256 - ((Crystal / 384) / Baud)
TH1 = 256 - ((11059000 / 384) / 19200) TH1 = 256 - ((28,799) / 19200)
TH1 = 256 - 1.5 = 254.5
To obtain 19,200 baud on a 11.059Mhz crystal we’d have to set TH1 to
254.5. If we set it to 254 we will have achieved 14,400 baud and if we set it
to 255 we will have achieved 28,800 baud.To achieve 19,200 baud we
simply need to set PCON.7 (SMOD). When we do this we double the baud
rate and utilize the second equation mentioned above. Thus we have:
TH1 = 256 - ((Crystal / 192) / Baud) TH1 = 256 - ((11059000 / 192) / 19200)
TH1 = 256 - ((57699) / 19200)
TH1 = 256 - 3 = 253
Therefore, to obtain 19,200 baud with an 11.059MHz crystal we must:
1) Configure Serial Port mode 1 or 3.
2) Configure Timer 1 to timer mode 2 (8-bit auto reload).
3) Set TH1 to 253 to reflect the correct frequency for 19,200 baud.
4) Set PCON.7 (SMOD) to double the baud rate.

Writing to the Serial Port


Once the Serial Port has been properly configured as explained above, the
serial port is ready to be used to send data and receive data.
To write a byte to the serial write the value to the SBUF (99h) SFR. For
example, if you wanted to send the letter "A" to the serial port, it could be
accomplished as easily as: MOV SBUF, #’A’
Upon execution of the above instruction the 8051 will begin transmitting
the character via the serial port. Obviously transmission is not
instantaneous--it takes a measureable amount of time to transmit. And
since the 8051 does not have a serial output buffer we need to be sure that
a character is completely transmitted before we try to transmit the next
character.The 8051 lets us know when it is done transmitting a character by
setting the TI bit in SCON. When this bit is set the last character has been
transmitted and that send the next character, if any. Consider the following
code segment:
CLR TI; Be sure the bit is initially clear
MOV SBUF, #’A’; Send the letter ‘A’ to the serial port
JNB TI,$;Pause until the RI bit is set.
The above three instructions will successfully transmit a character and wait
for the TI bit to be set before continuing. The last instruction says "Jump if
the TI bit is not set to $"—
$, in most assemblers, means "the same address of the current
instruction." Thus the 8051 will pause on the JNB instruction until the TI bit
is set by the 8051 upon successful transmission of the character.

Reading the Serial Port


Reading data received by the serial port is equally easy. To read a byte from
the serial port one just needs to read the value stored in the SBUF (99h) SFR
after the 8051 has automatically set the RI flag in SCON.For example, if your
program wants to wait for a character to be received and subsequently read
it into the Accumulator, the following code segment may be used:
JNB RI,$;Wait for the 8051 to set the RI flag
MOV A,SBUF; Read the character from the serial port
The first line of the above code segment waits for the 8051 to set the RI
flag; again, the8051 sets the RI flag automatically when it receives a
character via the serial port. So as long as the bit is not set the program
repeats the "JNB" instruction continuously. Once the RI bit is set upon
character reception the above condition automatically fails and program
flow falls through to the "MOV" instruction which reads the value.

Вам также может понравиться