architecture and programming of 8051 micro controllers exemples

46

Upload: ajoaomv

Post on 28-Aug-2014

66 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Architecture and Programming of 8051 Micro Controllers Exemples
Page 2: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 1 de 45

Chapter 6 : Examples

6.1 Basic connecting of the microcontroller

6.2 Additional components

6.3 Examples

Introduction

The purpose of this chapter is to inform you about basic issues on microcontrollers that one should

know in order to use them successfully in practice. That is why you will not find here some ultra

interesting program or device schematic with amazing solutions. Instead of that, examples described

in this chapter are more proof that program writing is neither privilege nor talent issue but ability of

simple putting puzzle pieces together using directives. Device development mainly comes to the

method “test-correct-repeat”. Of course, the more you are into it, the issues become more

complicated as the puzzle pieces are put together by both children and first-class architects...

6.1 Basic connecting of the microcontroller

As seen on the above figure, in order to enable microcontroller to operate properly it is necessary to

provide :

Power supply

Reset signal

Clock signal

Obviously, all this is about very simple circuits, but it does not have to be always like that. If device

is used for handling expensive machines or for maintaining vital functions, everything becomes

more and more complicated! This kind of solution is quite enough for the time being...

Page 3: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 2 de 45

Power supply

Although this circuit can operate with different power supply voltage, why to test “Marphy’s low”?!

Voltage of 5V is so common that it imposes itself. The circuit, shown on the figure, uses cheap

voltage stabilisator LM7805 and provides high-quality voltage level and guite enough current to

enable microcontroller and “peripheral electronics” to operate ( sufficient current in this case

amounts to 1A)!

Reset signal

In order to operate properly, the microcontroller must “see” logic 0 (0V) on reset pin RS (It explains

connection pin-resistor 10K-ground). Pushbutton which connects reset pin RS to power supply

VCC is not necessary but it is almost always built in because it enables microcontroller safe return

to normal operating conditions when the things go wrong. By activating this pin, 5V is brought to it,

the microcontroller is reset and program starts execution from the beginning.

Clock signal

Although the microcontroller has built in oscillator, it cannot operate without two external

condensators and quartz crystal which stabilize its frequency (microcontroller’s operating speed).

Naturally, there are some exceptions too:

if this solution cannot be applied for some reason, there are always alternative ones. One of them is

to bring clock signal from special source through invertor. See the figure on the left.

6.2 Additional components

Regardless of the fact that microcontrollers are the product of modern technology, they are not so

useful without being connected to additional components. Simply, the appearance of voltage on its

pin means nothing if it does not perform certain operations (turn on/off, shift, display and similar).

Switches and Pushbuttons

There is nothing simpler than this! This is the simplest way of controlling appearance of some

voltage on microcontroller’s input pin. There is also no need for additional explanation of how these

components operate.

Page 4: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 3 de 45

Nevertheless, it is not so simple in practice... This is about something commonly unnoticeable when

using these components in everyday life. It is about contact bounce- a common problem with m e c

h a n i c a l switches. If contact switching does not happen so quickly, several consecutive bounces

can be noticed prior to maintain stable state. The reasons for this are: vibrations, slight rough spots

and dirt. Anyway, whole this process does not last long (a few micro- or miliseconds), but long

enough to be registered by the microcontroller. Concerning pulse counter, error occurs in almost

100% of cases!

The simplest solution is to connect simple RC circuit which will “suppress” each quick voltage

change. Since the bouncing time is not defined, the values of elements are not strictly determined.

In the most cases, the values shown on figure are sufficient.

If complete safety is needed, radical measures should be taken! The circuit, shown on the figure (RS

flip-flop), changes logic state on its output with the first pulse triggered by contact bounce. Even

though this is more expensive solution (SPDT switch), the problem is definitely resolved! Besides,

since the condensator is not used, very short pulses can be also registered in this way.

In addition to these hardware solutions, a simple software solution is commonly applied too: when a

program tests the state of some input pin and finds changes, the check should be done one more

time after certain time delay. If the change is confirmed it means that switch (or pushbutton) has

changed its position. The advantages of such solution are obvious: it is free of charge, effects of

Page 5: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 4 de 45

disturbances are eliminated too and it can be adjusted to the worst-quality contacts. Disadvantage is

the same as in case of using RC filter-pulses shorter than program delay cannot be registered.

Optocouplers

Optocoupler is a device commonly used to galvanically separate microcontroller’s electronics from

potentionally dangerous currents and voltages in environment. Optocouplers usually have one, two

or four light sources (LE diodes) on their input while on their output, opposite to diodes, there are

the same number of elements sensitive to light (phototransistors, photo-thyristors or photo-triacs).

The point is that there is no electrical contact between input and output, but the signal is transferred

by light. For this isolation to make sense, electrical power supply of diodes and photo-sensitive

elements must be independent. Being connected in this way, the microcontroller and expensive

additional electronics are completely protected from high voltage and disturbances which in

practice are the most common cause of destroying, damaging or unstable operating of electronic

devices. Most frequently used optocouplers are those with phototransistors on their output. In case

the model of optocouplers with internal base-to-pin 6 connection is on disposal (there are

optocouplers without it), the base can be left unconnected. Optional connection, decreasing effects

of disturbances by eliminating very short pulses, is on the figure marked with a broken line .

Relays

Relays are elements connected to ouput pins of the microcontroller and used to turn on/off all that

being out of board which has sensitive components: motors, transformators, heaters, bulbs, high-

voltage components, antenna systems etc. There are various types of relays but all have the same

Page 6: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 5 de 45

operating principle: when a current flows through the coil, it makes or brakes machanical

connection between one or more pairs of contacts. As it is case with optocouplers, there is no

galvanically connection (electrical contact) between input and output circuits. Relays usually

demand both higher voltage and current to start operating but there are also miniature versions

which can be activated with a low current directly obtained from the microcontroller’s pin.

Below figure presents one solution specific to the 8051 microcontrollers. In this very case,

darlington transistor is used to activate relays because of its high current gain. This is not in

accordance with “rules”, but it is necessary in case of logic one activation since the current is then

very low (pin acts as input)!

In order to be prevented from appearance of high voltage of self-induction caused by a sudden stop

of current flow through the coil, an inverted polarized diode is connected in parallel to the coil. The

purpose of this diode is to “cut off” the voltage peak.

Light-emitting diode (LED)

Light-emitting diodes are elements for light signalization in electronics. They are manufactured in

different shapes, colors and sizes. For their low price, low consumption and simple use, they have

almost completely pushed aside other light sources- bulbs at first place. They perform similar to

common diodes with the difference that they emit light when current flows through them.

Page 7: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 6 de 45

It is important to know that each diode will be immediately destroyed unless its current is limited.

This means that a conductor must be connected in parallel to a diode. In order to correctly

determine value of this conductor, it is necessary to know diode’s voltage drop in forward direction,

which depends on what material a diode is made of and what colour it is. Values typical for the

most frequently used diodes are shown in table below: As seen, there are three main types of LEDs.

Standard ones get ful brightness at current of 20mA. Low Current diodes get ful brightness at ten

times lower current while Super Bright diodes produce more intensive light than Standard ones.

Color Type Typical current

Id (mA)

Maximal current

If (mA)

Voltage drop Ud

(V)

Infrared - 30 50 1.4

Red Standard 20 30 1.7

Red Super Bright 20 30 1.85

Red Low Current 2 30 1.7

Orange - 10 30 2.0

Green Low Current 2 20 2.1

Yellow - 20 30 2.1

Blue - 20 30 4.5

White - 25 35 4.4

Since the 8051 microcontrollers can provide only low input current and since their pins are

configured as outputs when voltage level on them is equal to 0, direct connectining to LEDs is

carried out as it is shown on figure (Low current LED, cathode is connected to output pin).

