C15 - LECTURE - NOTE - 15 (2 in 1) (Microcontroller 8051)
C15 - LECTURE - NOTE - 15 (2 in 1) (Microcontroller 8051)
C15 - LECTURE - NOTE - 15 (2 in 1) (Microcontroller 8051)
MICROCONTROLLER
15.1 Introduction
15.2 The 8051 Architecture
15.3 Interfacing to External Memory
15.4 The 8051 Instruction Set
15.5 Timer Operations
15.6 Serial Port Operations
15.7 Interrupts
15.8 8051 Applications
611 37100 Lecture 15-2
1
15.1 Introduction
Computers can be divided into following two main
types depending on their function:
General purpose
Special purpose
Microcontrollers are more suitable for special
purpose devices.
Microcontroller is a device similar to microprocessor
but includes more circuitry in the same chip.
Program & Data Memory
I/O Ports
Serial Communication
Counters/Timers
Interrupt Control logic
A/D and D/A converters
611 37100 Lecture 15-3
15.1 Introduction
Comparisons between microprocessors and
microcontrollers:
Microprocessor is a single chip CPU, microcontroller
contains, a CPU and much of the remaining circuitry of a
complete microcomputer system in a single chip.
Microcontroller includes RAM, ROM, serial and parallel
interface, timer, interrupt schedule circuitry (in addition to
CPU) in a single chip.
RAM is smaller than that of even an ordinary
microcomputer, but enough for its applications.
Interrupt system is an important feature, as
microcontrollers have to respond to control oriented
devices in real time. For example, opening of microwave
ovens door cause an interrupt to stop the operation.
611 37100 Lecture 15-4
2
15.1 Introduction
Comparisons between microprocessors and
microcontrollers:
Microprocessors are most commonly used as the CPU in
microcomputer systems. Microcontrollers are used in small,
minimum component designs performing control-oriented
activities.
Microprocessor instruction sets are processing intensive
implying powerful addressing modes with instructions
catering to large volumes of data. Their instructions operate
on nibbles, bytes, etc. Microcontrollers have instruction sets
catering to the control of inputs and outputs. Their
instructions operate also on a single bit. A motor, for
example, may be turned ON and OFF by a 1-bit output port.
611 37100 Lecture 15-5
15.1 Introduction
Term 8051 refers to MCS-51 family of microcontroller
ICs by Intel Corp. (From 8031-8752)
Features of 8051 are summarized below:
8 Bit data path and ALU.
Easy interfacing.
12 to 30 MHz versions available.
(1 sec to 400 ns for single cycle instructions).
Full instruction set including:
Multiply and Divide.
Bit set, reset, and test (Boolean instructions).
Variety of addressing modes.
611 37100 Lecture 15-6
3
15.2 8051 Architecture
Hardware Features of the 8051
0K (8031), ROM 4K (8051), EPROM 4K (8751)
RAM 128 bytes (8XX1), 256 bytes (8XX2)
(where X= 0 or 7 & X=3 or 5)
Four 8-bit I/O Ports (P0 - P3)
Two 16-bit Timers/Counters (T0 & T1)
Serial I/O Port
Boolean Processor (Operates on Single Bits)
210 bit-addressable locations
Oscillator & Clock Circuit
611 37100 Lecture 15-7
611 37100 Lecture 15-8
4
15.2 8051 Architecture
The 8051 block diagram
611 37100 Lecture 15-9
611 37100 Lecture 15-10
5
15.2 8051 Architecture
The 8051 logic symbol
611 37100 Lecture 15-11
611 37100 Lecture 15-12
6
15.2 8051 Architecture
I/O Ports
Four 8-bit I/O ports.
Port 0, Port 1, Port 2, Port 3
Most have alternate functions.
Bi-directional.
611 37100 Lecture 15-13
611 37100 Lecture 15-14
7
15.2 8051 Architecture
Port 1 (pin 1 ~ 8 )
As an I/O port:
Standard bi-directional port for interfacing to
external devices as required for I/O.
Alternate functions:
Only on some derivatives.
611 37100 Lecture 15-15
611 37100 Lecture 15-16
8
15.2 8051 Architecture
Port 3 (pin 10 ~ 17 )
Dual purpose I/O port.
As an I/O port:
Standard bi-directional general purpose I/O port.
Alternate functions:
Port pin Alternative function
P3.0 RXD (serial input port)
P3.1 TXD (serial input port)
P3.2 INT0 (external interrupt 0)
P3.3 INT1 (external interrupt 1)
P3.4 T0 (Timer 0 external input)
P3.5 T1 (Timer 1 external input)
P3.6 WR (external data memory write strobe)
P3.7 RD (external data memory read strobe)
611 37100 Lecture 15-17
9
15.2 8051 Architecture
Oscillator and power pins
Pins 18 and 19 are the oscillator pins to connect
the crystal of nominal frequency 12 MHz.
Pin 40 is for +5V and pin 20 is for GND.
611 37100 Lecture 15-19
611 37100 Lecture 15-20
10
15.2 8051 Architecture
Addressing space
611 37100 Lecture 15-21
611 37100 Lecture 15-22
11
15.2 8051 Architecture
Internal data memory
611 37100 Lecture 15-23
611 37100 Lecture 15-24
12
15.2 8051 Architecture
External program memory
64K byte address space.
Enabled by PSEN signal.
611 37100 Lecture 15-25
611 37100 Lecture 15-26
13
15.2 8051 Architecture
Special function register space
128 byte address space, directly addressable as
80H to FFH
16 addresses are bit addressable: Set, Clear,
AND, OR, MOV (those ending with 0 or 8).
Special function space contains:
Special purpose CPU registers.
I/O control registers.
I/O ports.
611 37100 Lecture 15-27
611 37100 Lecture 15-28
14
15.2 8051 Architecture
Program status word (PSW)
Flags are 1-bit registers provided to store the results of certain
program instructions. In order to conveniently address the
flags, they are grouped inside the PSW register.
611 37100 Lecture 15-29
15
15.2 8051 Architecture
Program status word (PSW)
OV: (Overflow Flag) is set after an addition or
subtraction operation if there was an arithmetic
overflow. Results greater than +127 or less than
128 will set OV bit.
P: (Parity Bit) automatically set or cleared each
machine cycle to establish even parity with the
accumulator. Parity bit is most commonly used in
conjunction with serial port routines to include a
parity bit before or after the transmission.
RS1 and RS0 are used to select different register
banks.
611 37100 Lecture 15-31
611 37100 Lecture 15-32
16
15.3 Interfacing to External Memory
Interfacing a 2732 EPROM to the ROMless 8031
microcontroller
611 37100 Lecture 15-33
611 37100 Lecture 15-34
17
15.4 The 8051 Instruction Set
Data transfer instruction
Program branching instructions
Logical and bit operation instructions
Arithmetic operation instructions
611 37100 Lecture 15-35
18
15.4 The 8051 Instruction Set
Addressing mode
Addressing modes are an integral part of each
computers instruction set. They allow different ways
of specifying source/destination operand addresses
depending on the programming situation. There are 8
addressing modes:
1. Immediate
2. Register
3. Direct
4. Indirect
5. Relative
6. Absolute
7. Long
8. Indexed
611 37100 Lecture 15-37
611 37100 Lecture 15-38
19
15.4 The 8051 Instruction Set
Program branching instructions
JMP label (Unconditional jump)
JZ label (Jump if accumulator zero)
JNZ label (Jump if accumulator not zero)
JB bit, label (Jump if bit set)
JNB bit, label (Jump if bit not set)
DJNZ Rn, label (Decrement register and jump if
not zero)
CJNE Rn, #data, label (Compare immediate data
to register and jump if not equal)
CALL label (Call subroutine)
RET (Return)
611 37100 Lecture 15-39
Solution:
READ: MOV A, P1 ; A P1
MOV P0, A ; P0A
JNZ READ ; Repeat until A = 0
NOP ; Remainder of program
etc.
611 37100 Lecture 15-40
20
15.4 The 8051 Instruction Set
EXAMPLE
Repeat the previous example, except stop the looping when the
number 77H is read
Solution:
READ: MOV A, P1 ; A P1
MOV P0, A ; P0A
CJNE A, #77, READ ; Repeat until A = 77H
NOP ; Remainder of program
etc.
611 37100 Lecture 15-41
Solution:
READ: MOV A, P1 ; A P1
MOV P0, A ; P0A
JNB P2.3, READ ; Repeat until P2.3 = 1
NOP ; Remainder of program
etc.
611 37100 Lecture 15-42
21
15.4 The 8051 Instruction Set
EXAMPLE
Write a program that will produce an output at port 0 that counts
down from 80H to 00H.
Solution:
MOV R0, #80H ; R0 80H
COUNT: MOV P0, R0 ; P0 R0
DJNZ R0, COUNT ; Decrement R0, jump to
; COUNT if not 0
NOP ; Remainder of program
etc.
611 37100 Lecture 15-43
611 37100 Lecture 15-44
22
15.4 The 8051 Instruction Set
Logical and bit operation instructions
CLR bit (Clear bit)
SETB bit (Set bit)
CPL bit (Complement bit)
RL A (Rotate accumulator left)
RLC A (Rotate accumulator left through carry)
RR A (Rotate accumulator right)
RRC A (Rotate accumulator right through carry)
611 37100 Lecture 15-45
Solution:
A = 0011 1100
R4 = 0110 0110
A AND R4 = 0010 0100 = 24H
611 37100 Lecture 15-46
23
15.4 The 8051 Instruction Set
EXAMPLE
Determine the contents of the accumulator after the execution
of the following program segments.
Solution:
Assume carry = 0 initially
A = 1100 0011
Rotate left through carry
A = 1000 0110, carry = 1
611 37100 Lecture 15-47
Solution:
(a) CLR ACC.7
(b) SETB P3.0
(c) CPL PSW.0
611 37100 Lecture 15-48
24
15.4 The 8051 Instruction Set
EXAMPLE
Describe the activity at the output of port 0 during the execution
of the following program segment:
611 37100 Lecture 15-49
25
15.4 The 8051 Instruction Set
EXAMPLE
Add the value being input at port 1 to the value at port 2 and
send the result to port 3.
Solution:
MOV R0, P1 ; R0P1
MOV A, P2 ; AP2
ADD A, R0 ; AA+R0
MOV P3, A ; P3A
611 37100 Lecture 15-51
Solution:
MOV A, P0 ; AP0
MOV B, P1 ; BP1
MUL AB ;AXB
MOV P2, A ; P2A (low order)
MOV P3, B ; P3B (high order)
611 37100 Lecture 15-52
26
15.5 Timer Operations
Counter/Timer
Timer is a series of divide-by-two flip-flops that receive
an input signal as a clocking source.
Clock is applied to the first flip- flop, which gives output
divided by 2.
That output of first flip- flop clocks the second flip-flop,
which also divides it by 2 and so on.
The output of the last stage clocks a timer overflow flip-
flop, or flag, which is tested by the software.
It is like a counter. A 16-bit timer would count from
0000H to FFFFH. The overflow flag is set on the
FFFFH-to-0000H count.
There are two timers in 8051, T0 and T1.
There are four modes of timer operations.
611 37100 Lecture 15-53
611 37100 Lecture 15-54
27
15.5 Timer Operations
Counter/Timer control register, TCON
TF1, TF0 : Overflow flags for Timer 1 and Timer 0.
TR1, TR0 : Run control bits for Timer 1 and Timer 0.
Set to run, reset to hold.
IE1, IE0 : Edge flag for external interrupts 1 and 0. *
Set by interrupt edge, cleared when interrupt is processed.
IT1, IT0 : Type bit for external interrupts. *
Set for falling edge interrupts, reset for 0 level interrupts.
* = not related to counter/timer operation but used to detect and
initiate external interrupts.
611 37100 Lecture 15-55
611 37100 Lecture 15-56
28
15.5 Timer Operations
Counter/Timer modes: mode 1 (16-bit timer)
Same as mode 0 except that it is 16-bit. Timer high byte
(THx) is cascaded the timer low byte (TLx) to form a 16-bit
timer, where x = 0 or 1.
Clock is applied to the combined high and low-byte registers.
Overflow occurs on the FFFFH-to-0000H and sets the timer
overflow flag.
MSB is THx bit 7, and LSB is TLx bit 0.
LSB toggles at clock frequency/2 and MSB at clock
frequency/216
611 37100 Lecture 15-57
611 37100 Lecture 15-58
29
15.5 Timer Operations
Counter/Timer modes: mode 3
Timer 0 splits into two 8-bit counter/timers. TL0 and TH0 act
as two separate timers with overflows setting the TF0 and
TF1, respectively.
Timer 1 (when timer 0 is in mode 3):
Counter stopped if in mode 3
Can be used in mode 0, 1, or 2
May be used as a baud rate generator.
611 37100 Lecture 15-59
611 37100 Lecture 15-60
30
15.5 Timer Operations
Clocking source: Event timing
If C/T = 1 (in TMOD), counter operation is selected
and timer is clocked from external source. Usually,
external source supplies the timer with a pulse
upon the occurrence of an event. Timer counts
those events.
External clock source comes through P3.4 (for
Timer 0) and P3.5 (for Timer 1).
Timer registers are incremented in response to a
1-to-0 transition at the external input.
Number of external events is determined in
software by reading the timer registers TLx/THx.
611 37100 Lecture 15-61
611 37100 Lecture 15-62
31
15.5 Timer Operations
Control of timers
Timers are usually initialized once at the beginning
of the program to set the correct operating mode.
Then, within the body of a program, the timers are
started, stopped, flag bits are tested and cleared,
timer registers read or updated, and so on, as
required in the application.
First register to be initialized is TMOD to set the
mode of operation e.g.,
MOV TMOD, #00010000B ; sets Timer 1 in mode 1,
leave C/T = 0 and GATE = 0 for internal clocking, and
clears the Timer 0 bits.
611 37100 Lecture 15-63
32
15.6 Serial Port Operations
8051 includes an on-chip serial port that can operate
in four modes over a wide range of frequencies.
Essential function of serial port is to perform parallel-
to-serial conversion for output data, and serial-to-
parallel conversion for input data.
Transmission bit is P3.1 on pin 11 (TXD) and
reception bit is P3.0 on pin 10 (RXD).
Features full duplex (simultaneous reception and
transmission).
Receive buffering allowing one character to be
received and held in a buffer while a second
character is received. If the CPU reads the first
character before the second is fully received, data
are not lost.
611 37100 Lecture 15-65
33
15.6 Serial Port Operations
Serial port control register: SCON (098H)
SM0, SM1 : Serial Port Mode bits
Mode Baud Rate
00 = Mode 0 : Shift register I/O Fixed (oscillator frequency/12)
01 = Mode 1 : 8-bit UART Variable (set by timer)
10 = Mode 2 : 9-bit UART Fixed (osc frq/32 or osc frq/64 )
11 = Mode 3 : 9-bit UART Variable (set by timer)
SM2 : Serial Port Mode bit
Mode 0 : Not used.
Mode 1 : 1 = Ignore bytes with no stop bit.
Mode 2,3 : 0 = Set receive interrupt (RI) on all bytes.
: 1 = Set RI on bytes where 9th bit is 1.
611 37100 Lecture 15-67
611 37100 Lecture 15-68
34
15.6 Serial Port Operations
Serial interface
Full duplex UART (Universal Asynchronous Receiver
/Transmitter is a device that receives and transmits serial
data with each data character preceded by a start bit 0 and
followed by a stop bit 1). Sometimes a parity bit is inserted
between the last data bit and the stop bit.
The essential operation of a UART is to perform parallel-to-
serial conversion for output data, and serial-to-parallel
conversion for input data.
10 or 11 bit frames.
Interrupt driven.
Registers:
SCON - Serial port control register.
SBUF - Read received data.
- Write data to be transmitted.
611 37100 Lecture 15-69
611 37100 Lecture 15-70
35
15.6 Serial Port Operations
Serial interface operation mode: Mode 0
Mode 0: 8-Bit Shift Register Mode. Terms RXD & TXD are
misleading in this mode. RXD line is used for both input and
output. TXD line serves as the clock.
Eight bits are transmitted and received with the LSB first.
Baud Rate is 1/12 of on-chip oscillator frequency.
Transmission is initiated by any instruction that writes data to
SBUF. Data are shifted out on RXD line with clock pulses
sent out by the TXD line. Each transmitted bit is valid on the
RXD pin for one machine cycle.
Reception is initiated when the receiver enable bit (REN) is 1
and the receive interrupt bit (RI) is 0. REN is set at the
beginning of the program, and then clear RI to begin a data
input operation. The clocking of data into serial port occurs
on the positive edge of TXD.
611 37100 Lecture 15-71
36
15.6 Serial Port Operations
Serial interface operation mode: Mode 2
Mode 2: Serial port operates as a 9-bit UART with a fixed
baud rate. 11 bits are transmitted or received. Start bit
(always 0), 8 data bits (LSB first), a programmable 9th bit,
and a stop bit (always 1).
On transmission, the 9th bit whatever has been put in TB8 in
SCON (may be a parity bit).
On reception, the 9th bit is placed in RB8 in SCON.
Baud Rate is programmable to either 1/32 or 1/64 of the on-
chip oscillator frequency.
611 37100 Lecture 15-73
Summary:
Baud rate: Fixed in mode 2, variable in modes 1 & 3
Data Bits: Eight in mode 1, nine in modes 2 & 3
611 37100 Lecture 15-74
37
15.6 Serial Port Operations
Serial interface initialization
Receiver Enable Bit (REN): must be set by
software to enable the reception of characters at
the beginning of a program when the serial port,
timers, etc. are initialized. The instructions are
SETB REN or MOV SCON, #xxx1xxxxB
The 9th Bit: transmitted must be loaded into TB8
by software and received is placed in RB8.
Adding a Parity Bit: is a common use of 9th bit.
E.g., if communication requires 8 data bits plus
even parity
MOV C, P ; Put even parity bit in C flag
MOV TB8, C ; This becomes the 9th data bit in TB8
MOV SBUF, A ; Move 8 bits from ACC to SBUF
611 37100 Lecture 15-75
38
15.6 Serial Port Operations
Interrupt flags
RI & TI in SCON play an important role in serial
communications. Both bits are set by hardware but must be
cleared by software.
RI is set at the end of character reception and indicates
receive buffer full.
This condition is tested in software or programmed to cause
an interrupt.
If software wishes to input a character from the device
connected to the serial port, it must wait until RI is set, then
clear RI and read the character from SBUF.
WAIT: JNB RI, WAIT ; Check RI until set
CLR RI ; Clear the flag
MOV A, SBUF ; Read character
611 37100 Lecture 15-77
611 37100 Lecture 15-78
39
15.6 Serial Port Operations
Baud rates
Baud rate is also affected by a bit in the PCON
register. PCON.7 is SMOD bit. If SMOD = 1, baud
rate will be doubled in modes 1, 2 and 3.
Mode 2 baud rate is 1/64 of the oscillator
frequency (SMOD = 0) and can be doubled to 1/32
of the oscillator frequency (SMOD = 1).
PCON is not bit-addressable, setting SMOD
without altering the other bits requires a read-
modify-write operation as follows:
MOV A, PCON ; Get current value of PCON
SETB ACC.7 ; Set SMOD
MOV PCON, A ; Write value back to PCON
611 37100 Lecture 15-79
40
15.6 Serial Port Operations
Baud rates
To initialize the serial port to operate as an 8-bit
UART at 2400 baud.
ORG 0000H
MOV SCON,#52H ;serial port mode 1
MOV TMOD,#20H ;timer 1, mode 2
MOV TH1, #-13 ;reload count for 2400 baud
SETB TR1 ;start timer 1
END
611 37100 Lecture 15-81
15.7 Interrupts
An interrupt is the occurrence of an event that
causes a temporary suspension of a program while
the condition is serviced by another program.
It is like a sub-routine. CPU cannot execute more
than one instruction at a time; but it can temporarily
suspend execution of one program, execute another,
then return to the first program.
Difference in interrupt and subroutine is that in an
interrupt-driven system, the interruption occur
asynchronously with the main program, and it is not
known when the main program will be interrupted.
Program that deals with the interrupt is called as
ISR (Interrupt Service Routine).
611 37100 Lecture 15-82
41
15.7 Interrupts
611 37100 Lecture 15-83
15.7 Interrupts
Five interrupt sources in order of polling (priority) sequence are:
External Interrupt 0
Timer 0
External Interrupt 1
Timer 1
Serial Port
The polling sequence is fixed but each interrupt type can be
programmed to one of two priority levels.
If two interrupts of same priority occur simultaneously then
polling sequence will determine which is serviced first.
External interrupts can be programmed for edge or level
sensitivity.
Each interrupt type has a separate vector address.
All interrupts are disabled after a system reset and enabled
individually by software.
611 37100 Lecture 15-84
42
15.7 Interrupts
When an interrupt occurs and is accepted by CPU,
the following actions occur:
Current instructions complete execution
PC is saved on the stack
PC is loaded with the vector address of the ISR
ISR executes and takes action in response to
interrupt
ISR finishes with a RETI instruction
PC is loaded with its old value from the stack
Execution of main program continues where it left
off
611 37100 Lecture 15-85
15.7 Interrupts
Interrupt enable register, IE (0A8H)
EA : Global interrupt enable/ disable.
ES : Serial port interrupt enable/ disable.
ET1: Timer 1 interrupt enable/ disable.
EX1 : External interrupt 1 enable/ disable.
ET0: Timer 0 interrupt enable/ disable.
EX0 : External interrupt 0 enable/ disable.
e.g., Timer 1 interrupt can be enabled as follows:
SETB EA ; Enable global interrupt bit
SETB ET1 ; Enable Timer 1 interrupt
Or MOV IE, #10001000B
611 37100 Lecture 15-86
43
15.7 Interrupts
Interrupt priority register, IP (0B8H)
PS : Priority for Serial port interrupt.
PT1: Priority for Timer 1 interrupt.
PX1 : Priority for External interrupt 1.
PT0 : Priority for Timer 0 interrupt.
PX0 : Priority for External interrupt 0.
611 37100 Lecture 15-87
15.7 Interrupts
Interrupt vectors
When an interrupt is accepted, the value loaded
into the PC is called the interrupt vector. It is the
address of the start of the ISR for the interrupting
source.
When an interrupt is vectored, the flag that
caused the interrupt is automatically cleared by
hardware.
Timer interrupts occur when the timer registers
(TLx/THx) overflow and set the overflow flag
(TFx).
611 37100 Lecture 15-88
44
15.7 Interrupts
Interrupt address
611 37100 Lecture 15-89
15.7 Interrupts
External Interrupts
External interrupt occurs as a result of a low-level
or negative-edge on the INT0 or INT1 pin of 8051.
Flags that generate these interrupts are bits IE0
and IE1 in TCON. These are automatically
cleared when the CPU vectors to the interrupt.
Low-level or negative-edge activated interrupts
can be programmed through IT0 and IT1 bits in
TCON, i.e., ITx = 0 means low-level and ITx = 1
means negative-edge triggered.
611 37100 Lecture 15-90
45
15.8 8051 Applications
EXAMPLE
Assume that there are input switches connected to port 0 and
output LEDs connected to port 1 of an 8051. Write a program that
will flash the LEDs ON one second, OFF one second, the number
of times indicated on the input switches.
Solution:
READ: MOV A, P0 ; Keep reading port 0 switches
JZ READ ; into A until A0
MOV R0, A ; Transfer A to register 0
ON: MOV P1, #0FFH ; Turn ON port 1 LEDs
CALL DELAY ; Delay 1 second
OFF: MOV P1, #00H ; Turn OFF port 1 LEDs
CALL DELAY ; Delay 1 second
DJNZ R0, ON ; Loop back number of times on switches
STOP: JMP STOP ; Suspend operation
611 37100 Lecture 15-91
611 37100 Lecture 15-92
46
15.8 8051 Applications
EXAMPLE
Write a program that will decode the hexadecimal keyboard
shown in the following figure.
611 37100 Lecture 15-93
47
15.8 8051 Applications
COLRD: MOV P0, #0F0H ; Output 0s to all rows
MOV R1, #00H ; Column = 0
JNB P0.4, RET2 ; Return if column 0 is LOW
MOV R1, #01H ; Column = 1
JNB P0.5, RET2 ; Return if column 1 is LOW
MOV R1, #02H ; Column = 2
JNB P0.6, RET2 ; Return if column 2 is LOW
MOV R1, #03H ; Column = 3
JNB P0.7, RET2 ; Return if column 3 is LOW
JMP COLRD ; Else keep reading
RET2: RET ; Return
CONVRT: MOV B, #04H ; B = Multiplication factor
MOV A, R0 ; Move row number to A
MUL AB ; A = row X 4
ADD A, R1 ; A = row X 4 + column
RET ; A now contains value the key
611 37100 Lecture 15-95
611 37100 Lecture 15-96
48
15.8 8051 Applications
Solution:
611 37100 Lecture 15-97
http://www.qsl.net/ok2xdx/Vyskomer/Vyskomer.html
611 37100 Lecture 15-98
49