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

AUTOMATIC

METER
READING
USING GSM
MODEM

The purpose of this project is the remote monitoring and control


of the domestic energy meter by GSM NET-WORK. This system
enables the Electricity Department to read the meter reading
regularly without the person visiting each house. This can be
achieved by the use of microcontroller unit that continuously
monitors and records the Energy Meter reading in its
permanent ( non-volatile) memory location. This system also
makes use of a GSM model for remote monitoring and control
of Energy meter.
The Microcontroller based system continuously records the
reading and the live meter reading can be sent to the Electricity
deoartment on request. This system also can be used to
disconnect the power supply to the house in case of non
payment of electricity bills. A dedicated Gsm modem with sim
card is required for each energy meter.

In this project we show that how we get a meter reading though


a SMS. Energy meter is connected to the microcontroller via
Opto-Coupler PC 817. Meter provide a pulse according to the
load. Micro-controller counts the pulse and save this in the
external memory . Microcontroller converts this data in to ASCII
code and display the same on the LCD.. GSM modem is
connected with the microcontroller through MAX 232 IC. MAX
232 IC converts TTL data

into

RS232 data . Non volatile

memory is connected to .

For meter reading, fisrt of all we send a SMS to this unit from
department ( company phone) . As the sms is received on this
system then GSM modem transfer the sms to

this unit via

GSM MODEM .. Microcontroller save this sms and send back a


sms with pulse and unit reading.

If the company want to stop . start the meter then company


send a sms to this unit.
By sending a MESSAGE 4LF , UNIT is off automatically and by
sending a message 4LN unit again restart automatically

Components used:
STEP DOWN TRANSFORMER
Step down transformer from 220 volt Ac to 9-0-9 ac. We use step down
transformer to step down the voltage from 220 to 9 volt ac. This AC is further
connected to the rectifier circuit for AC to DC conversion. Transformer current
rating is 750 ma .

DIODE.
In this project we use IN 4007 diode as a rectifier. IN 4007 is special diode to
convert the AC into DC

In this project we use two diode as a rectifier. Here we use full wave rectifier.
Output of rectifier is pulsating DC. To convert the pulsating dc into smooth dc we

use Electrolytic capacitor as a main filter. Capacitor converts the pulsating dc


into smooth dc and this DC is connected to the Regulator circuit for Regulated 5
volt DC.

Pin no 40 of the controller is connected to the positive supply. Pin no 20


is connected to the ground. Pin no 9 is connected to external resistor

capacitor to provide a automatic reset option when power is on.

Reset Circuitry:

Pin no 9 of the controller is connected to the reset circuit. On the circuit


we connect one resistor and capacitor circuit to provide a reset option
when power is on
As soon as you give the power supply the 8051 doesnt start. You need to restart for the microcontroller to start. Restarting the
microcontroller is nothing but giving a Logic 1 to the reset pin at least for the 2 clock pulses. So it is good to go for a small
circuit which can provide the 2 clock pulses as soon as the microcontroller is powered.

This is not a big circuit we are just using a capacitor to charge the
microcontroller and again discharging via resistor.

Crystals

Pin no 18 and 19 is connected to external crystal oscillator to provide a


clock to the circuit.
Crystals provide the synchronization of the internal function and to the peripherals.
Whenever ever we are using crystals we need to put the capacitor behind it to make
it free from noises. It is good to go for a 33pf capacitor.

We can also resonators instead of costly crystal which are low cost and
external capacitor can be avoided.
But the frequency of the resonators varies a lot. And it is strictly not
advised when used for communications projects.

How is this time then calculated?


The speed with which a microcontroller executes instructions is
determined by what is known as the crystal speed. A crystal is a
component connected externally to the microcontroller. The crystal has
different values, and some of the used values are 6MHZ, 10MHZ, and
11.059 MHz etc.

Thus a 10MHZ crystal would pulse at the rate of 10,000,000 times per
second.
The time is calculated using the formula
No of cycles per second = Crystal frequency in HZ / 12.
For a 10MHZ crystal the number of cycles would be,
10,000,000/12=833333.33333 cycles.
This means that in one second, the microcontroller would execute
833333.33333 cycles.

LIQUID CRYSTAL DISPLAY


A liquid crystal display (LCD) is a thin, flat display device made up of any
number of color or monochrome pixels arrayed in front of a light source or
reflector. It is prized by engineers because it uses very small amounts of electric
power, and is therefore suitable for use in battery-powered electronic devices.

Reflective twisted nematic liquid crystal display.


1. Vertical filter film to polarize the light as it enters.
2. Glass substrate with ITO electrodes. The shapes of these
electrodes will determine the dark shapes that will appear
when the LCD is turned on or off. Vertical ridges etched on
the surface are smooth.
3. Twisted nematic liquid crystals.
4. Glass substrate with common electrode film (ITO) with
horizontal ridges to line up with the horizontal filter.
5. Horizontal filter film to block/allow through light.
6. Reflective surface to send light back to viewer.

A subpixel of a color LCD

Overview
Each pixel of an LCD consists of a layer of liquid crystal molecules aligned
between two transparent electrodes, and two polarizing filters, the axes of
polarity of which are perpendicular to each other. With no liquid crystal
between the polarizing filters, light passing through one filter would be blocked
by the other.
The surfaces of the electrodes that are in contact with the liquid crystal material
are treated so as to align the liquid crystal molecules in a particular direction.
This treatment typically consists of a thin polymer layer that is unidirectionally
rubbed using a cloth (the direction of the liquid crystal alignment is defined by
the direction of rubbing).
Before applying an electric field, the orientation of the liquid crystal molecules
is determined by the alignment at the surfaces. In a twisted nematic device (the
most common liquid crystal device), the surface alignment directions at the two
electrodes are perpendicular, and so the molecules arrange themselves in a
helical structure, or twist. Because the liquid crystal material is birefringent (i.e.
light of different polarizations travels at different speeds through the material),

light passing through one polarizing filter is rotated by the liquid crystal helix as
it passes through the liquid crystal layer, allowing it to pass through the second
polarized filter. Half of the light is absorbed by the first polarizing filter, but
otherwise the entire assembly is transparent.
When a voltage is applied across the electrodes, a torque acts to align the liquid
crystal molecules parallel to the electric field, distorting the helical structure
(this is resisted by elastic forces since the molecules are constrained at the
surfaces). This reduces the rotation of the polarization of the incident light, and
the device appears gray. If the applied voltage is large enough, the liquid crystal
molecules are completely untwisted and the polarization of the incident light is
not rotated at all as it passes through the liquid crystal layer. This light will then
be polarized perpendicular to the second filter, and thus be completely blocked
and the pixel will appear black. By controlling the voltage applied across the
liquid crystal layer in each pixel, light can be allowed to pass through in varying
amounts, correspondingly illuminating the pixel.
With a twisted nematic liquid crystal device it is usual to operate the device
between crossed polarizers, such that it appears bright with no applied voltage.
With this setup, the dark voltage-on state is uniform. The device can be operated
between parallel polarizers, in which case the bright and dark states are reversed
(in this configuration, the dark state appears blotchy).
Both the liquid crystal material and the alignment layer material contain ionic
compounds. If an electric field of one particular polarity is applied for a long
period of time, this ionic material is attracted to the surfaces and degrades the
device performance. This is avoided by applying either an alternating current, or
by reversing the polarity of the electric field as the device is addressed (the
response of the liquid crystal layer is identical, regardless of the polarity of the
applied field).
When a large number of pixels is required in a display, it is not feasible to drive
each directly since then each pixel would require independent electrodes.
Instead, the display is multiplexed. In a multiplexed display, electrodes on one
side of the display are grouped and wired together (typically in columns), and
each group gets its own voltage source. On the other side, the electrodes are also
grouped (typically in rows), with each group getting a voltage sink. The groups
are designed so each pixel has a unique, unshared combination of source and
sink. The electronics, or the software driving the electronics then turns on sinks
in sequence, and drives sources for the pixels of each sink.
Important factors to consider when evaluating an LCD monitor include
resolution, viewable size, response time (sync rate), matrix type (passive or

active), viewing angle, color support, brightness and contrast ratio, aspect ratio,
and input ports (e.g. DVI or VGA).

Color displays
In color LCDs each individual pixel is divided into three cells, or subpixels,
which are colored red, green, and blue, respectively, by additional filters
(pigment filters, dye filters and metal oxide filters). Each subpixel can be
controlled independently to yield thousands or millions of possible colors for
each pixel. Older CRT monitors employ a similar method.
Color components may be arrayed in various pixel geometries, depending on
the monitor's usage. If software knows which type of geometry is being used in
a given LCD, this can be used to increase the apparent resolution of the monitor
through subpixel rendering. This technique is especially useful for text antialiasing.

Passive-matrix and active-matrix

A general purpose alphanumeric LCD, with two lines of 16 characters.


LCDs with a small number of segments, such as those used in digital watches
and pocket calculators, have a single electrical contact for each segment. An
external dedicated circuit supplies an electric charge to control each segment.
This display structure is unwieldy for more than a few display elements.
Small monochrome displays such as those found in personal organizers, or older
laptop screens have a passive-matrix structure employing supertwist nematic
(STN) or double-layer STN (DSTN) technology (DSTN corrects a colorshifting problem with STN). Each row or column of the display has a single
electrical circuit. The pixels are addressed one at a time by row and column
addresses. This type of display is called a passive matrix because the pixel must
retain its state between refreshes without the benefit of a steady electrical
charge. As the number of pixels (and, correspondingly, columns and rows)
increases, this type of display becomes less feasible. Very slow response times
and poor contrast are typical of passive-matrix LCDs.
High-resolution color displays such as modern LCD computer monitors and
televisions use an active matrix structure. A matrix of thin-film transistors
(TFTs) is added to the polarizing and color filters. Each pixel has its own
dedicated transistor, allowing each column line to access one pixel. When a row
line is activated, all of the column lines are connected to a row of pixels and the
correct voltage is driven onto all of the column lines. The row line is then
deactivated and the next row line is activated. All of the row lines are activated
in sequence during a refresh operation. Active-matrix displays are much
brighter and sharper than passive-matrix displays of the same size, and
generally have quicker response times, producing much better images.