Page 8: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 7 de 45

LED displays

Basically, LED displays are nothing else but several LEDs moulded in the same plastic case.

Diodes are arranged so that different marks-commonly digits: 0, 1, 2,...9 are displayed by activating

them. There are many types of displays composed of several dozens of built in diodes which can

display different symbols.

The most commonly used are so called 7-segment displays. They are composed of 8 LEDs, 7

segments are arranged as a rectangle for symbol displaying and there is additional segment for

decimal point displaying. In order to simplify connecting, anodes and catodes of all diodes are

connected to the common pin so that there are common cathode displays and common anode

displays. Segments are marked with the latters Ato G as shown on the figure on the left. When

connecting, each diode is treated independently, which means that each must have its own

conductor for current limitation.

When connecting displays to the microcontroller, the greatest problem is a great deal of valuable

I/O pins which they “occupy”, especially if it is needed to display several-digit numbers. Problem is

more than obvious if for example it is needed to display two 6-digit numbers (a simple calculation

shows that 96 output pins are needed)!The solution on this problem is called MULTIPLEXING.

This is how optical illusion based on the same operating principle as filmcamera occurs. The

principle is that only one digit is active but by quick changing one gets impression that all digits of

a number are active at the same time.

Page 9: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 8 de 45

Referring to the previous example it would mean that firstly one byte representing units is applied

on a microcontroller’s port and only transistor T1 is activated at the same time. After a while, the

transistor T1 is turned off, a byte representing tens is applied on a port and transistor T2 is activated.

This process is being cyclicly repeated at high speed for all digits and corresponding transistors.

When displaying any digit, a defeating fact that microcontroller is nevertheless only a machine

made to understand only language of units and zeros is fully expressed. Namely, it “does not know”

what units, tens or hundreds are, nor it knows how ten digits we are used to look like. Therefore,

each number intended to be shown on display must be prepared in the following way:

In special subroutine, a several digit number must be first separated in units, tens etc. Afterwards,

each of these digits must be stored in specific byte. In order to make these digits familiar to us,

“masking” is carried out. Basically, it is a simple subroutine by which binary format of each number

is replaced by different combination of bits. For example, the digit 8 (0000 1000) is replaced by

binary digit 0111 111 in order to activate all LEDs which represent digit 8 on display. The only

diode, inactive in this case is reserved for decimal point. If a microcontroller’s port is connected to

display in a way that bit 0 activates segment “a”, bit 1 activates segment “b”, bit 2 segment “c” etc.,

the table below shows “mask” for each digit.

Page 10: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 9 de 45

Digits to display Display Segments

dp a b c d e f g

0 1 0 0 0 0 0 0 1

1 1 0 0 1 1 1 1 1

2 1 0 0 1 0 0 1 0

3 1 0 0 0 0 1 1 0

4 1 1 0 0 1 1 0 0

5 1 0 1 0 0 1 0 0

6 1 0 1 0 0 0 0 0

7 1 0 0 0 1 1 1 1

8 1 0 0 0 0 0 0 0

9 1 0 0 0 0 1 0 0

Beside digits 0 to 9, some latters of alphabet : A, C, E, J, F, U, H, L, b, c, d, o, r, t can be displayed

by appropriate masking.

If common chatode displays are used all units in the table should be replaced by zeros and vice

versa. In that case NPN transistors should be also used as drivers.

Liquid Crystal Displays (LCD)

These components are “specialized” for being used with the microcontrollers, which means that

they cannot be activated by standard IC circuits. They are used for writing different messages on a

miniature LCD.

Amodel described here is for its low price and great possibilities most frequently used in practice. It

is based on the HD44780 microcontroller (Hitachi) and can display messages in two lines with 16

characters each . It displays all letters of alphabet, greek letters, punctuation marks, mathematical

symbols etc. In addition, it is possible to display symbols that user makes up on its own. Automatic

shifting message on display (shift left and right), appearance of the pointer, backlight etc. are

considered as useful characteristics.

Pins Functions

There are pins along one side of the small printed board used for connection to the microcontroller.

There are total of 14 pins marked with numbers (16 in case the background light is built in). Their

function is described in the table bellow:

Page 11: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 10 de 45

Function Pin Number Name Logic State Description

Ground 1 Vss - 0V

Power supply 2 Vdd - +5V

Contrast 3 Vee - 0 - Vdd

Control of

operating

4 RS 0

1

D0 – D7 are interpreted as commands

D0 – D7 are interpreted as data

5 R/W 0

1

Write data (from controller to LCD)

Read data (from LCD to controller)

6 E

0

1

From 1 to 0

Access to LCD disabled

Normal operating

Data/commands are transferred to

LCD

Data / commands

7 D0 0/1 Bit 0 LSB

8 D1 0/1 Bit 1

9 D2 0/1 Bit 2

10 D3 0/1 Bit 3

11 D4 0/1 Bit 4

12 D5 0/1 Bit 5

13 D6 0/1 Bit 6

14 D7 0/1 Bit 7 MSB

LCD screen

LCD screen consists of two lines with 16 characters each. Each character consists of 5x8 or 5x11

dot matrix. This book covers 5x8 character display because it is commonly used.

Contrast on display depends on the power supply voltage and whether messages are displayed in

one or two lines. For that reason, variable voltage 0-Vdd is applied on pin marked as Vee. Trimmer

potentiometer is usually used for that purpose. Some versions of displays have built in backlight

(blue or green diodes). When used during operating, a resistor for current limitation should be used

(like with any LE diode).

Page 12: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 11 de 45

If there are no characters on display or all of them are dimmed upon the display is on, the first thing

that should be done is to check the potentiometer for contrast regulation. Is it properly adjusted?

Same applies in case the operation mode is changed (writing in one or two lines).

LCD Memory

There are three memory blocks inside the display:

DDRAM Display Data RAM

CGRAM Character Generator RAM

CGROM Character Generator ROM

DDRAM Memory

DDRAM memory is used for storing characters that should be displayed. The size of this memory is

sufficient for storing 80 characters. One part of these locations is directly connected to the

characters on display.

All functions quite simply: it is sufficient to configure display so that addresses are automatically

incremented (shift right). Afterwards it sets starting value for the message that should be displayed

(for example 00 hex).

Page 13: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 12 de 45

After that, all characters sent through lines D0-D7 will be displayed as a message we are used to-

from left to right. In this case, displaying starts from the first character in the first line on display

since the address is 00 hex. If more than 16 characters are sent, they all will be also memorized but

not visible. In order to display them, a shift command should be used. Virtually, everything looks as

if LCD display is a “window” which moves left-right over memory locations with characters. In

reality, that is how the affect of message “moving”on the screen is obtained (from left to right or

vice versa).

If cursor is on, it will appear at location which is currently addressed. In other words, characters will

appear at cursor’s position while the cursor is automatically moved to the next addressed location.

Since this is a sort of RAM memory, data can be written to and read from it. Disadvantage is that

the contents will be lost forever upon the power is off.

CGROM Memory

A “map” with all characters that can be displayed are written by default. Each character has

corresponding location.

Page 14: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 13 de 45

Addresses of CGROM memory locations match standard ASCII values of characters. It means that

if in a program being currently executed by the microcontroller is written “send letter P to port”, the

binary value 0101 0000 will appear on the port. This value is ASCII equivalent to the letter P. When

this binary number is sent to LCD, a symbol stored on 0101 0000 location in CGROM will be

displayed. In other words, the letter “P” will be displayed . This applies to all alphabet letters

(upper- and lowercase), but not to numbers!

If one carefully looks at the “map” with characters in this memory, it can be seen that addresses of

all digits are “shifted” by 48 in comparison to the values of these digits (address of the digit 0 is 48,

of digit 1 is 49, of digit 2 is 50 etc.). For that reason and in order to display digits correctly, each of

