 |
SERIAL INTERFACE
Once of the 8051's many powerful features is its integrated DART,
known as a serial port. The essential operation of a DART is to
perform parallel to-serial conversion for output data, and serial-to
parallel conversion for input data. The fact that the 8051 has an
integrated serial port means that one may very easily read and write
values to the serial port. If it were not for the integrated serial
port, writing a byte to a serial line would be a rather tedious
process requiring 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 party bits.
However, we do not have to do this. Instead, we simply need to
configure the serial port's operation mode and baud rate. Once
configured, all we have to do is write to an SFR (SBUF) to write a
value to the serial port or read the same SFR to read a value from
the serial port. Register SCON controls data communication, register
PCON controls data rates, and pins RXD and TXD connect to the serial
data network. The 8051 will automatically let us know when it has
finished sending the character we wrote and will also let us know
whenever it has received a byte so that we can process it. We do not
have to worry about transmission at the bit level which saves quite
a bit of coding and processing time.
SETTING THE SERIAL PORT MODE
The first things we must do when using the 8051's integrated
serial port is 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.
the "Serial Port Control" (SCON) and "PowerControl"
SFRs. Are:
| Bit |
Name |
Bit Address |
Explanation of Function |
| 7 |
SM0 |
9Fh |
Serial port mode bit 0 |
| 6 |
SM1 |
9Eh |
Serial port mode bit 1. |
| 5 |
SM2 |
9Dh |
Multiprocessor Communications
enable |
| 4 |
REN |
9Ch |
Receiver Enable. This bit must be
set in order to receive characters. |
| 3 |
TB8 |
9Bh |
Transmit bit 8. The 9th bit to
transmit in mode 2 and 3. |
| 2 |
RB8 |
9Ah |
Receive bit 8. The 9th bit
received in mode 2 and 3. |
| 1 |
TI |
99h |
Transmit Flag. Set when a byte
has been completely transmitted. |
| 0 |
RI |
98h |
Receive flag. Set when a byte has
been completely received. |
The functions of SM0 and SM1 is given in the following table:
| SM0 |
SM1 |
Serial Mdoe |
Explanation |
Baud rate |
| 0 |
0 |
0 |
8-bit shift Register |
Oscillator /12 |
| 0 |
1 |
1 |
8-bit UART |
Set by Timer 1(*) |
| 1 |
0 |
2 |
9-bit UART |
Oscillator /32 (*) |
| 1 |
1 |
3 |
9-bit UART |
Set by Timer 1 (*) |
(*) Note: The baud rate indicated in this table is doubled if
PCON.7 (SMOD) is set.
| Bit |
Name |
Explanation of Function |
| 7 |
SM0D |
Serial baud rate modify bit.
(Double Baud rate bit) |
| 6 |
- |
Not implemented |
| 5 |
- |
Not implemented |
| 4 |
- |
Not implemented |
| 3 |
GF1 |
General purpose user flag bit 1. |
| 2 |
GF0 |
General purpose user flag bit 0. |
| 1 |
PD |
Power down bit. |
| 0 |
IDL |
Idle mode bit. |
The SCON SFR allows us to configure the Serial Port. The
functionality of each bit is given as follows.
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 table
immediately above. As one can see, selecting the Serial Mode selects
the mode of operation (8-bit/9-bit, DART 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.
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 "I".
That is to say, ifSM2 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. Normally 9th bit is kept clear so that
the flag is set upon reception of any character.
The next bit, REN, is "Receiver Enable." This bit is very
straightforward: If one want to receive data via the serial port,
this bit must be set.
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 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. IfTB8 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 2or 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 write another byte to the serial port
before the first byte was completely output, the data being sent
would be corrupted. Thus, the 8051 let 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.
SETTING THE SERIAL PORT BAUD RATE
The serial port baud rate depends upon oscillator frequency and
timer 1 overflow. 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 crystal is 11.059Mhz, 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 an 11.059
Mhz 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).
TH1 = 256-((Crystal / 384) I 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.059Mhz 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 one can see, to obtain 19,200 baud on an 11.059Mhzcrystal 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
Here we are able to calculate even TH1 value. Therefore, to obtain
19,200 baud with an
1l.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, the serial
port is ready to be used to send data and receive data.
To write a byte to the serial port one must simply write the value
to the SBUF (99h) SFR. For example, if one 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 measurable amount of
time to transmit. And since the 8051 do 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 let us know when it is done transmitting a character by
setting the TI bit in
SCON. When this bit is set we know that the last character has been
transmitted and that we may send the next character, if any.
Consider the following example:
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 TI 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.
NOTE: In serial interface baud rate is fixed in modes 0 &
2, variable in modes 1 & 3 while data bits are eight in mode 1,
nine in modes 2 & 3 respectively.
BACK
|
 |