Twisted nematic (TN)


LCD Display Technology

.
In-plane switching (IPS)

control
Some LCD panels have defective transistors, causing permanently lit or unlit
pixels which are commonly referred to as stuck pixels or dead pixels
respectively. Unlike integrated circuits, LCD panels with a few defective pixels
are usually still usable. It is also economically prohibitive to discard a panel
with just a few defective pixels because LCD panels are much larger than ICs.
Manufacturers have different standards for determining a maximum acceptable
number of defective pixels. The maximum acceptable number of defective
pixels for LCD varies a lot (such as zero-tolerance policy and 11-dead-pixel
policy) from one brand to another, often a hot debate between manufacturers
and customers. To regulate the acceptability of defects and to protect the end
user, ISO released the ISO 13406-2 standard. However, not every LCD
manufacturer conforms to the ISO standard and the ISO standard is quite often
interpreted in different ways.

Examples of defects in LCD displays

LCD panels are more likely to have defects than most ICs due to their larger
size. In this example, a 12" SVGA LCD has 8 defects and a 6" wafer has only 3
defects. However, 134 of the 137 dies on the wafer will be acceptable, whereas
rejection of the LCD panel would be a 0% yield. The standard is much higher
now due to fierce competition between manufacturers and improved quality

control. An SVGA LCD panel with 4 defective pixels is usually considered


defective and customers can request an exchange for a new one. Some
manufacturers, notably in South Korea where some of the largest LCD panel
manufacturers, such as LG, are located, now have "zero defective pixel
guarantee" and would replace a product even with one defective pixel. Even
where such guarantees do not exist, the location of defective pixels is important.
A display with only a few defective pixels may be unacceptable if the defective
pixels are near each other. Manufacturers may also relax their replacement
criteria when defective pixels are in the center of the viewing area.

Zero-power displays
The zenithal bistable device (ZBD), developed by QinetiQ (formerly DERA),
can retain an image without power. The crystals may exist in one of two stable
orientations (Black and "White") and power is only required to change the
image. ZBD Displays is a spin-off company from QinetiQ who manufacture
both grayscale and colour ZBD devices.
A French company, Nemoptic, has developed another zero-power, paper-like
LCD technology which has been mass-produced in Taiwan since July 2003.
This technology is intended for use in low-power mobile applications such as ebooks and wearable computers. Zero-power LCDs are in competition with
electronic paper.
Kent Displays has also developed a "no power" display that uses Polymer
Stabilized Cholesteric Liquid Crystals (ChLCD). The major drawback to the
ChLCD display is slow refresh rate, especially with low temperatures.

Drawbacks
LCD technology still has a few drawbacks in comparison to some other display
technologies:

While CRTs are capable of displaying multiple video


resolutions without introducing artifacts, LCD displays produce
crisp images only in their "native resolution" and, sometimes,
fractions of that native resolution. Attempting to run LCD
display panels at non-native resolutions usually results in the

panel scaling the image, which introduces blurriness or


"blockiness".
LCD displays have a lower contrast ratio than that on a
plasma display or CRT. This is due to their "light valve" nature:
some light always leaks out and turns black into gray. In
brightly lit rooms the contrast of LCD monitors can, however,
exceed some CRT displays due to higher maximum brightness.

LCDs have longer response time than their plasma and


CRT counterparts, older displays creating visible ghosting
when images rapidly change; this drawback, however, is
continually improving as the technology progresses and is
hardly noticeable in current LCD displays with "overdrive"
technology. Most newer LCDs have response times of around 8
ms.

In addition to the response times, some LCD panels have


significant input lag, which makes them unsuitable for fast
and time-precise mouse operations (CAD design, FPS gaming)
as compared to CRTs

Overdrive technology on some panels can produce


artifacts across regions of rapidly transitioning pixels (eg.
video images) that looks like increased image noise or halos.
This is a side effect of the pixels being driven past their
intended brightness value (or rather the intended voltage
necessary to produce this necessary brightness/colour) and
then allowed to fall back to the target brightness in order to
enhance response times.

LCD display panels have a limited viewing angle, thus


reducing the number of people who can conveniently view the
same image. As the viewer moves closer to the limit of the
viewing angle, the colors and contrast appear to deteriorate.
However, this negative has actually been capitalized upon in
two ways. Some vendors offer screens with intentionally
reduced viewing angle, to provide additional privacy, such as
when someone is using a laptop in a public place. Such a set
can also show two different images to one viewer, providing a
three-dimensional effect.

Some users of older (around pre-2000) LCD monitors


complain of migraines and eyestrain problems due to flicker
from fluorescent backlights fed at 50 or 60 Hz. This does not

happen with most modern displays which feed backlights with


high-frequency current.

LCD screens occasionally suffer from image persistence,


which is similar to screen burn on CRT and plasma displays.
This is becoming less of a problem as technology advances,
with newer LCD panels using various methods to reduce the
problem. Sometimes the panel can be restored to normal by
displaying an all-white pattern for extended periods of time.

Some light guns do not work with this type of display since
they do not have flexible lighting dynamics that CRTs have.
However, the field emission display will be a potential
replacement for LCD flat-panel displays since they emulate
CRTs in some technological ways.

Some panels are incapable of displaying low resolution


screen modes (such as 320x200). However, this is due to the
circuitry that drives the LCD rather than the LCD itself.

Consumer LCD monitors are more fragile than their CRT


counterparts, with the screen especially vulnerable. However,
lighter weight makes falling less dangerous, and some
displays may be protected with glass shields.

8051 micro controller