them needs to be added a decimal number 48 prior to being sent to LCD.

Since the time the first computer was made, it recognizes numbers but not letters. It means that on

sending any character from keyboard to PC, from PC to printer or from microcontroller to other

computer, through connection line are actually sent binary numbers instead of characters . A table

that links all standard symbols and their number equivalents is called ASCII code.

CGRAM memory

Beside being able to display all standard characters, the LCD can display symbols that user defines

on its own. It enables displaying cyrilic fonts as well as many other symbols which fit to the frame

of 5x8 dots size. RAM memory (CGRAM) in size of 64 bytes enables the above.

The size of registers of this memory is a standard one (8 bits), but only 5 lower bits are in use.

Logic one (1) in every register represents a dimmed dot, while 8 locations considered jointly

represent one character. It is best illustrated on the figure below:

Page 15: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 14 de 45

Symbols are usually defined at the beginnig of a program by simple writing zeros and units to

registers of CGRAM memory so that they form desirable shapes. In order to display them it is

sufficient to specify their address. Pay attention to the first coloumn in CGROM map of characters-

these are not addresses of RAM memory but symbols which are discussed here.In this example,

“display 0” means - display “č”, “display 1” means - display “ž” etc.

LCD Basic Commands

All data transferred to LCD through outputs D0-D7 will be interpreted as commands or as data,

which depends on logic state on pin RS:

RS = 1 - Bits D0 - D7 are addresses of characters that should be displayed. Built in processor

addresses built in “map of characters” and displays corresponding symbols. Displaying position is

determined by DDRAM address. This address is either previously defined or the address of

previously transferred character is automatically incremented.

RS = 0 - Bits D0 - D7 are commands which determine display mode. List of commands which LCD

“recognizes”are given in the table below:

Command RS RW D7 D6 D5 D4 D3 D2 D1 D0 Execution

Time

Clear display 0 0 0 0 0 0 0 0 0 1 1.64mS

Cursor home 0 0 0 0 0 0 0 0 1 x 1.64mS

Entry mode set 0 0 0 0 0 0 0 1 I/D S 40uS

Display on/off control 0 0 0 0 0 0 1 D U B 40uS

Cursor/Display Shift 0 0 0 0 0 1 D/C R/L x x 40uS

Function set 0 0 0 0 1 DL N F x x 40uS

Set CGRAM address 0 0 0 1 CGRAM address 40uS

Set DDRAM address 0 0 1 DDRAM address 40uS

Read “BUSY” flag (BF) 0 1 BF DDRAM address -

Write to CGRAM or

DDRAM 1 0 D7 D6 D5 D4 D3 D2 D1 D0 40uS

Read from CGRAM or

DDRAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0 40uS

I/D 1 = Increment (by 1) R/L 1 = Shift right

0 = Decrement (by 1) 0 = Shift left

Page 16: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 15 de 45

S 1 = Display shift on DL 1 = 8-bit interface

0 = Display shift off 0 = 4-bit interface

D 1 = Display on N 1 = Display in two lines

0 = Display off 0 = Display in one line

U 1 = Cursor on F 1 = Character format 5x10 dots

0 = Cursor off 0 = Character format 5x7 dots

B 1 = Cursor blink on D/C 1 = Display shift

0 = Cursor blink off 0 = Cursor shift

What is Busy flag ?

Comparing to the microcontroller, LCD is an extremly slow component. Because of that It was

necessary to provide a signal which will indicate that display is ready to receive a new data or a

command following the previous one has been executed. That signal is called busy flag and can be

read from line D7. When the bit BF is cleared (BF=0), display is ready to receive.

LCD Connection

Depending on how many lines are used for connection to the microcontroller, there are 8-bit and 4-

bit LCD modes. The appropriate mode is determined at the beginning of the process in a phase

called “initialization”. In the first case, the data are transferred through outputs D0-D7 as it has been

already explained. In case of 4-bit LED mode, for the sake of saving valuable I/O pins of the

microcontroller, there are only 4 higher bits (D4-D7) used for communication, while other may be

left unconnected. Consequently, each data is sent to LCD in two steps: four higher bits are sent first

(that normally would be sent through lines D4-D7), four lower bits are sent afterwards. With the

help of initialization, LCD will correctly connect and interprete each data received. Besides, with

regards to the fact that data are rarely read from LCD (data mainly are transferred from

microcontroller to LCD) one more I/O pin may be saved by simpleconnecting R/W pin to the

Ground. Such saving has its price. Even though message displaying will be normally performed, it

will not be possible to read from busy flag since it is not possible to read from display.

Page 17: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 16 de 45

Luckily, solution is simple. It is sufficient to give LCD enough time to perform its task upon

sending every character or command. Since execution of the slowest command is approximately

1.64mS, it will be quite enough to wait for approximately 2mS.

LCD Initialization

Once the power supply is turned on, LCD is automatically cleared. This process lasts for

approximately 15mS. After that, display is ready to operate. The mode of operating is set by default.

This means that:

1. Display is cleared

2. Mode

o DL = 1 Communication through 8-bit interface

o N = 0 Messages are displayed in one line

o F = 0 Character font 5 x 8 dots

3. Display/Cursor on/off

o D = 0 Display off

o U = 0 Cursor off

o B = 0 Cursor blink off

4. Character entry

o ID = 1 Addresses on display are automatically incremented by 1

o S = 0 Display shift off

Automatic reset is mainly performed without any problems. Mainly but not always! If for any

reason power supply voltage does not reach ful value in the course of 10mS, display will start

perform completely unpredictably. If voltage supply unit can not meet this condition or if it is

needed to provide completely safe operating, the process of initialization by which a new reset

enabling display to operate normally must be applied.

Algorithm according to the initialization is being performed depends on whether connection to the

microcontroller is through 4- or 8-bit interface. All left over to be done after that is to give basic

commands and of course- to display messages...

Refer to the Figure below for the procedure on 8-bit initialization:

Page 18: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 17 de 45

It is not a mistake!

In algorithm on figure, the same value is being transmitted three times in a row.

In case of 4-bit initialization, the procedure is as follows:

Page 19: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 18 de 45

Page 20: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 19 de 45

6.3 Examples

The schematic below is used in the several following examples:

Nothing special... Beside elements necessary for operating (oscillator with condensators and the

simplest reset circuit), there are also several LEDs and one pushbutton which actually do not have

any practical application and are used only to indicate program operating.

All LEDs are polarized so that they are activated by logic zero (0) on the microcontroller’s pin.

LED Blinking

This program does not demonstrate LEDs’ operating but the speed of operation of the

microcontroller! Simply, in order to enable LED blinking be visible, sufficient amount of time must

pass between on/off states. In this example time delay is solved using a subroutine called Delay. It

is a triple loop where the program remains for approximately 0.5 seconds and decrements values in

registers R0, R1 or R2. Upon return from subroutine, the state on the pin is inverted and procedure

is repeated...

Page 21: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 20 de 45

;************************************************************************

;* PROGRAM NAME : Delay.ASM

;* DESCRIPTION: Program turns on/off LED on the pin P1.0