The 8051
The 8051 developed and launched in the early 80`s, is one of
the most popular micro controller in use today. It has a
reasonably large amount of built in ROM and RAM. In addition it
has the ability to access external memory.
The generic term `8x51` is used to define the device. The value
of x defining the kind of ROM, i.e. x=0, indicates none, x=3,
indicates mask ROM, x=7, indicates EPROM and x=9 indicates
EEPROM or Flash.
A note on ROM
The early 8051, namely the 8031 was designed without any
ROM. This device could run only with external memory
connected to it. Subsequent developments lead to the
development of the PROM or the programmable ROM. This type
had the disadvantage of being highly unreliable.
The next in line, was the EPROM or Erasable Programmable
ROM. These devices used ultraviolet light erasable memory
cells. Thus a program could be loaded, tested and erased using
ultra violet rays. A new program could then be loaded again.
An improved EPROM was the EEPROM or the electrically
erasable PROM. This does not require ultra violet rays, and
memory can be cleared using circuits within the chip itself.
Finally there is the FLASH, which is an improvement over the
EEPROM. While the terms EEPROM and flash are sometimes
used interchangeably, the difference lies in the fact that flash

erases the complete memory at one stroke, and not act on the
individual cells. This results in reducing the time for erasure.

Different microcontrollers in market.

PIC
One of the famous microcontrollers used in the industries. It
is based on RISC Architecture which makes the microcontroller process
faster than other microcontroller.

INTEL
These are the first to manufacture microcontrollers. These
are not as sophisticated other microcontrollers but still the easiest one to
learn.

ATMEL
Atmels AVR microcontrollers are one of the most powerful in
the embedded industry. This is the only microcontroller having 1kb of ram
even the entry stage. But it is unfortunate that in India we are unable to
find this kind of microcontroller.

Intel 8051
Intel 8051 is CISC architecture which is easy to program in assembly language
and also has a good support for High level languages.

The memory of the microcontroller can be extended up to 64k.

This microcontroller is one of the easiest microcontrollers to learn.

The 8051 microcontroller is in the field for more than 20 years. There are lots of
books and study materials are readily available for 8051.

Derivatives
The best thing done by Intel is to give the designs of the 8051 microcontroller to
everyone. So it is not the fact that Intel is the only manufacture for the 8051
there more than 20 manufactures, with each of minimum 20 models. Literally
there are hundreds of models of 8051 microcontroller available in market to
choose. Some of the major manufactures of 8051 are

Atmel
Philips
Philips
The Philipss 8051 derivatives has more number of features than in any
microcontroller. The costs of the Philips microcontrollers are higher than the
Atmels which makes us to choose Atmel more often than Philips

Dallas
Dallas has made many revolutions in the semiconductor market. Dallass
8051 derivative is the fastest one in the market. It works 3 times as fast as a
8051 can process. But we are unable to get more in India.

Atmel
These people were the one to master the flash devices. They are the
cheapest microcontroller available in the market. Atmels even introduced a
20pin variant of 8051 named 2051. The Atmels 8051 derivatives can be got in
India less than 70 rupees. There are lots of cheap programmers available in India
for Atmel. So it is always good for students to stick with 8051 when you learn a
new microcontroller.

Architecture

Architecture is must to learn because before learning new machine it is


necessary to learn the capabilities of the machine. This is some thing like before
learning about the car you cannot become a good driver. The architecture of the
8051 is given below.

The 8051 doesnt have any special feature than other microcontroller. The only
feature is that it is easy to learn. Architecture makes us to know about the
hardware features of the microcontroller. The features of the 8051 are

4K Bytes of Flash Memory


128 x 8-Bit Internal RAM
Fully Static Operation: 1 MHz to 24 MHz
32 Programmable I/O Lines
Two 16-Bit Timer/Counters
Six Interrupt Sources (5 Vectored)
Programmable Serial Channel
Low Power Idle and Power Down Modes

The 8051 has a 8-Bit CPU that means it is able to process 8 bit of data at a time.
8051 has 235 instructions. Some of the important registers and their functions
are

Lets now move on to a practical example. We shall work on a simple practical


application and using the example as a base, shall explore the various features
of the 8051 microcontroller.
Consider an electric circuit as follows,

The positive side (+ve) of the battery is connected to one side


of a switch. The other side of the switch is connected to a bulb
or LED (Light Emitting Diode). The bulb is then connected to a
resistor, and the other end of the resistor is connected to the
negative (-ve) side of the battery.
When the switch is closed or switched on the bulb glows.
When the switch is open or switched off the bulb goes off
If you are instructed to put the switch on and off every 30
seconds, how would you do it? Obviously you would keep
looking at your watch and every time the second hand crosses
30 seconds you would keep turning the switch on and off.
Imagine if you had to do this action consistently for a full day.
Do you think you would be able to do it? Now if you had to do
this for a month, a year??
No way, you would say!
The next step would be, then to make it automatic. This is
where we use the Microcontroller.
But if the action has to take place every 30 seconds, how will
the microcontroller keep track of time?
Execution time
Look at the following instruction,
clr p1.0

This is an assembly language instruction. It means we are


instructing the microcontroller to put a value of zero in bit zero
of port one. This instruction is equivalent to telling the
microcontroller to switch on the bulb. The instruction then to
instruct the microcontroller to switch off the bulb is,
Set p1.0
This instructs the microcontroller to put a value of one in bit
zero of port one.
Dont worry about what bit zero and port one means. We shall
learn it in more detail as we proceed.
There are a set of well defined instructions, which are used
while communicating with the microcontroller. Each of these
instructions requires a standard number of cycles to execute.
The cycle could be one or more in number.

How is this time then calculated?


The speed with which a microcontroller executes instructions is
determined by what is known as the crystal speed. A crystal is
a component connected externally to the microcontroller. The
crystal has different values, and some of the used values are
6MHZ, 10MHZ, and 11.059 MHz etc.
Thus a 10MHZ crystal would pulse at the rate of 10,000,000
times per second.

The time is calculated using the formula


No of cycles per second = Crystal frequency in HZ / 12.
For a 10MHZ crystal the number of cycles would be,
10,000,000/12=833333.33333 cycles.
This means that in one second, the microcontroller would execute 833333.33333 cycles.
Therefore for one cycle, what would be the time? Try it out.
The instruction clr p1.0 would use one cycle to execute. Similarly, the instruction setb p1.0
also uses one cycle.
So go ahead and calculate what would be the number of cycles required to be executed to get
a time of 30 seconds!
Getting back to our bulb example, all we would need to do is to instruct the microcontroller
to carry out some instructions equivalent to a period of 30 seconds, like counting from zero
upwards, then switch on the bulb, carry out instructions equivalent to 30 seconds and switch
off the bulb.
Just put the whole thing in a loop, and you have a never ending on-off sequence.

Let us now have a look at the features of the 8051 core,


keeping the above example as a reference,
1. 8-bit CPU.( Consisting of the A and B registers)
Most of the transactions within the microcontroller are carried
out through the A register, also known as the Accumulator. In
addition all arithmetic functions are carried out generally in the
A register. There is another register known as the B register,
which is used exclusively for multiplication and division.
Thus an 8-bit notation would indicate that the maximum value
that can be input into these registers is 11111111. Puzzled?
The value is not decimal 111, 11,111! It represents a binary

number, having an equivalent value of FF in Hexadecimal and


a value of 255 in decimal.
We shall read in more detail on the different numbering
systems namely the Binary and Hexadecimal system in our
next module.
2. 4K on-chip ROM
Once you have written out the instructions for the
microcontroller, where do you put these instructions?
Obviously you would like these instructions to be safe, and not
get deleted or changed during execution. Hence you would load
it into the ROM
The size of the program you write is bound to vary depending
on the application, and the number of lines. The 8051
microcontroller gives you space to load up to 4K of program
size into the internal ROM.
4K, thats all? Well just wait. You would be surprised at the
amount of stuff you can load in this 4K of space.
Of course you could always extend the space by connecting to
64K of external ROM if required.
3. 128 bytes on-chip RAM
This is the space provided for executing the program in terms
of moving data, storing data etc.
4. 32 I/O lines. (Four- 8 bit ports, labeled P0, P1, P2, P3)
In our bulb example, we used the notation p1.0. This means bit
zero of port one. One bit controls one bulb.

Thus port one would have 8 bits. There are a total of four ports
named p0, p1, p2, p3, giving a total of 32 lines. These lines can
be used both as input or output.

5. Two 16 bit timers / counters.


A microcontroller normally executes one instruction at a time.
However certain applications would require that some event
has to be tracked independent of the main program.
The manufacturers have provided a solution, by providing two
timers. These timers execute in the background independent of
the main program. Once the required time has been reached,
(remember the time calculations described above?), they can
trigger a branch in the main program.
These timers can also be used as counters, so that they can
count the number of events, and on reaching the required
count, can cause a branch in the main program.
6. Full Duplex serial data receiver / transmitter.
The 8051 microcontroller is capable of communicating with
external devices like the PC etc. Here data is sent in the form of
bytes, at predefined speeds, also known as baud rates.
The transmission is serial, in the sense, one bit at a time
7. 5- interrupt sources with two priority levels (Two
external and three internal)
During the discussion on the timers, we had indicated that the
timers can trigger a branch in the main program. However,
what would we do in case we would like the microcontroller to
take the branch, and then return back to the main program,
without having to constantly check whether the required time /

count has been reached?


This is where the interrupts come into play. These can be set to
either the timers, or to some external events. Whenever the
background program has reached the required criteria in terms
of time or count or an external event, the branch is taken, and
on completion of the branch, the control returns to the main
program.
Priority levels indicate which interrupt is more important, and
needs to be executed first in case two interrupts occur at the
same time.
8. On-chip clock oscillator.
This represents the oscillator circuits within the microcontroller.
Thus the hardware is reduced to just simply connecting an
external crystal, to achieve the required pulsing rate.

PIN FUNCTION OF IC 89C51.

2
3

Supply

pin of this ic is pin no 40. Normally we apply a 5 volt


regulated dc power supply to this pin. For this purpose either we use
step down transformer power supply or we use 9 volt battery with
7805 regulator.
Ground pin of this ic is pin no 20. Pin no 20 is normally connected
to the ground pin ( normally negative point of the power supply.
XTAL is connected to the pin no 18 and pin no 19 of this ic. The
quartz crystal oscillator connected to XTAL1 and XTAL2 PIN. These pins
also needs two capacitors of 30 pf value. One side of each capacitor is
connected to crystal and other pis is connected to the ground point.
Normally we connect a 12 MHz or 11.0592 MHz crystal with this ic.. But
we use crystal upto 20 MHz to this pins
RESET PIN.. Pin no 9 is the reset pin of this ic.. It is an active high
pin. On applying a high pulse to this pin, the micro controller will reset

and terminate all activities. This is often referred to as a power on


reset. The high pulse must
be high for a minimum of 2 machine cycles before it is allowed to go
low.

PORT0 Port 0 occupies a total of 8 pins.

5.

Pin no 32 to pin no 39. It


can be used for input or output. We connect all the pins of the port 0
with the pullup resistor (10 k ohm) externally. This is due to fact that
port 0 is an open drain mode. It is just like a open collector transistor.

6.

PORT1. ALL the ports in micrcontroller is 8 bit wide

7.

PORT2.

pin no 1 to pin
no 8 because it is a 8 bit controller. All the main register and sfr all is
mainly 8 bit wide. Port 1 is also occupies a 8 pins. But there is no need
of pull up resistor in this port. Upon reset port 1 act as a input port.
Upon reset all the ports act as a input port

port 2 also have a 8 pins. It can be used as a input or


output. There is no need of any pull up resistor to this pin.

PORT 3. Port3 occupies a

totoal 8 pins from pin no 10 to pin no 17.


It can be
used as input or output. Port 3 does not require any pull
up resistor. The same as port 1 and port2. Port 3 is configured as an
output port on reset. Port 3 has the additional function of providing
some important signals such as interrupts. Port 3 also use for serial
communication.

ALE

ALE is an output pin and is active high. When connecting an 8031 to


external memory, port 0 provides both address and data. In other words, the

8031 multiplexes address and data through port 0 to save pins. The ALE pin is
used for demultiplexing the address and data by connecting to the ic 74ls373
chip.

PSEN.

PSEN stands for program store eneable. In an 8031 based system in


which an external rom holds the program code, this pin is connected to the OE
pin of the rom.

EA. EA. In 89c51 8751 or any other family member of the ateml 89c51 series all
come with on-chip rom to store programs, in such cases the EA pin is connected
to the Vcc. For family member 8031 and 8032 is which there is no on chip rom,
code is stored in external memory and this is fetched by 8031. In that case EA
pin must be connected to GND pin to indicate that the code is stored externally.

SPECIAL FUNCTION REGISTER ( SFR) ADDRESSES.

ACC

ACCUMULATOR

0E0H

B REGISTER

0F0H

PSW

PROGRAM STATUS WORD

0D0H

SP

STACK POINTER

81H

DPTR

DATA POINTER 2 BYTES

DPL

LOW BYTE OF DPTR

82H

DPH

HIGH BYTE OF DPTR

83H

P0

PORT0

80H

P1

PORT1

90H

P2

PORT2

0A0H

P3

PORT3

0B0H

TMOD

TIMER/COUNTER MODE CONTROL

89H

TCON

TIMER COUNTER CONTROL

88H

TH0

TIMER 0 HIGH BYTE

8CH

TLO

TIMER 0 LOW BYTE

8AH

TH1

TIMER 1 HIGH BYTE

TL1

TIMER 1 LOW BYTE

8BH

SCON

SERIAL CONTROL

98H

SBUF

SERIAL DATA BUFFER

99H

PCON

POWER CONTROL

87H

8DH

INSTRUCTIONS

SINGLE BIT INSTRUCTIONS.

SETB BIT

SET THE BIT =1

CLR BIT

CLEAR THE BIT =0

CPL BIT

COMPLIMENT THE BIT 0 =1, 1=0

JB BIT,TARGET

JUMP TO TARGET IF BIT =1

JNB BIT, TARGET

JUMP TO TARGET IF BIT =0

JBC BIT,TARGET

JUMP TO TARGET IF BIT =1 &THEN CLEAR THE BIT

MOV INSTRUCTIONS
MOV instruction simply copy the data from one location to another location

MOV D,S
Copy the data from(S) source to D(destination)

MOV R0,A ; Copy contents of A into Register R0

MOV R1,A ; Copy contents of A into register R1

MOV A,R3 ; copy contents of Register R3 into Accnmulator.

DIRECT LOADING THROUGH MOV

MOV A,#23H

; Direct load the value of 23h in A

MOV R0,#12h

; direct load the value of 12h in R0

MOV R5,#0F9H

; Load the F9 value in the Register R5

ADD INSTRUCTIONS.

ADD instructions adds the source byte to the accumulator ( A) and place the
result in the Accumulator.

MOV A, #25H
ADD A,#42H

; BY this instructions we add the value 42h in Accumulator


( 42H+ 25H)

ADDA,R3

;By this instructions we move the data from register r3 to


accumulator and then add the contents of the register into
accumulator .

SUBROUTINE CALL FUNCTION.

ACALL,TARGET ADDRESS
By this instructions we call subroutines with a target address within 2k bytes
from the current program counter.

LCALL, TARGET ADDRESS.

ACALL is a limit for the 2 k byte program counter, but for upto 64k byte we use
LCALL instructions.. Note that LCALL is a 3 byte instructions.
ACALL is a two byte instructions.

AJMP TARGET ADDRESS.

This is for absolute jump


AJMP stand for absolute jump. It transfers program execution to the target
address unconditionally. The target address for this
instruction must be withib 2 k byte of program memory.

LJMP is also for absoltute jump. It tranfer program execution to the target
addres unconditionally. This is a 3 byte instructions LJMP
jump to any address within 64 k byte location.

INSTRUCTIONS RELATED TO THE CARRY

JC TARGET
JUMP TO THE TARGET IF CY FLAG =1

JNC TARGET
JUMP TO THE TARGET ADDRESS IF CY FLAG IS = 0

INSTRUCTIONS RELASTED TO JUMP WITH


ACCUMULATOR

JZ TARGET
JUMP TO TARGET IF A = 0

JNZ TARGET
JUMP IF ACCUMULATOR IS NOT ZERO

This instructions jumps if registe A has a value other than zero

INSTRUCTIONS RELATED TO THE ROTATE

RL A

ROTATE LEFT THE ACCUMULATOR

BY this instructions we rotate the bits of A left. The bits rotated


out of A are rotated back into A at the opposite end

RR A

By this instruction we rotate the contents of the accumulator


from right to left from LSB to MSB

RRC A

This is same as RR A but difference is that the bit rotated out of


register first enter in to carry and then enter into MSB

RLC A

ROTATE A LEFT THROUGH CARRY

Same as above but but shift the data from MSB to carry and
carry to LSB

RET

This is return from subroutine. This instructions is used to


return from a subroutine previously entered by instructions
LCALL and ACALL.

RET1

THIS is used at the end of an interrupt service routine. We use


this instructions after intruupt routine,

PUSH.

This copies the indicated byte onto the stack and increments
SP by . This instructions supports only direct addressing mode.

POP.

POP FROM STACK.

This copies the byte pointed to be SP to the location whose


direct address is indicated, and decrements SP by 1. Notice
that this instructions supports only direct addressing mode.

DPTR INSTRUCTIONS.

MOV DPTR,#16 BIT VALUE

LOAD DATA POINTER

This instructions load the 16 bit dptr register with a 16 bit


immediate value

MOV C A,@A+DPTR

This instructions moves a byte of data located in program ROM


into register A. This allows us to put strings of data, such as
look up table elements.

MOVC A,@A+PC

This instructions moves a byte of data located in the program area to A. the address of the
desired byte of data is formed by adding the program counter ( PC) register to the original
value of the accumulator.

INC BYTE

This instructions add 1 to the register or memory location


specified by the operand.

INC A
INC Rn
INC DIRECT

DEC BYTE

This instructions subtracts 1 from the byte operand. Note that


CY is unchanged

DEC A
DEC Rn
DEC DIRECT

ARITHMATIC INSTRUCTIONS.

ANL dest-byte, source-byte

This perform a logical AND operation

This performs a logical AND on the operands, bit by bit, storing


the result in the destination. Notice that both the source and
destination values are byte size only

`
DIV AB

This instructions divides a byte accumulator by the byte in


register B. It is assumed that both register A and B contain an
unsigned byte. After the division the quotient will be in register
A and the remainder in register B.

TMOD ( TIMER MODE ) REGISTER

Both timer is the 89c51 share the one register TMOD. 4 LSB bit for the timer 0
and 4 MSB for the timer 1.

In each case lower 2 bits set the mode of the timer

Upper two bits set the operations.

GATE:
Gating control when set. Timer/counter is enabled only while the
INTX pin is high and the TRx control pin is set. When cleared, the timer is
enabled whenever the TRx control bit is set

C/T :
Timer or counter selected cleared for timer operation ( input from
internal system clock)

M1

Mode bit 1

M0

Mode bit 0

M1

M0

MODE

OPERATING MODE

13 BIT TIMER/MODE

16 BIT TIMER MODE

8 BIT AUTO RELOAD

SPLIT TIMER MODE

PSW ( PROGRAM STATUS WORD)

CY

PSW.7

CARRY FLAG

AC

PSW.6

AUXILIARY CARRY

F0

PSW.5

AVAILABLE FOR THE USER FRO GENERAL PURPOSE

RS1

PSW.4

REGISTER BANK SELECTOR BIT 1

RS0

PSW.3

REGISTER BANK SELECTOR BIT 0

0V

PSW.2

OVERFLOW FLAG

--

PSW.1

USER DEFINABLE BIT

PSW.0

PARITY FLAG SET/CLEARED BY HARDWARE

PCON REGISATER ( NON BIT ADDRESSABLE)

If the SMOD = 0 ( DEFAULT ON RESET)

TH1

CRYSTAL FREQUENCY
256----

____________________

384 X BAUD RATE


If the SMOD IS = 1
CRYSTAL FREQUENCY
TH1

256-------------------------------------192 X BAUD RATE

There are two ways to increase the baud rate of data transfer in the 8051

1.
2.

To use a higher frequency crystal


To change a bit in the PCON register

PCON register is an 8 bit register . Of the 8 bits, some are unused, and some are
used for the power control capability of the 8051. the bit which is used for the
serial communication is D7, the SMOD bit. When the 8051 is powered up, D7
( SMOD BIT) OF PCON register is zero. We can set it to high by software and
thereby double the baud rate

BAUD RATE COMPARISION FOR SMOD = 0 AND SMOD =1


TH1

( DECIMAL)

HEX

SMOD =0

SMOD =1

-3

FD

9600

19200

-6

FA

4800

9600

-12

F4

2400

4800

-24

E8

1200

2400

XTAL = 11.0592 MHZ

IE ( INTERRUPT ENABLE REGISTOR)

EA

IE.7

Disable all interrupts if EA = 0, no interrupts is acknowledged


If EA is 1, each interrupt source is individually enabled or disbaled
By sending or clearing its enable bit.

IE.6

NOT implemented

ET2

IE.5

enables or disables timer 2 overflag in 89c52 only

ES

IE.4

Enables or disables all serial interrupt

ET1

IE.3

Enables or Disables timer 1 overflow interrupt

EX1

IE.2

Enables or disables external interrupt

ET0

IE.1

Enables or Disbales timer 0 interrupt.

EX0

IE.0

Enables or Disables external interrupt 0

INTERRUPT PRIORITY REGISTER

If the bit is 0, the corresponding interrupt has a lower priority and if the bit is 1
the corresponding interrupt has a higher priority

IP.7

NOT IMPLEMENTED, RESERVED FOR FUTURE USE.

IP.6

NOT IMPLEMENTED, RESERVED FOR FUTURE USE

PT2

IP.5

DEFINE THE TIMER 2 INTERRUPT PRIORITY LELVEL

PS

IP.4

DEFINES THE SERIAL PORT INTERRUPT PRIORITY LEVEL

PT1

IP.3

DEFINES THE TIMER 1 INTERRUPT PRIORITY LEVEL

PX1

IP.2