;* Software delay is used (Delay).

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(DELAY.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ;Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ;Defining of Stack pointer

MOV P1,#0FFh ;All pins are configured as inputs

LOOP:

CPL P1.0 ; State on the pin P1.0 is inverted

LCALL Delay ; Time delay

SJMP LOOP

Delay:

MOV R2,#20 ;500 ms time delay

F02: MOV R1,#50 ;25 ms

F01: MOV R0,#230

DJNZ R0,$

DJNZ R1,F01

DJNZ R2,F02

END ;End of program

Using Watch-dog Timer

This program describes how the watch-dog timer should not operate! As a matter of fact watch-dog

timer is properly adjusted (nominal time for counting is 1024mS), but instruction for its reset is

intentionally left out so that this timer always wins the “battle for time”. As a result, the

microcontroller is reset (state in registers remains unchanged), program starts execution from the

beginning, number in register R3 is incremented by 1 and copied to port P1 afterwards.

LEDs display this number in binary format...

;************************************************************************

;* PROGRAM NAME : WatchDog.ASM

;* DESCRIPTION : After watch-dog reset, program increments number in

;* register R3 and shows it on port P1 in binary format.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(WATCHDOG.ASM)

$PAGEWIDTH(132)

$DEBUG

Page 22: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 21 de 45

$OBJECT

$NOPAGING

WMCON DATA 96H

WDTEN EQU 00000001B ; Watch-dog timer is enabled

PERIOD EQU 11000000B ; Nominal Watch-dog period in duration of

1024ms

; is defined

;RESET VECTOR

CSEG AT 0

JMP XRESET ; Reset vector

CSEG

ORG 100H

XRESET: ORL WMCON,#PERIOD ; Defining of Watch-dog period

ORL WMCON,#WDTEN ; Watch-dog timer is enabled

MOV A,R3 ; R3 is moved to port 1

MOV P1,A

INC R3 ; Register R3 is incremented by 1

LAB: SJMP LAB ; Wait for watch-dog reset

END ; End of program

Timer T0 in mode 1

This program spends the most of its time in endless loop waiting for timer T0 to count up a full

cycle. Once it happens, interrupt is generated, the routine TIM0_ISR is executed and logic zero (0)

on port P1 is shifted right by one place. This is another way to demonstrate the speed of operation

of the microcontroller since each shift means that counter T0 has counted off 216

pulses!

;************************************************************************

;* PROGRAM NAME : Tim0Mod1.ASM

;* DESCRIPTION: Program rotates "0" on port 1. Timer T0 in mode 1 is

;* used

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(TIM0MOD1.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;DEFINING OF VARIABLES

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 00BH

JMP TIM0_ISR ; Timer T0 reset vector

Page 23: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 22 de 45

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV TMOD,#01H ; MOD1 is selected

MOV A,#0FFH

MOV P1,#0FFH

SETB TR0 ; Timer T0 start

MOV IE,#082H ; Interrupt enabled

CLR C

LOOP1: SJMP LOOP1 ; Remain here

TIM0_ISR: RRC A ; Rotate accumulator A through Carry bit

MOV P1,A ; Contents of accumulator A is moved to

PORT1

RETI ; Return from interrupt

END ; End of program

Timer T0 in Split mode

Similar to the previous example, the program spends the most of its time in a loop called LOOP1.

Since 16-bit Timer T0 is split into two 8-bit timers, there are also two interrupt sources, therefore.

First interrupt is generated after timer T0 reset. It executes the routine TIM0_ISR in which logic

zero (0) bit on port P1 is rotated. Looking from outside, it seems that LED’s light shifts.

Another interrupt is generated upon Timer T1 reset. It executes the routine TIM1_ISR in which the

bit state DIRECTION is inverted. Since this bit determines direction of bit rotation then the

direction of LED shifting is also changed.

If at any moment a pushbutton T1 is pressed, logic zero (0) on output P3.2 will stop the Timer T1.

;************************************************************************

;* PROGRAM NAME : Split.ASM

;* DESCRIPTION: Timer TL0 rotates bit on port P1, while TL1 determines

;* the direction of rotation. Both timers operate in mode

;* 3. Logic 0 on output P3.2 stops rotation on port P1.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(SPLIT.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;DEFINING OF VARIABLES

BSEG AT 0

;DEFINING OF BIT-VARIABLES

SEMAPHORE: DBIT 8

DIRECTION BIT SEMAPHORE

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

Page 24: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 23 de 45

CSEG AT 0

JMP XRESET ; Reset vector

ORG 00BH

JMP TIM0_ISR ; Timer T0 reset vector

ORG 01BH

JMP TIM1_ISR ; Timer T1 reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV TMOD,#00001011B ; Defining of MOD3

MOV A,#0FFH

MOV P1,#0FFH

MOV R0,#30D

SETB TR0 ; TL0 is turned on

SETB TR1 ; TL1 is turned on

MOV IE,#08AH ; Interrupt enabled

CLR C

CLR DIRECTION ; First rotation is to right

LOOP1: SJMP LOOP1 ; Remain here

TIM0_ISR:

DJNZ R0,LAB3 ; Slow down rotation by 256 times

JB DIRECTION,LAB1

RRC A ; Rotate contents of Accumulator to

the right through

; Carry bit

SJMP LAB2

LAB1: RLC A ; Rotate contents of Accumulator to

the left through

; Carry bit

LAB2: MOV P1,A ; Contents of Accumulator is moved to

port P1

LAB3: RETI ; Return from interrupt

TIM1_ISR:

DJNZ R1,LAB4 ; Slow down direction of rotation by

256 times

DJNZ R2,LAB4 ; If time is ran out, change direction

of

; rotation

CPL SMER

MOV R2,#30D

LAB4: RETI

END ; End of program

Simultaneous use of timers T0 and T1

One can take this program as extension of the previous one. The idea is the same but in this case

true timers T0 and T1 are used. In order to demonstrate operation of both timers simultaneously, the

Timer T0 reset is used to shift logic zero (0) on port while Timer1 reset is used to change direction

of rotation. This program spends the most of its time in the loop LOOP1 waiting for interrupt

caused by reset. By checking the bit DIRECTION, an information on direction of rotation of both

bits in Accumulator and shifting LED on port is obtained.

Page 25: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 24 de 45

;************************************************************************

;* PROGRAM NAME : Tim0Tim1.ASM

;* DESCRIPTION: Timer TO rotates bit on port P1 while Timer1

;* changes direction of rotation. Both timers oper

;* ates in mode 1.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(TIM0TIM1.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;DEFINING OF VARIABLES

BSEG AT 0

;DEFINING OF BIT-VARIABLES

SEMAPHORE: DBIT 8

DIRECTION BIT SEMAPHORE

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 00BH ; Timer 0 Reset vector

JMP TIM0_ISR

ORG 01BH ; Timer 1 Reset vector

JMP TIM1_ISR

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV TMOD,#11H ; Selecting MOD1 for both timers

MOV A,#0FFH

MOV P1,#0FFH

MOV R0,#30D ; R0 is initialized

SETB TR0 ; TIMER0 is turned on

SETB TR1 ; TIMER1 is turned on

MOV IE,#08AH ; Timer0 and Timer1 Interrupt enabled

CLR C

CLR DIRECTION ; First rotation is to right

LOOP1: SJMP LOOP1 ; Remain here

TIM0_ISR:

JB DIRECTION,LAB1

RRC A ; Rotate contents of Accumulator to

the right through

; Carry bit

SJMP LAB2

LAB1: RLC A ; Rotate contents of Accumulator to

the left through

Page 26: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 25 de 45

; Carry bit

LAB2: MOV P1,A ; Contents of Accumulator is moved to

port P1

RETI ; Return from interrupt

TIM1_ISR:

DJNZ R0,LAB3 ; If time is ran out, change direction

of rotation

CPL DIRECTION

MOV R0,#30D ; Initialize R0

LAB3:

RETI

END ; End of program

Using Timer T2

This example describes the use of Timer T2 configured to operate in Auto-Reload mode. In this

very case, LEDs are connected to port P3 while the pushbutton used for forced timer reset (T2EX)

is connected to pin P1.1.

Program execution is similar to the previous examples. When timer ends counting, interrupt is

enabled and subroutine TIM2_ISR is executed. Within it, logic zero (0) in accumulator is rotated

and afterwards content of accumulator is moved to pin P3. At the end, flags which caused interrupt

are erased and program returns to the loop LOOP1 where it remains until a new interrupt request is

encountered...

If pushbutton T2EX is pressed, timer is temporarily reset. Hence, this pushbutton resets timer while

pushbutton RESET resets microcontroller.

Page 27: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 26 de 45

;************************************************************************

;* PROGRAM NAME : Timer2.ASM

;* DESCRIPTION: Program rotates log. "0" on port P3. Timer2 determines

;* the speed of rotation and operates in auto-reload mode

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(TIMER2.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;DEFINITION OF VARIABLES

T2MOD DATA 0C9H

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 02BH ; Timer T2 Reset vector

JMP TIM2_ISR

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV A,#0FFH

MOV P3,#0FFH

MOV RCAP2L,#0FH ; 16-bit auto-reload mod is prepared

MOV RCAP2L,#01H

CLR CAP2 ; 16-bit auto-reload mod is turned on

SETB EXEN2 ; reset through pin P1.1 is enabled

SETB TR2 ; Timer2 is turned on

MOV IE,#0A0H ; Interrupt is enabled

CLR C

LOOP1: SJMP LOOP1 ; Remain here

TIM2_ISR: RRC A ; Rotate contents of Accumulator to

the right through

; Carry bit

MOV P3,A ; Move the content of Accumulator A to

PORT3

CLR TF2 ; Erase flag TF2 of timer T2

CLR EXF2 ; Erase flag EXF2 of timer T2

RETI ; Return from interrupt

END ; End of program

Using External Interrupt

Here is another example of interrupt execution. This time, it is about external iterrupts generated

when low logic level is present on pin P3.2 or P3.3. Depending on which input is active, one of two

routines will be executed:

Page 28: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 27 de 45

Logic zero (0) on pin P3.2 starts interrupt routine Isr_Int0. The routine increments number in

register R0 and copies it to port P0. Low level on pin P3.3 starts subroutine Isr_Int1which

increments number in register R1 by 1 and copies it to port P1 afterwards.

In short, each press on pushbuttons INT0 and INT1 will be counted and immediately shown in

binary format on the appropriate port (LED which emitts light represents logic zero (0)).

;************************************************************************

;* PROGRAM NAME : Int.ASM

;* DESCRIPTION : Program counts interrupts INT0 which are generated by

;* appearance of high-to-low transition signal on pin

;* P3.2 Result appears on port P0. Interrupts INT1 are

;* counted off at the same time. They are generated by

;* appearing high-to-low transition signal on pin P3.

;* This result appears on port P1.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(INT.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

Page 29: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 28 de 45

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 003H ; Interrupt routine address for INT0

JMP Isr_Int0

ORG 013H ; Interrupt routine address for INT1

JMP Isr_Int1

ORG 100H

XRESET:

MOV TCON,#00000101B ; Interrupt INT0 is generated by appearing

; high-to-low transition signal on pin

P3.2

; Interrupt INT0 is generated by appearing

; high-to-low transition signal on pin

P3.3

MOV IE,#10000101B ; Interrupt enabled

MOV R0,#00H ; Counter starting value

MOV R1,#00H

MOV P0,#00H ; Reset port P0

MOV P1,#00H ; Reset port P1

LOOP: SJMP LOOP ; Remain here

Isr_Int0:

INC R0 ; Increment value of interrupt INT0

counter

MOV P0,R0

RETI

Isr_Int1:

INC R1 ; Increment value of interrupt INT1

counter

MOV P1,R1

RETI

END ; End of program

Using LED display

Following examples describe the use of LED display. Common chatode displays are used here,

which means that all built in LEDs are polarized so that their anodes are connected to the

microcontroller pins. It is not the way it should be but common way of thinking is that logic one (1)

“turns on” something while logic zero (0) “turns off” something. That is why Low Current displays

(low consumption) and their diodes (segments) are connected in series to resistors of relatively high

resistance.

In order to save I/O pins, four LED displays are connected to operate in multiplex mode. That

means that all segments having the same name are connected to one output port each and that there

is always one display active.

By quick and synchronized activation of tranzistors and segmenats on displays, one gets impression

that all digits emit lights simultaneously.

Page 30: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 29 de 45

Write digits on LED display

This program is designed as “warming up” before real work starts. The single aim is to display

something on any of displays. This time it is not multiplex mode, instead, digit 3 is displayed on

only one of them (first one on the right).

Since the microcontroller “does not know” how man writes number 3, a small subroutine called

Disp is used (microcontroller writes it as 0000 0011). This subroutine performs as a mask for all

digits in decade system (0-9). The principle of the operation is simple. A number that should be

displayed is added to the current address and program jump is executed. Different numbers match

different jump length. Precisely determined combination of zeroes and units appears on each of

these new locations (digit 1 mask, digit 2 mask...digit 9 mask). When this combination is

transferred to the port, display diodes are activated as to show desired digit.

Page 31: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 30 de 45

;************************************************************************

;* PROGRAM NAME : 7Seg1.ASM

;* DESCRIPTION: Program shows number "3" on 7-segment LED display

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(7SEG1.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#20h ; Activate display D4

LOOP:

MOV A,#03 ; Send number “3” on display

LCALL Disp ; Find appropriate mask for that number

MOV P1,A

SJMP LOOP

Disp: ; Subroutine for writing digits

INC A

MOVC A,@A+PC

RET

DB 3FH ; Digit 0 mask

DB 06H ; Digit 1 mask

DB 5BH ; Digit 2 mask

DB 4FH ; Digit 3 mask

DB 66H ; Digit 4 mask

DB 6DH ; Digit 5 mask

DB 7DH ; Digit 6 mask

DB 07H ; Digit 7 mask

DB 7FH ; Digit 8 mask

DB 6FH ; Digit 9 mask

END ; End of program

Write and change digits on LED display

Program in this example is only an extended verson of the previous one. There is only one digit

active- the first one on the right side, and there is no use of multiplexing. Unlike the previous case,

all decade digits are displayed (0-9). In order to enable digits to shift at rational rate, a soubroutine

L2 which causes a small time delay is executed before each shift. Basically, the whole process is

very simple and takes place in the main loop LOOP as follows:

1. R3 is copied to Accumulator and subroutine for masking digits Disp is executed.

2. Accumulator is copied to the port and displayed.

3. The contents of the R3 register is incremented.

Page 32: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 31 de 45

4. It is checked whether 10 cycles are counted or not.

If it is counted, register R3 is reset in order to enable counting to start from 0.

5. Instruction labeled as L2 within subroutine is executed.

;************************************************************************

;* PROGRAM NAME: 7Seg2.ASM

;* DESCRIPTION: Program writes numbers 0-9 on 7-segment LED display

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(7SEG2.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV R3,#0 ; Counter starting value

MOV P1,#0 ; Turn off all segments on display

MOV P3,#20h ; Activate display D4

LOOP:

MOV A,R3

LCALL Disp ; Find appropriate mask for number in

; Accumulator

MOV P1,A

INC R3 ; Increment number in register by 1

CJNE R3,#10,L2 ; Check whether the number 10 is in

R3

MOV R3,#0 ; If it is, reset counter

L2:

MOV R2,#20 ; 500 mS wait time

F02: MOV R1,#50 ; 25 mS

F01: MOV R0,#230

DJNZ R0,$

DJNZ R1,F01

DJNZ R2,F02

SJMP LOOP

Disp: ; Subroutine for writing digits

INC A

MOVC A,@A+PC

RET

DB 3FH ; Digit 0 mask

DB 06H ; Digit 1 mask

DB 5BH ; Digit 2 mask

DB 4FH ; Digit 3 mask

DB 66H ; Digit 4 mask

DB 6DH ; Digit 5 mask

DB 7DH ; Digit 6 mask

DB 07H ; Digit 7 mask

Page 33: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 32 de 45

DB 7FH ; Digit 8 mask

DB 6FH ; Digit 9 mask

END ; End of program

Write two-digit number on LED display

It is time for time multiplex! This is the simplest example where the number 23 is displayed on two

displays which represent units and tens,. It means that digit 3 should be dispalyed on the far right

display and digit 2 on the display beside. The most important thing in the program is regular time

synchronization. Since this is the simplest case where only two digits are used and since the

microcontroller does nothing else but diaplays a number everything is very simple. Transistor T4

“turns on” display D4 and at the same time a bits’ combination corresponding to the digit 3 is set on

the port. After that, transistor T4 is “turned off” and the whole process is repeated using transistor 3

and display 3 in order to display digit 2. This procedure must be continuosly repeated in order to

make impression that both displays are activ at the same time.

;************************************************************************

;* PROGRAM NAME: 7Seg3.ASM

;* DESCRIPTION: Program displays number "23" on 7-segment LED display

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(7SEG3.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

LOOP: MOV P1,#0 ; Turn off all segments on display

MOV P3,#20h ; Activate display D4

MOV A,#03 ; Write digit 3 on display D4

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#10h ; Activate display D3

MOV A,#02 ; Write digit 2 on display D3

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

SJMP LOOP ; Get back to the label LOOP

Disp: ; Subroutine for writing digits

INC A

MOVC A,@A+PC

RET

DB 3FH ; Digit 0 mask

DB 06H ; Digit 1 mask

DB 5BH ; Digit 2 mask

DB 4FH ; Digit 3 mask

Page 34: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 33 de 45

DB 66H ; Digit 4 mask

DB 6DH ; Digit 5 mask

DB 7DH ; Digit 6 mask

DB 07H ; Digit 7 mask

DB 7FH ; Digit 8 mask

DB 6FH ; Digit 9 mask

END ; End of program

Using 4-digit LED display

In this example all four displays, instead of two, are active so it is possible to write numbers 0 -

9999. In this very case, the number 1 234 is displayed. After introductory initialization, program

remains in the loop LOOP where digital multiplexing is performed.The subroutine Disp has the

purpose to convert binary numbers into corresponding bit combinations for lighting segments

activation on display.

;************************************************************************

;* PROGRAM NAME : 7Seg5.ASM

;* DESCRIPTION : Program displays number"1234" on 7-segment LED display

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(7SEG5.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

LOOP: MOV P1,#0 ; Turn off all segments on display

MOV P3,#20h ; Activate display D4

MOV A,#04 ; Write digit 4 on display D4

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#10h ; Activate display D3

MOV A,#03 ; Write digit 3 on display D3

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#08h ; Activate display D2

MOV A,#02 ; Write digit 2 on display D2

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#04h ; Activate display D1

MOV A,#01 ; Write digit 1 on display D1

LCALL Disp ; Find mask for that digit

MOV P1,A ; Put the mask on the port

Page 35: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 34 de 45

SJMP LOOP ; Return to the lable LOOP

Disp: ; Subroutine for writing digits

INC A

MOVC A,@A+PC

RET

DB 3FH ; Digit 0 mask

DB 06H ; Digit 1 mask

DB 5BH ; Digit 2 mask

DB 4FH ; Digit 3 mask

DB 66H ; Digit 4 mask

DB 6DH ; Digit 5 mask

DB 7DH ; Digit 6 mask

DB 07H ; Digit 7 mask

DB 7FH ; Digit 8 mask

DB 6FH ; Digit 9 mask

END ; End of program

LED display as two-digit counter

Things are getting complicated... Beside two digit multiplexing, the microcontroller performs other

operations “in the background” too. In this case, contents of registers R2 and R3 are incremented in

order to make counting 97, 98, 99, 00, 01, 02... visible on display.

This time, transistors which activate displays remains on for 25mS. The soubroutine Delay is in

charge for that. Even though digits are shifted much slower it is still not slow enough to make

impression of simultaneous operating. After 20 alternate turning on and off both digits, number on

displays is incremented by 1 and the whole procedure is repeated.

;************************************************************************

;* PROGRAM NAME : 7Seg4.ASM

;* DESCRIPTION: Program displays numbers 0-99 on 7-segment LED displays

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(7SEG4.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV SP,#STACK_START ; Defining of Stack pointer

MOV R2,#0 ; Counter starting value

MOV R3,#0

MOV R4,#0

LOOP: INC R4 ;Hold before to increment the

content of

Page 36: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 35 de 45

CJNE R4,#20d,LAB1 ;counter until display is 100 times

refreshed

MOV R4,#0

MOV P1,#0 ; Turn off all segments on displays

INC R2 ; Increment Register with units by 1

CJNE R2,#10d,LAB1

MOV R2,#0 ; Reset units

INC R3 ; Increment Register with tens by 1

CJNE R3,#10d,LAB1 ;

MOV R3,#0 ; Reset tens

LAB1:

MOV P3,#20h ; Activate display D4

MOV A,R2 ; Copy Register with units to A

LCALL Disp ; Find mask for that digit

MOV P1,A ; Write units on display D4

LCALL Delay ; 25ms wait time

MOV P1,#0 ; Turn off all segments on displays

MOV P3,#10h ; Activate display D3

MOV A,R3 ; Copy Register with tens to A

LCALL Disp ; Find mask for that digit

MOV P1,A ; Write tens on display D3

LCALL Delay ; 25ms wait time

SJMP LOOP

Delay:

MOV R1,#50 ; 25 mS

F01: MOV R0,#250

DJNZ R0,$

DJNZ R1,F01

RET

Disp: ; Subroutine for writing digits

INC A

MOVC A,@A+PC

RET

DB 3FH ; Digit 0 mask

DB 06H ; Digit 1 mask

DB 5BH ; Digit 2 mask

DB 4FH ; Digit 3 mask

DB 66H ; Digit 4 mask

DB 6DH ; Digit 5 mask

DB 7DH ; Digit 6 mask

DB 07H ; Digit 7 mask

DB 7FH ; Digit 8 mask

DB 6FH ; Digit 9 mask

END ; End of program

Handling EEPROM

Program writes data to on-chip EEPROM memory. In this case, data is hexadecimal number 23

which written to location with address 00.

To ensure that number is correctly written, the same location in EEPROM is read 10mS later and

compared with original value. In case the numbers are identical, F will be displayed on LED

display. Otherwise, E will be displayed on LED display (Error).

Page 37: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 36 de 45

;************************************************************************

;* PROGRAM NAME: EEProm1.ASM

;* DESCRIPTION: Programming EEPROM at address 0000hex and displaying message

;* on LED display.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(EEPROM1.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

WMCON DATA 96H

EEMEN EQU 00001000B ; Access to internal EEPROM is enabled

EEMWE EQU 00010000B ; Write to EEPROM is enabled

TEMP DATA 030H ; Defining of Auxilary register

THE END EQU 071H ; Write "F" on display

ERROR EQU 033H ; Write "E" on display

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV IE,#00 ; All interrupts are disabled

MOV SP,#STACK_START

MOV DPTR,#0000H ; Choose location address in EEPROM

ORL WMCON,#EEMEN ; Access to EEPROM is enabled

ORL WMCON,#EEMWE ; Write to EEPROM is enabled

MOV TEMP,#23H ; Number written to EEPROM is copied

to

MOV A,TEMP ; register TEMP and Accumulator

MOVX @DPTR,A ; Write byte to EEPROM

CALL DELAY ; 10ms wait time

MOVX A,@DPTR ; Read the same location and compare

to TEMP,

CJNE A,TEMP,ERROR ; If they are not identical,jump to

label ERROR

MOV A,#KRAJ ; Write letter F on display (correct)

MOV P1,A

XRL WMCON,#EEMWE ; Write to EEPROM is disabled

XRL WMCON,#EEMEN ; Access to EEPROM is disabled

LOOP1: SJMP LOOP1 ; Remain here

ERROR: MOV A,#ERROR ; Write letter E on display (error)

MOV P1,A

LOOP2: SJMP LOOP2

DELAY: MOV A,#0AH ; Wait time

MOV R3,A

LOOP3: NOP

LOOP4: DJNZ B,LOOP4

LOOP5: DJNZ B,LOOP5

DJNZ R3,LOOP3

Page 38: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 37 de 45

RET

END ; End of program

Receiving data via serial communication UART

In order to enable successful serial communication using UART system, beside having correctly

written program it is also necessary to meet certain rules of RS232 connection. It is about voltage

levels issued by this standard. In accordance to it logic one (1) is represented by -10V in message,

while logic zero (0) is transferred like +10V. The microcontroller converts data serial format

without error but its power supply voltage is only 5V. It is not easy to convert 0V into 10V and 5V

into -10V. Because of that, this operation is on both transmit and receive side left over to

specialized IC circuit. In this example, MAX232 circuit manufactured by MAXIM is used because

it is widespread, cheap and reliable.

This example demonstrates message receiving which is sent from PC. Timer T1 generates boud

rate. Since quartz crystal with frequency of 11.0592 MHz is in use it is not problem to obtain

standard baud rate which amout to 9600 baud. Each received data is transferred to port P1 pins.

;************************************************************************

;* PROGRAM NAME : UartR.ASM

;* DESCRIPTION: Each data received from PC via UART appears on the port

;* P1.

;*

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(UARTR.ASM)

$PAGEWIDTH(132)

Page 39: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 38 de 45

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 023H ; Starting address for UART interrupt

routine

JMP IR_SER

ORG 100H

XRESET: MOV IE,#00 ; All interrupts are disabled

MOV SP,#STACK_START ; Initialization of Stack pointer

MOV TMOD,#20H ; Timer1 in mode2

MOV TH1,#0FDH ; Baud rate is 9600 baud at frequency of

; 11.0592MHz

MOV SCON,#50H ; Receiving enabled, 8-bit UART

MOV IE,#10010000B ; UART interrupt enabled

CLR TI ; Clear transmit flag

CLR RI ; Clear receive flag

SETB TR1 ; Start Timer1

LOOP: SJMP LOOP ; Remain here

IR_SER: JNB RI,OUT ; If any data is received,

; copy it to the port

MOV A,SBUF ; P1

MOV P1,A

CLR RI ; Clear receive flag

OUT RETI

END ; End of program

Data transmission via serial communication UART

Program below describes how to use UART modul for data transmission. In concrete example, a

series of numbers (0-255) are transmitted to PC at baud rate of 9600 baud. The circuit MAX 232 is

used for voltage level converting.

;************************************************************************

;* PROGRAM NAME : UartS.ASM

;* DESCRIPTION: Sends values 0-255 to PC.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(UARTS.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;STACK

DSEG AT 03FH

STACK_START: DS 040H

Page 40: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 39 de 45

;RESET VECTORS

CSEG AT 0

JMP XRESET ; Reset vector

ORG 100H

XRESET: MOV IE,#00 ; All interrupts are disabled

MOV SP,#STACK_START ; Initialization of Stack pointer

MOV TMOD,#20H ; Timer1 in mode 2

MOV TH1,#0FDH ; Baud rate is 9600 baud at frequency of

; 11.0592MHz

MOV SCON,#40H ; 8-bit UART

CLR TI ; Clear transmit bit

CLR RI ; Clear receive flag

MOV R3,#00H ; Reset caunter

SETB TR1 ; Start Timer 1

START: MOV SBUF,R3 ; Move number from counter to PC

LOOP1: JNB TI,LOOP1 ; Wait here until byte transmission is

; complete

CLR TI ; Clear transmit bit

INC R3 ; Increment value of counter by 1

CJNE R3,#00H,START ; If 255 bytes are not sent return to the

; label START

LOOP: SJMP LOOP ; Remain here

END ; End of program

Write message on LCD display

The most frequent LCD version which displays text in two lines with 16 characters each is used in

this example. Since I/O ports are always valuable, a method in which only 4 lines are used for

communication is applied here. In this way each byte is transmitted in two steps: first higher one,

afterwards lower nible.

You will see that, LCD needs to be initialized at the beginning (to be prepared for operating).

Besides, specific parts of the program which are repeated are separated in special totalities

(subroutines). All this may seem endlessly complicated at first sight, but the whole program

basically performs several simple operations and displays ”Mikroelektronika Razvojni sistemi”.

Page 41: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 40 de 45

*************************************************************************

;* PROGRAM NAME : Lcd.ASM

;* DESCRIPRTION : Program for testing LCD display.4-bit communication

;* is used.Program does not check BUSY flag but uses pro

;* gram delay between 2 commands. PORT1 is used for con

;* nection to the microcontroller.

;************************************************************************

;BASIC DIRECTIVES

$MOD53

$TITLE(LCD.ASM)

$PAGEWIDTH(132)

$DEBUG

$OBJECT

$NOPAGING

;Stack

DSEG AT 0E0h

Stack_Start: DS 020h

Start_address EQU 0000h

;Reset vectors

CSEG AT 0

ORG Start_address

JMP Inic

ORG Start_address+100h

MOV IE,#00 ; All interrupts are disabled

MOV SP,#Stack_Start

Inic: CALL LCD_inic ; Initialize LCD

;*************************************************

;* MAIN PROGRAM

;*************************************************

START: MOV A,#80h ; First following character will

appear on first

CALL LCD_status ; location in first line on LCD

display.

MOV A,#'M' ; Display character ‘M’.

CALL LCD_putc ; Call subroutine for character

transmission.

MOV A,#'i' ; Display character ‘i’.

CALL LCD_putc

MOV A,#'k' ; Display character ‘k’.

CALL LCD_putc

MOV A,#'r' ; Display character ‘r’.

CALL LCD_putc

MOV A,#'o' ; Display character ‘o’.

CALL LCD_putc

MOV A,#'e' ; Display character ‘e’.

CALL LCD_putc

MOV A,#'l' ; Display character ‘l’.

CALL LCD_putc

MOV A,#'e' ; Display character ‘e’.

CALL LCD_putc

MOV A,#'k' ; Display character ‘k’.

CALL LCD_putc

MOV A,#'t' ; Display character ‘t’.

CALL LCD_putc

Page 42: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 41 de 45

MOV A,#'r' ; Display character ‘r’.

CALL LCD_putc

MOV A,#'o' ; Display character ‘o’.

CALL LCD_putc

MOV A,#'n' ; Display character ‘n’.

CALL LCD_putc

MOV A,#'i' ; Display character ‘i’.

CALL LCD_putc

MOV A,#'k' ; Display character ‘k’.

CALL LCD_putc

MOV A,#'a' ; Display character ‘a’.

CALL LCD_putc

MOV A,#0c0h ; First following character will

appear on first

CALL LCD_status ; location in second line on LCD

display.

MOV A,#'R' ; Display character ‘R’.

CALL LCD_putc ; Call subroutine for character

transmission.

MOV A,#'a' ; Display character ‘a’.

CALL LCD_putc

MOV A,#'z' ; Display character ‘z’.

CALL LCD_putc

MOV A,#'v' ; Display character ‘v’.

CALL LCD_putc

MOV A,#'o' ; Display character ‘o’.

CALL LCD_putc

MOV A,#'j' ; Display character ‘j’.

CALL LCD_putc

MOV A,#'n' ; Display character ‘n’.

CALL LCD_putc

MOV A,#'i' ; Display character ‘i’.

CALL LCD_putc

MOV A,#' ' ; Display character ‘ ’.

CALL LCD_putc

MOV A,#'s' ; Display character ‘s’.

CALL LCD_putc

MOV A,#'i' ; Display character ‘i’.

CALL LCD_putc

MOV A,#'s' ; Display character ‘s’.

CALL LCD_putc

MOV A,#'t' ; Display character ‘t’.

CALL LCD_putc

MOV A,#'e' ; Display character ‘e’.

CALL LCD_putc

MOV A,#'m' ; Display character ‘m’.

CALL LCD_putc

MOV A,#'i' ; Display character ‘i’.

CALL LCD_putc

MOV R0,#20d ; Wait time (20x10ms)

CALL Delay_10ms ;

MOV DPTR,#LCD_DB ; Clear display

MOV A,#6d ;

CALL LCD_inic_status ;

MOV R0,#10d ; Wait time(10x10ms)

CALL Delay_10ms

JMP START

Page 43: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 42 de 45

;*********************************************

;* Subroutine for wait time (T= r0 x 10ms)

;*********************************************

Delay_10ms: MOV R5,00h ; 1+(1+(1+2*r7+2)*r6+2)*r5

approximate

; ly.

MOV R6,#100d ; (if r7>10)

MOV R7,#100d ; 2*r5*r6*r7

DJNZ R7,$ ; $ indicates actual instruction.

DJNZ R6,$-4

DJNZ R5,$-6

RET

;*******************************************************************************

*******

;* SUBROUTINE: LCD_inic

;* DESCRIPTION: Subroutine for LCD initialization.

;*

;* (is used with 4-bit interface, under condition that pins DB4-7 on LCD

;* are connected to pins PX.4-7 on microcontroller’s ports, i.e. four higher

;* bits on a port are used).

;*

;* NOTE: It is necessary to define port pins for controlling LCD operating:

;* LCD_enable, LCD_read_write, LCD_reg_select,similar to port for connection to

LCD.

;* It is also necessary to define addresses for the first character in each

;* line.

;*******************************************************************************

*******

LCD_enable BIT P1.3 ; Bit for activating pin E on LCD.

LCD_read_write BIT P1.1 ; Bit for activating pin RW on LCD.

LCD_reg_select BIT P1.2 ; Bit for activating pin RS on LCD.

LCD_port SET P1 ; Port for connection to LCD.

Busy BIT P1.7 ; Port pin where Busy flag appears.

LCD_Start_I_red EQU 00h ; Address of the first message

charac

; ter in the first line on LCD

display.

LCD_Start_II_red EQU 40h ; Address of the first message

charac

; ter in the second line on LCD

display.

LCD_DB: DB 00111100b ; 0 -8b, 2/1 lines, 5x10/5x7 format

DB 00101100b ; 1 -4b, 2/1 lines, 5x10/5x7 format

DB 00011000b ; 2 -Display/cursor shift,

right/left

DB 00001100b ; 3 -Display ON, cursor OFF, cursor

blink off

DB 00000110b ; 4 -Increment mode, display shift

off

DB 00000010b ; 5 -Display/cursor home

DB 00000001b ; 6 -Clear display

DB 00001000b ; 7 -Display OFF, cursor OFF,

cursor blink off

LCD_inic:

;*****************************************

Page 44: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 43 de 45

MOV DPTR,#LCD_DB

MOV A,#00d ; Triple initialization in 8-bit

CALL LCD_inic_status_8 ; mode is performed at the

beginning

MOV A,#00d ; (in case of slow increment of

CALL LCD_inic_status_8 ; power supply when power on

MOV A,#00d

lcall LCD_inic_status_8

MOV A,#1d ; Change from 8-bit into

CALL LCD_inic_status_8 ; 4-bit mode

MOV A,#1d

CALL LCD_inic_status

MOV A,#3d ; From this point program executes

in

;4-bit mode

CALL LCD_inic_status

MOV A,#6d

CALL LCD_inic_status

MOV A,#4d

CALL LCD_inic_status

RET

LCD_inic_status_8:

;******************************************

PUSH B

MOVC A,@A+DPTR

CLR LCD_reg_select ; RS=0 - Write command

CLR LCD_read_write ; R/W=0 - Write data on LCD

MOV B,LCD_port ; Lower 4 bits from LCD port are

memo

; rized

ORL B,#11110000b

ORL A,#00001111b

ANL A,B

MOV LCD_port,A ; Data is copied from A to LCD port

SETB LCD_enable ; EN=1 - EN high-to-low transition

sig

; nal is generated

CLR LCD_enable ; EN=0 made on EN pin of LCD

display

MOV B,#255d ; Time delay in case of improper

reset

DJNZ B,$ ; during initialization

DJNZ B,$

DJNZ B,$

POP B

RET

LCD_inic_status:

;****************************************************************************

MOVC A,@A+DPTR

CALL LCD_status

RET

Page 45: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 44 de 45

;****************************************************************************

;* SUBROUTINE: LCD_status

;* DESCRIPTION: Subroutine for defining LCD status.

;****************************************************************************

LCD_status: PUSH B

MOV B,#255d

DJNZ B,$

DJNZ B,$

DJNZ B,$

CLR LCD_reg_select ; RS=O: Command is sent on LCD

CALL LCD_port_out

SWAP A ; Nibles are swapped in accumulator

DJNZ B,$

DJNZ B,$

DJNZ B,$

CLR LCD_reg_select ; RS=0: Command is sent on LCD

CALL LCD_port_out

POP B

RET

;****************************************************************************

;* SUBROUTINE: LCD_putc

;* DESCRIPTION: Sending character to be displayed on LCD.

;****************************************************************************

LCD_putc: PUSH B

MOV B,#255d

DJNZ B,$

SETB LCD_reg_select ; RS=1: Character is sent on LCD

CALL LCD_port_out

SWAP A ; Nibles are swapped in accumulator

DJNZ B,$

SETB LCD_reg_select ; RS=1: Character is sent on LCD

CALL LCD_port_out

POP B

RET

;****************************************************************************

;* SUBROUTINE: LCD_port_out

;* DESCRIPTION: Sending commands or characters on LCD display

;****************************************************************************

LCD_port_out: PUSH ACC

PUSH B

MOV B,LCD_port ; Lower 4 bits of LCD port are memo

; rized

ORL B,#11110000b

ORL A,#00001111b

ANL A,B

MOV LCD_port,A ; Data is copied from A to LCD port

SETB LCD_enable ; EN=1 - EN high-to-low transition

sig

; nal is generated

CLR LCD_enable ; EN=0 made on EN pin of LCD

display

Page 46: Architecture and Programming of 8051 Micro Controllers Exemples

Architecture and Programming of 8051 Microcontrollers 6:Examples

Página 45 de 45

POP B

POP ACC

RET

END ; End of program

Binary-decimal Conversion of number

While operating with LED and LCD displays, it is often needed to convert numbers from binary to

decimal numerical system. For example, if some register contains a number in binary format that

should be displayed on three digit LED display it is necessary to convert it to decimal format.

Simply, it has to be defined what should be displayed on the far right display (units), middle display

(tens) and far left display (hundreds), respectively.

Subroutine below solves this problem in case of conversion of one byte. Binary number is stored in

Accumulator while digits of that number in decimal format are stored in registers R3, R2 and

accumulator (units, tens and hundreds).

;************************************************************************

;* SUBROUTINE NAME : BinDec.ASM

;* DESCRIPTION : Content of accumulator is converted into three decimal

;* digits

;************************************************************************

BINDEC: MOV B,#10d ; Store decimal number 10 in B

DIV AB ; A:B. Remainder remains in B

MOV R3,B ; Copy units to register R3

MOV B,#10d ; Store decimal number 10 in B

DIV AB ; A:B. Remainder remains in B

MOV R2,B ; Copy tens to register R2

MOV B,#10d ; Store decimal number 10 in B

DIV AB ; A:B. Remainder remains in B

MOV A,B ; Copy hundreds to accumulator

RET ; Return to the main program