DEFINES EXTERNAL INTERRUPT 1 PRIORITY LEVEL

PT0

IP.1

DEFINES THE TIMER 0 INTERRUPT PRIORITY LEVEL

PX0

IP.0

DEFINES THE EXTERNAL INTERRUPT 0 PRIORITY LEVEL

SCON: SERIAL PORT CONTROL REGISTER , BIT ADDRESSABLE

SCON

SM0

SCON.7 Serial Port mode specifier

SM1

SCON.6 Serial Port mode specifier

SM2

SCON.5

REN

SCON.4 Set/cleared by the software to Enable/disable reception

TB8

:
SCON.3 The 9th bit that will be transmitted in modes 2 and 3,
Set/cleared
By software

RB8

:
SCON.2 In modes 2 &3, is the 9th data bit that was received. In
mode 1,
If SM2 = 0, RB8 is the stop bit that was received. In mode
0
RB8 is not used

T1
:
th
8 bit

SCON.1 Transmit interrupt flag. Set by hardware at the end of the

Time in mode 0, or at the beginning of the stop bit in the


other
Modes. Must be cleared by software

SCON.0 Receive interrupt flag. Set by hardware at the end of the 8 th

R1
bit

Time in mode 0, or halfway through the stop bit time in the


other
Modes. Must be cleared by the software.

TCON

TIMER COUNTER CONTROL REGISTER

This is a bit addressable

TF1

TCON.7
Timer 1 overflow flag. Set by hardware when the
Timer/Counter 1

Overflows. Cleared by hardware as processor

TR1

TCON.6

Timer 1 run control bit. Set/cleared by software to turn Timer


Counter 1 On/off

TF0 TCON.5
timer/counter 0

Timer 0 overflow flag. Set by hardware when the


Overflows. Cleared by hardware as processor

TR0

TCON.4

Timer 0 run control bit. Set/cleared by software to turn timer


Counter 0 on/off.

IE1

TCON.3

External interrupt 1 edge flag

ITI

TCON.2

Interrupt 1 type control bit

IE0

TCON.1

External interrupt 0 edge

IT0

TCON.0

Interrupt 0 type control bit.

8051 Instruction Set

Arithmetic Operations
Mnemonic

Description

ADD A,Rn

Add register to Accumulator (ACC).

Size

Cycles

ADD A,direct

ADD A,@Ri

Add direct byte to ACC.

Add indirect RAM to ACC

ADD A,#data

Add immediate data to ACC

ADDC A,Rn Add register to ACC with carry

ADDC A,direct

SUBB A,Rn

INC A

Add immediate data to ACC with carry. 2

Subtract direct byte from ACC with borrow

INC Rn

INC direct

Increment register.

Increment direct byte.

Subtract immediate data from ACC with borrow.

Increment ACC.

SUBB A,@Ri Subtract indirect RAM from ACC with borrow. 1

SUBB A,#data

Subtract register from ACC with borrow.

SUBB A,direct

Add direct byte to ACC with carry.

ADDC A,@Ri Add indirect RAM to ACC with carry.

ADDC A,#data

INC @Ri

Increment indirect RAM.

DEC A

Decrement ACC.

DEC Rn

Decrement register.

DEC direct

Decrement direct byte.

DEC @Ri

Decrement indirect RAM.

INC DPTR

Increment data pointer.

MUL AB

Multiply A and B Result: A <- low byte, B <- high byte.

DIV AB

Divide A by B Result: A <- whole part, B <- remainder.

DA A

Decimal adjust ACC.

Logical Operations

Mnemonic

Description

ANL A,Rn

AND Register to ACC.

ANL A,direct AND direct byte to ACC.

Size

Cycles

ANL A,@Ri

AND indirect RAM to ACC.

ANL A,#data

AND immediate data to ACC.

ANL direct,A AND ACC to direct byte.

ANL direct,#data

ORL A,Rn

AND immediate data to direct byte.

OR Register to ACC.

OR indirect RAM to ACC.

ORL A,#data

ORL direct,#data
2

XRL A,direct Exclusive OR direct byte to ACC.

XRL A,@Ri

XRL A,#data

Exclusive OR indirect RAM to ACC.

Exclusive OR immediate data to ACC.

OR immediate data to direct byte.

Exclusive OR Register to ACC.

OR immediate data to ACC.

ORL direct,A OR ACC to direct byte.

XRL A,Rn

ORL A,direct OR direct byte to ACC.

ORL A,@Ri

XRL direct,A Exclusive OR ACC to direct byte.

XRL direct,#data

XOR immediate data to direct byte.

CLR A

Clear ACC (set all bits to zero).

CPL A

Compliment ACC.

RL A

Rotate ACC left.

RLC A

RR A

Rotate ACC left through carry.

Rotate ACC right.

RRC A

SWAP A

Rotate ACC right through carry.

Swap nibbles within ACC.

Data Transfer

Mnemonic

Description

Size

Cycles

MOV A,Rn

Move register to ACC.

MOV A,direct
1

Move direct byte to ACC.

MOV A,@Ri

Move indirect RAM to ACC.

MOV A,#data

MOV Rn,A

Move immediate data to ACC.

Move ACC to register.

MOV Rn,direct

Move direct byte to register.

MOV Rn,#data

Move immediate data to register.

MOV direct,A

Move ACC to direct byte.

MOV direct,Rn

Move register to direct byte.

MOV direct,direct

Move direct byte to direct byte.

MOV direct,@Ri

Move indirect RAM to direct byte.

MOV direct,#data Move immediate data to direct byte.

MOV @Ri,A

Move ACC to indirect RAM.

MOV @Ri,direct

Move direct byte to indirect RAM.

MOV @Ri,#data

Move immediate data to indirect RAM. 2

MOV DPTR,#data16
3
2

Move immediate 16 bit data to data pointer register.

MOVC A,@A+DPTR
address).
1
2

MOVC A,@A+PC

MOVX A,@Ri

MOVX A,@DPTR

MOVX @Ri,A

Move code byte relative to DPTR to ACC (16 bit

Move code byte relative to PC to ACC (16 bit address).1

Move external RAM to ACC (8 bit address).

Move external RAM to ACC (16 bit address).

Move ACC to external RAM (8 bit address).

MOVX @DPTR,A

Move ACC to external RAM (16 bit address).

PUSH direct

Push direct byte onto stack.

POP direct

Pop direct byte from stack.

XCH A,Rn

Exchange register with ACC.

XCH A,direct

Exchange direct byte with ACC.

XCH A,@Ri

Exchange indirect RAM with ACC.

XCHD A,@Ri

Exchange low order nibble of indirect


RAM with low order nibble of ACC

Boolean Variable Manipulation

Mnemonic

Description

Size

Cycles

CLR C

Clear carry flag.

CLR bit

Clear direct bit.

SETB C

Set carry flag.

SETB

bitSet direct bit

CPL C

Compliment carry flag.

CPL bit

Compliment direct bit.

ANL C,bit

AND direct bit to carry flag.

ANL C,/bit

AND compliment of direct bit to carry.

ORL C,bit

OR direct bit to carry flag.

ORL C,/bit

OR compliment of direct bit to carry.

MOV C,bit

Move direct bit to carry flag.

MOV bit,C

Move carry to direct bit.

JC rel

Jump if carry is set.

JNC rel

Jump if carry is not set.

JB bit,rel

Jump if direct bit is set.

JNB bit,rel

Jump if direct bit is not set.

JBC bit,rel

Jump if direct bit is set & clear bit.

Program Branching
Mnemonic

ACALL

Description

addr11

LCALL

Size

Absolute subroutine call.

addr16

Cycles

Long subroutine call.

RET

Return from subroutine.

RETI

Return from interrupt.

Absolute jump.

AJMP addr11

LJMP addr16 Long jump.

SJMP rel

Short jump (relative address).

JMP @A+DPTR

Jump indirect relative to the DPTR.

JZ rel

Jump relative if ACC is zero.

JNZ rel

Jump relative if ACC is not zero.

CJNE A,direct,rel

Compare direct byte to ACC and jump if not equal. 3

CJNE A,#data,rel

Compare immediate byte to ACC and jump if not equal.3

CJNE Rn,#data,rel Compare immediate byte to register and jump if not equal.3
2

CJNE @Ri,#data,rel
equal.3
2

Compare immediate byte to indirect and jump if not

DJNZ Rn,rel Decrement register and jump if not zero.

DJNZ direct,rel

Decrement direct byte and jump if not zero.

The RW line is the "Read/Write" control line. When RW is low (0), the information
on

HOW TO PROGRAM BLANK


CHIP.
8051 micro controller
The 8051
The 8051 developed and launched in the early 80`s, is one of
the most popular micro controller in use today. It has a
reasonably large amount of built in ROM and RAM. In addition it
has the ability to access external memory.
The generic term `8x51` is used to define the device. The value
of x defining the kind of ROM, i.e. x=0, indicates none, x=3,
indicates mask ROM, x=7, indicates EPROM and x=9 indicates
EEPROM or Flash.

Different micro controllers in market.

PIC
One of the famous microcontrollers used in the
industries. It is based on RISC Architecture which makes
the microcontroller process faster than other
microcontroller.

INTEL
These are the first to manufacture
microcontrollers. These are not as sophisticated other
microcontrollers but still the easiest one to learn.

ATMEL
Atmels AVR microcontrollers are one of the
most powerful in the embedded industry. This is the only
microcontroller having 1kb of ram even the entry stage.
But it is unfortunate that in India we are unable to find this
kind of microcontroller.
Intel 8051
Intel 8051 is CISC architecture which is easy to program in
assembly language and also has a good support for High level
languages.

The memory of the microcontroller can be extended up to 64k.

This microcontroller is one of the easiest microcontrollers to


learn.

The 8051 microcontroller is in the field for more than 20 years.


There are lots of books and study materials are readily
available for 8051.

First of all we select and open the assembler and wrote


a program code in the file. After wrote a software we
assemble the software by using internal assembler of
the 8051 editor. If there is no error then assembler
assemble the software abd 0 error is show the output
window.

now assembler generate a ASM file and HEX file. This hex file is
useful for us to program the blank chip.
Now we transfer the hex code into the blank chip with the help
of serial programmer kit. In the programmer we insert a blank
chip 0f 89s51 series . these chips are multi time
programmable chip. This programming kit is seperatally
available in the market and we transfer the hex code into blank
chip with the help of the serial programmer kit

NOTES ON
LCD

LCD DETAIL .

Frequently, an 8051 program must interact with the outside world using input
and output devices that communicate directly with a human being. One of the
most common devices attached to an 8051 is an LCD display. Some of the most
common LCDs connected to the 8051 are 16x2 and 20x2 displays. This means
16 characters per line by 2 lines and 20 characters per line by 2 lines,
respectively.

HD44780U, which refers to the controller chip which receives data from an external source
(in this case, the 8051) and communicates directly with the LCD.
44780 BACKGROUND
AN EXAMPLE HARDWARE CONFIGURATION

DB0 EQU P1.0


DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.7
RS EQU P3.6
RW EQU P3.5
DATA EQU P1
Having established the above equates, we may now refer to our I/O lines by their
44780 name. For example, to set the RW line high (1), we can execute the
following insutrction:
SETB RW

HANDLING THE EN CONTROL LINE

with the following instruction:


SETB EN
And once we've finished setting up our instruction with the other control lines
and data bus lines, we'll always bring this line back low:
CLR EN

Programming Tip: The LCD interprets and executes our command at the
instant the EN line is brought low. If you never bring EN low, your
instruction will never be executed. Additionally, when you bring EN low
and the LCD executes your instruction, it requires a certain amount of time
to execute the command. The time it requires to execute an instruction
depends on the instruction and the speed of the crystal which is attached
to the 44780's oscillator input.

CHECKING THE BUSY STATUS OF THE LCD

As previously mentioned, it takes a certain amount of time for each instruction to be executed
by the LCD. The delay varies depending on the frequency of the we will use this code every
time we send an instruction to
WAIT_LCD:
SETB EN ;Start LCD command
CLR RS ;It's a command
SETB RW ;It's a read command
MOV DATA,#0FFh ;Set all pins to FF initially
MOV A,DATA ;Read the return value
JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR EN ;Finish the command
CLR RW ;Turn off RW for future commands
RET
Thus, our standard practice will be to send an instruction to the LCD and then
call our WAIT_LCD routine to wait until the instruction is completely executed by
the LCD. This will assure that our program gives the LCD the time it needs to
execute instructions and also makes our program compatible with any LCD,
regardless of how fast or slow it is.
Programming Tip: The above routine does the job of waiting for the LCD,
but were it to be used in a real application a very definite improvement
would need to be made: as written, if the LCD never becomes "not busy"

the program will effectively "hang," waiting for DB7 to go low. If this never
happens, the program will freeze. Of course, this should never happen and
won't happen when the hardware is working properly. But in a real
application it would be wise to put some kind of time limit on the delay--for
example, a maximum of 256 attempts to wait for the busy signal to go
low. This would guarantee that even if the LCD hardware fails, the program
would not lock up.

INITIALIZING THE LCD

SETB EN
CLR RS
MOV DATA,#38h
CLR EN
LCALL WAIT_LCD
Programming Tip: The LCD command 38h is really the sum of a number
of option bits. The instruction itself is the instruction 20h ("Function set").
However, to this we add the values 10h to indicate an 8-bit data bus plus
08h to indicate that the display is a two-line display.
We've now sent the first byte of the initialization sequence. The second byte of
the initialization sequence is the instruction 0Eh. Thus we must repeat the
initialization code from above, but now with the instruction. Thus the next code
segment is:
SETB EN
CLR RS
MOV DATA,#0Eh
CLR EN
LCALL WAIT_LCD

Programming Tip: The command 0Eh is really the instruction 08h plus
04h to turn the LCD on. To that an additional 02h is added in order to turn
the cursor on.
The last byte we need to send is used to configure additional operational
parameters of the LCD. We must send the value 06h.
SETB EN
CLR RS
MOV DATA,#06h
CLR EN
LCALL WAIT_LCD
Programming Tip: The command 06h is really the instruction 04h plus
02h to configure the LCD such that every time we send it a character, the
cursor position automatically moves to the right.
So, in all, our initialization code is as follows:
INIT_LCD:
SETB EN
CLR RS
MOV DATA,#38h
CLR EN
LCALL WAIT_LCD
SETB EN
CLR RS
MOV DATA,#0Eh
CLR EN
LCALL WAIT_LCD
SETB EN
CLR RS
MOV DATA,#06h
CLR EN

LCALL WAIT_LCD
RET
Having executed this code the LCD will be fully initialized and ready for us to
send display data to it.

CLEARING THE DISPLAY


When the LCD is first initialized, the screen should automatically be cleared by the 447e, it's
a good idea to make it a subroutine:
CLEAR_LCD:
SETB EN
CLR RS
MOV DATA,#01h
CLR EN
LCALL WAIT_LCD
RET
How that we've written a "Clear Screen" routine, we may clear the LCD at any
time by simply executing an LCALL CLEAR_LCD.
Programming Tip: Executing the "Clear Screen" instruction on the LCD
also positions the cursor in the upper left-hand corner as we would expect.
WRITING TEXT TO THE LCD

Now we get to the real meat of what we're trying to do: All this effort is really so we can
display text on the LCD. Really, we're pretty much done.
Once again, writing text to the LCD is something we'll almost certainly want to do over and
over--so let's make it a subroutine.
WRITE_TEXT:
SETB EN
SETB RS
MOV DATA,A
CLR EN

LCALL WAIT_LCD
RET
The WRITE_TEXT routine that we just wrote will send the character in the
accumulator to the LCD which will, in turn, display it. Thus to display text on the
LCD all we need to do is load the accumulator with the byte to display and make
a call to this routine. Pretty easy, huh?

A "HELLO WORLD" PROGRAM


Now that we have
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT

The above "Hello World" program should, when executed, initialize the LCD, clear
the LCD screen, and display "Hello World" in the upper left-hand corner of the
display.

CURSOR POSITIONING
The

Thus, the
SETB EN
CLR RS
MOV DATA,#0C4h
CLR EN
LCALL WAIT_LCD
The above code will position the cursor on line 2, character 10. To display "Hello"
in the upper left-hand corner with the word "World" on the second line at
character position 10 just requires us to insert the above code into our existing
"Hello World" program. This results in the following:
LCALL INIT_LCD
LCALL CLEAR_LCD
MOV A,#'H'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
SETB EN
CLR RS

MOV DATA,#0C4h
CLR EN
LCALL WAIT_LCD
MOV A,#'W'
LCALL WRITE_TEXT
MOV A,#'O'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#'L'
LCALL WRITE_TEXT
MOV A,#'D'
LCALL WRITE_TEXT

PIN WISE DETAIL OF LCD

1.

Vss

GROUND

2.

Vcc

+5VOLT SUPPLY

Vee

POWER SUPPLY TO CONTROL CONTRAST

4.

RS

RS = 0 TO SELECT COMMAND REGISTER


RS = 1 TO SELECT DATA REGISTER

5.

R/W

R/W = 0 FOR WRITE


R/W = 1 FOR READ

ENABLE

DB0

DB1

$include (reg51.INC)
lcd_rs

bit

p0.0

lcd_en

bit

p0.1

lcd_d4

bit

p0.2

lcd_d5

bit

p0.3

lcd_d6

bit

p0.4

lcd_d7

bit

p0.5

AC_OUT

bit

EEPROM_DATA

equ

P2.1

EEPROM_CLOCK

equ

P2.0

LCD_DATA

equ

10h

TRANS_DATA

equ

11h

reg1

equ

12h

count

equ

13h

pulse_cont_lo

equ

1eh

pulse_cont_hi

equ

1fh

unit_cont_1

equ

21h

unit_cont_2

equ

22h

unit_cont_3

equ

23h

output_temp

equ

org
ljmp

0000h

main
org

ljmp

INTE_0
reti

org

0003h

000bh

24h

P2.7

reti
org
ljmp

0013h

INTE_1
reti
org

001bh

reti
org

0023h

reti
INTE_1:
reti
INTE_0:
push

psw

push

acc

clr

ex0

clr

mov
add

a,pulse_cont_lo
a,#1d
da

mov

pulse_cont_lo,a

mov

a,pulse_cont_hi

addc

a,#0d
da

mov

pulse_cont_hi,a

mov

a,pulse_cont_lo

cjne

a,#20h,inte1_end

mov

a,pulse_cont_hi

cjne

a,#03h,inte1_end

mov

a,unit_cont_2

addc

a,#0d
da

mov

unit_cont_2,a

mov

a,unit_cont_3

addc

a,#0d
da

LCALL write
mov

a,unit_cont_2

LCALL write
inte1_end:
mov

a,pulse_cont_lo

mov

1ah,a

mov

1bh,#3d

lcall DELAY_RM
LCALL write
mov

a,pulse_cont_hi

pop

acc

pop

psw

reti
main:
mov

psw,#00h

mov

sp,#75h

mov

p2,#0ffh

mov

p3,#0ffh

setb

tr1

lcall

INIT_LCD

lcall

CLR_LCD

lcall

data_cheke

setb

AC_OUT

mov

reg1,#60h
mov

mov

dptr,#AT_EN

lcall

SEND_MSG

lcall

DELAY11

mov

dptr,#AT_OK

lcall

SEND_MSG

lcall

DELAY11

mov

dptr,#AT_TEXT

lcall

SEND_MSG

lcall

DELAY11

mov

dptr,#AT_DELETE

lcall

SEND_MSG

lcall

DELAY11

lcall

count,#00h

data_read_eeprom
mov

a,output_temp

cjne

a,#01h,out_off

clr

AC_OUT

sjmp

main_lp1

setb

AC_OUT

out_off:

main_lp1:
lcall CLR_LCD

mov dptr,#MSG1
lcall LINE_1
mov dptr,#MSG2
lcall LINE_2
lcall display_cont
mov

r1,#2fh

mov

r4,#11h

clrram: mov @r1,#20h


inc

r1

djnz

r4,clrram

mov

r1,#2fh

mov

r4,#11h
jb

p3.0,$

lcall data_recv
lcall DELAY11
lcall DELAY11
ljmp

main_lp1

jnb

ri,$

mov

a,sbuf

clr

ri

cjne

a,#00h,back

data_recv:

sjmp back_ret
back:
mov

@r1,a

inc

r1

mov

a,r1

cjne

a,#36h,nextback

mov

a,#'G'

cjne

a,35h,nextback

mov

a,#'N'

cjne

a,34h,nextback

mov

a,#'I'

cjne

a,33h,nextback

mov

a,#'R'

cjne

a,32h,nextback

mov dptr,#AT_ATH
lcall SEND_MSG
lcall DELAY11
lcall DELAY11
ret
nextback:
djnz

r4,data_recv

back_ret:
lcall CLR_LCD
mov dptr,#MSG3
lcall LINE_1
lcall DELAY1
mov LCD_DATA,#0c0h
lcall COMMAND_BYTE
mov

r1,#32h

mov

r4,#0dh

crxdn1:

mov

a,@r1
mov

LCD_DATA,a

cjne

a,#00h,cbrxdn

sjmp cbrxdn1

cbrxdn:
lcall

DATA_BYTE

inc

r1

lcall DELAY1
djnz

r4,crxdn1

cbrxdn1:
lcall DELAY11
lcall DELAY11
lcall DELAY11
lcall DELAY11
mov r4,#23d
mov dptr,#AT_READ
lcall SEND_MSG

recv4: jnb

jnb

ri,$

clr

ri

jnb

ri,$

clr

ri

ri,recv4
mov

a,sbuf

clr

ri

lcall

delay

djnz r4,recv4
;------------------------------mov
recvn: jnb

r1,#60h
ri,recvn
mov

a,sbuf

clr

ri

mov

@r1,a

mov

b,#'"'

cjne

a,b,nextn

sjmp recv14
nextn:inc

r1
sjmp recvn

;------------------------------recv14:

jnb

ri,recv14
mov

a,sbuf

mov

temp_data,a

clr

ri

mov

a,temp_data

cjne a,#10d,recv14
back_ret2:
mov

r1,#2fh

mov

r4,#10h

mov LCD_DATA,#0c0h
lcall COMMAND_BYTE
recv5: jnb

ri,recv5
mov

a,sbuf

clr

ri

mov

b,a

xch

a,cmd0

xch

a,cmd1

xch

a,cmd2

xch

a,cmd3

xch

a,cmd4

cjne

a,#13d,back1

mov

a,cmd4

cjne

a,#10d,back1

mov

a,cmd3

cjne

a,#'O',back1

mov

a,cmd2

cjne

a,#'K',back1

mov

a,cmd1

cjne

a,#13d,back1

mov

a,cmd0

cjne

a,#10d,back1

sjmp back_ret1
back1:
mov

a,b

mov

@r1,a

mov

b,r1

mov

a,#41h

clr

subb a,b
jc
inc

nextback1
r1

nextback1:
sjmp recv5
back_ret1:
lcall CLR_LCD
mov dptr,#MSG4
lcall LINE_1
lcall DELAY1
mov LCD_DATA,#0c0h
lcall COMMAND_BYTE

mov

a,r1

subb a,#007d
mov

temp,a

mov

r1,#2fh

crx11: mov

a,@r1
mov

LCD_DATA,a

lcall

DATA_BYTE

inc

r1

lcall DELAY1
mov

a,r1

cjne

a,temp,crx11

mov

mov

mov

mov

r1,#2fh
mov

a,@r1

mov

cmd0,a

r1,#30h
mov

a,@r1

mov

cmd1,a

r1,#31h
mov

a,@r1

mov

cmd2,a

r1,#32h
mov

a,@r1

mov

cmd3,a

clr

lcall DELAY11
lcall DELAY11
;

mov LCD_DATA,#080h

lcall COMMAND_BYTE

mov

r1,#60h

findn:
mov a,@r1
mov

b,#'"'

cjne

a,b,findn1

sjmp findn2
findn1:
inc r1
sjmp findn
findn2:
mov

r4,#10d

mov

r0,#0eah

dec

r1

dec

r0

mov

a,@r1

mov

@r0,a

findn3:

djnz r4,findn3
mov

r4,#10d

mov

r1,#0eah

mov

r0,#06ah

dec

r1

dec

r0

mov

a,@r1

mov

@r0,a

findn4:

djnz r4,findn4
;

mov

r4,#10d

mov

;crxn:

r1,#60h
mov

a,@r1

mov

LCD_DATA,a

lcall

DATA_BYTE

inc

r1

djnz

r4,crxn

lcall DELAY11
lcall DELAY11
mov dptr,#AT_DELETE
lcall SEND_MSG
lcall DELAY11
lcall

cmp_out

lcall DELAY11
lcall DELAY11
mov dptr,#MSG1
lcall LINE_1
mov dptr,#MSG2
lcall LINE_2
ret

display_cont:
mov

LCD_DATA,#087h

lcall COMMAND_BYTE
lcall DELAY41
mov

a,unit_cont_3
swap a

anl
ADD

a,#0fh
a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,unit_cont_3

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,unit_cont_2
swap a

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,unit_cont_2

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,unit_cont_1
swap a

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE

lcall DELAY41
mov

LCD_DATA,#'.'

lcall DATA_BYTE
lcall DELAY41
mov

a,unit_cont_1

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

LCD_DATA,#0cbh

lcall COMMAND_BYTE
lcall DELAY41
mov

a,pulse_cont_hi
swap a

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,pulse_cont_hi

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,pulse_cont_lo
swap a

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
mov

a,pulse_cont_lo

anl

a,#0fh

ADD

a,#30h

mov

LCD_DATA,a

lcall DATA_BYTE
lcall DELAY41
ret

cmp_out:

clr

mov

a,cmd0

cjne

a,#'4',cmp_out1

mov

a,cmd1

cjne

a,#'L',cmp_out1

mov

a,cmd2

cjne

a,#'N',cmp_out1

AC_OUT
mov

output_temp,#01h

mov a,output_temp
mov 1ah,a
mov 1bh,#5d
lcall DELAY_RM
LCALL write

lcall

sendmsg

mov dptr,#AT_MSG4
lcall SEND_MSG
mov TRANS_DATA,#026D
lcall TRANS
ljmp

cmp_out_end

mov

a,cmd0

cjne

a,#'4',cmp_out2

mov

a,cmd1

cjne

a,#'L',cmp_out2

mov

a,cmd2

cjne

a,#'F',cmp_out2

cmp_out1:

setb

AC_OUT
mov

output_temp,#02h

mov a,output_temp
mov 1ah,a
mov 1bh,#5d
lcall DELAY_RM
LCALL write
lcall

sendmsg

mov dptr,#AT_MSG5
lcall SEND_MSG
mov TRANS_DATA,#026D
lcall TRANS
ljmp

cmp_out_end

mov

a,cmd0

cmp_out2:

cjne

a,#'A',cmp_out_end

mov

a,cmd1

cjne

a,#'M',cmp_out_end

mov

a,cmd2

cjne

a,#'R',cmp_out_end

lcall

send_count

ljmp

cmp_out_end

cmp_out_end:
mov

cmd0,#00h

mov

cmd1,#00h

mov

cmd2,#00h

mov

cmd3,#00h
ret

send_count:
lcall

sendmsg

mov dptr,#AT_MSG1
lcall SEND_MSG
mov TRANS_DATA,#010D
lcall TRANS
mov dptr,#AT_MSG2
lcall SEND_MSG
mov TRANS_DATA,#010D
lcall TRANS
mov a,unit_cont_3
swap
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a

lcall TRANS
mov a,unit_cont_3
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov a,unit_cont_2
swap
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov a,unit_cont_2
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov a,unit_cont_1
swap
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov TRANS_DATA,#'.'
lcall TRANS
mov a,unit_cont_1

lcall SEND_MSG

mov TRANS_DATA,#010D
lcall TRANS
mov a,pulse_cont_hi
swap
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov a,pulse_cont_hi
anl

a,#0fh

anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov a,pulse_cont_lo
anl

a,#0fh

ADD a,#30h
mov TRANS_DATA,a
lcall TRANS
mov TRANS_DATA,#026D
lcall TRANS
ret
sendmsg:
mov dptr,#AT_EN
lcall SEND_MSG
lcall DELAY11
mov dptr,#AT_OK

lcall SEND_MSG
lcall DELAY11
mov dptr,#AT_TEXT
lcall SEND_MSG
lcall DELAY11
mov dptr,#AT_SEND
lcall SEND_MSG
mov

TRANS_DATA,#'"'

lcall

TRANS

mov

TRANS_DATA,#'0'

lcall

TRANS

mov

r0,#60h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#61h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#62h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#63h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#64h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#65h

mov

TRANS_DATA,@r0

mov

TRANS_DATA,@r0

lcall

TRANS

mov

r0,#69h

mov

TRANS_DATA,@r0

lcall

TRANS

mov

TRANS_DATA,#'"'

lcall

TRANS

mov

TRANS_DATA,#013d

lcall

TRANS

lcall DELAY11
ret
TRANS:
mov a,TRANS_DATA
mov

sbuf,a

jnb

ti,$

clr

ti

clr

ri

lcall

DELAY1

ret
SEND_MSG:
clr a
movc a,@a+dptr
cjne a,#0D,SEND_CONT
ret
SEND_CONT:
mov TRANS_DATA,a
lcall TRANS

inc dptr
ljmp SEND_MSG
wait:
ljmp

wait

LINE_1:
mov

LCD_DATA,#080h

lcall COMMAND_BYTE
lcall DELAY41
lcall WRITE_MSG
ret
LINE_2:
mov

LCD_DATA,#0c0h

lcall COMMAND_BYTE
lcall DELAY41
lcall WRITE_MSG
ret
LINE_2R:
mov

LCD_DATA,#0c0h

lcall COMMAND_BYTE
lcall DELAY41
lcall WRITE_MSG1
ret
INIT_LCD:
clr

lcd_rs

clr

lcd_en

clr

lcd_d7

clr

lcd_d6

setb

lcd_d5

setb

lcd_d4

nop
setb

lcd_en

nop
clr
lcall
setb

lcd_en
delay41
lcd_en

nop
clr
lcall
setb

lcd_en
delay1
lcd_en

nop
clr
lcall
clr
lcall

lcd_en
delay1
lcd_en
delay1

mov

LCD_DATA,#28h

lcall COMMAND_BYTE
mov

LCD_DATA,#08h

lcall COMMAND_BYTE
mov

LCD_DATA,#01h

lcall COMMAND_BYTE
mov

LCD_DATA,#06h

lcall COMMAND_BYTE
clr

lcd_rs

clr

lcd_en

mov

LCD_DATA,#28h

lcall COMMAND_BYTE

mov

LCD_DATA,#0ch

lcall COMMAND_BYTE
mov

LCD_DATA,#06h

lcall COMMAND_BYTE
mov

LCD_DATA,#01h

lcall COMMAND_BYTE
ret
CLR_LCD:
mov

LCD_DATA,#001h

lcall COMMAND_BYTE
lcall DELAY41
ret
WRITE_MSG:
mov

a,#00h

movc

a,@a+dptr

cjne

a,#'WRITE_CONT

ret
WRITE_CONT:
mov

LCD_DATA,a

lcall DATA_BYTE
inc
ljmp

dptr
WRITE_MSG

WRITE_MSG1:
mov

a,#00h

movc

cjne

ret
WRITE_CONT1:
mov

LCD_DATA,a

a,#'$',WRITE_CONT1

mov

@r1,a

lcall DATA_BYTE
inc

dptr

inc

r1

ljmp

WRITE_MSG1

COMMAND_BYTE:
ljmp

CMD10

DATA_BYTE:
clr
setb

lcd_en
lcd_rs

CMD10:
nop
push

acc

mov

a,LCD_DATA

mov

c,acc.4

mov

lcd_d4,c

mov

c,acc.5

mov

lcd_d5,c

mov

c,acc.6

mov

lcd_d6,c

mov

c,acc.7

mov

lcd_d7,c

nop
setb lcd_en
nop
clr

lcd_en

mov

c,acc.0

mov

lcd_d4,c

nop
setb lcd_en
nop
clr
lcall

lcd_en

delay41
pop

acc

ret

delay_2ms:
mov

r7,#10h

delay_2ms_1:
mov

r6,#0ffh

delay_2ms_2:
djnz

r6,delay_2ms_2

djnz

r7,delay_2ms_1

ret

DELAY:
mov

r6,#10d

DEL:
djnz

r6,DEL

ret
DELAY1:
mov

r6,#0d

mov

r7,#20d

DELAY10:
djnz

r6,DELAY10

djnz

r7,DELAY10

ret
DELAY_RM:
mov

r6,#0d

mov

r7,#5d

DEL_RM:
djnz

r6,DEL_RM

djnz

r7,DEL_RM

ret
DELAY5S:
mov

r5,#0d

mov

r6,#0d

mov

r7,#25d

DEL5S:
djnz

r5,DEL5S

djnz

r6,DEL5S

djnz

r7,DEL5S

ret

DELAY41:
mov

r6,#0d

mov

r7,#8d

DLP410:
djnz

r6,DLP410

djnz

r7,DLP410

ret
DELAY11:
mov

r6,#0d

mov

r7,#0d

mov

r5,#5d

DLP11:
djnz

r6,DLP11

djnz

r7,DLP11

djnz

r5,DLP11

ret
data_cheke:
mov 1bh,#6d
lcall DELAY_RM
lcall read
mov

a,19h

cjne

a,#0d,data_chanj

ljmp

data_load_eeprom

mov

1ah,#0d

mov

1bh,#0d

data_chanj:

lcall DELAY_RM
LCALL write
mov

1ah,#0d

mov

1bh,#1d

lcall DELAY_RM
LCALL write

lcall DELAY_RM
LCALL write
mov

1ah,#0d

mov

1bh,#3d

lcall DELAY_RM

LCALL write
mov

1ah,#0d

mov

1bh,#4d

lcall DELAY_RM
LCALL write

lcall DELAY_RM
LCALL write
mov

1ah,#0d

mov

1bh,#6d

lcall DELAY_RM
LCALL write
data_load_eeprom:
ret
data_read_eeprom:
mov 1bh,#0d
lcall DELAY_RM
lcall read
mov unit_cont_1,19h
lcall DELAY_RM
lcall read
mov unit_cont_2,19h
lcall DELAY_RM
lcall read
mov unit_cont_3,19h
mov 1bh,#3d
lcall DELAY_RM
lcall read

mov pulse_cont_lo,19h
mov 1bh,#4d
lcall DELAY_RM
lcall read
mov pulse_cont_hi,19h
mov 1bh,#5d
lcall DELAY_RM
lcall read
mov output_temp,19h
ret
;;;;;;;;;;;;; for 24c04 ;;;;;;;;;;;;;;;
read: PUSH B
MOV B, A
ACALL START
JC NOBUS
MOV A, #00H
ORL A, #0A0H
ACALL SHOUT
JC XR1
MOV A,1bh
ACALL SHOUT
JC XR1
MOV A, B
lCALL R_CRNT
lJMP XR2
XR1:

lCALL STOP

NOBUS: SETB 1
XR2:

MOV 19h, A
POP B
RET

START: SETB EEPROM_DATA


SETB EEPROM_CLOCK
JNB EEPROM_DATA, X40
JNB EEPROM_CLOCK, X40
CLR EEPROM_DATA

CLR EEPROM_CLOCK
CLR C
AJMP X41
X40:

SETB C

X41:

RET

STOP: CLR EEPROM_DATA

SETB EEPROM_CLOCK
NOP

SETB EEPROM_DATA
RET

SHOUT: PUSH B
MOV B, #8
X42:

RLC A
MOV EEPROM_DATA, C

SETB EEPROM_CLOCK

CLR EEPROM_CLOCK
DJNZ B, X42
SETB EEPROM_DATA

SETB EEPROM_CLOCK

NOP
MOV C, EEPROM_DATA
POP B
RET
MOV B, #8
X43:

NOP
NOP
NOP
NOP
NOP
SETB EEPROM_CLOCK

MOV C, EEPROM_DATA
CLR EEPROM_CLOCK
DJNZ B, X43
RET

ACK:

CLR EEPROM_DATA

NOP

NOP
SETB EEPROM_CLOCK

CLR EEPROM_CLOCK
RET
NAK:

SETB EEPROM_DATA

RET

write: lCALL START


JC XW2
MOV A, #00H
ORL A, #0A0H
lCALL SHOUT
lCALL SHOUT
JC XW1
JC XW1
CLR C
XW1:

lCALL STOP

XW2:

RET

R_CRNT: lCALL START


JC XRC2
MOV A, #00H
lCALL SHOUT
JC XRC1

lCALL SHIN
lCALL NAK
CLR C
XRC1: l STOP
XRC2: RET

MSG1:

db ' unit 00000.0

MSG2:

db 'Pulse Cont 0000

MSG3:

db ' NEW MASSAGE

MSG4:

db ' DATA RECEIVED

AT_ATH:
AT_OK:
AT_EN:

DB

'ATH',013D,0

'AT',013D,0
'ATE1',013D,0

AT_READ 'AT+CMGR=1',013D,
AT_TEXT:

AT+CMGF=1',013D,0

AT_DELETE: 'AT+CMGD=1',013D,
AT_SEND:

'AT+CMGS=',0

AT_MSG1:

'MESSAGE RECEIVED',010D

AT_MSG2:

'UNIT COUNT',010D,0

AT_MSG3:

'PULSE COUNT',010D,0

AT_MSG4:

'OUTPUT ON',010D,0

AT_MSG5:

'OUTPUT OFF',010D,0

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