Additional hardware


You can attach additional hardware to the ports of the microprocessor.
The following statements will become available :

I2CSEND and I2CRECEIVE and other I2C related statements.
LCD, LCDHEX, DISPLAY and other related LCD statements.

1 WIRE bus explanation.
More about connecting a LCD display.

Hardware related commands
The uP must be connected to a crystal. The frequency of the crystal can range from 0 to 24 Mhz for most chips. The frequency is divided by 12 internally.

So with a 12 Mhz crystal the processor is clocked with 1 Mhz.
Because almost each instruction takes, 1 clock cycle to execute the processor can handle 1 MIPS.

When RS-232 statements such as INKEY, PRINT and INPUT are used, TIMER1 is connected to the system clock.
So TIMER1 cant be used for other purposes such as ON TIMER1 anymore.
When no RS-232 related statements are used you can use TIMER1.

The Baud rate is generated by dividing the system clock.
When a crystal of 11.0592 Mhz is used, the Baud rate can be generated very accurately.

Other crystals can be used too but the generated baud rate will never be exactly
2400 or 4800 baud and higher baud rates are almost impossible.
The exact baud rate is shown in the report file.

The clock frequency is the system frequency divided by 12.
With a 12 Mhz crystal this means that every microsecond the register is incremented.

Timers and Counters
The 8051 has two 16-bit timers named TIMER0 and TIMER1.
Below the internal representation of timer0 is shown.

TIMER0 and TIMER1 are almost identical so you can read TIMER1 for TIMER0.

Each counter register has two SFRs associated with it.
For TIMER0 the SFRs are TL0 and TH0.
TL0 is the lowest byte of TIMER0 and TH0 is the highest byte of TIMER0.
These two registers make the timers 16-bit wide.

The timer can operate as a timer or as a counter.
A timer uses the system clock divided by 12 as the source of its input pulses.
So it increments periodical.

A counter uses external pulses to increment its count.
The external pulses are received at alternative pin P3.4 for TIMER0 and P3.5 for TIMER1.

The timer/counter can be controlled by the run-bit TR0.

You can stop a timer/counter with the statement STOP TIMER0/COUNTER0.
You can start a timer/counter with the statement START TIMER0/TIMER1.

The timer/counter can also be controlled with the alternative pin P3.2.
This pin is labeled for its alternative INT0-input but it can be used to control the timer.
When GATE is reset the timer/counter is enabled.
When GATE is set the timer/counter is enabled if INT0 is active(low). (provided that the timer is started)

The timer/counter can operate in four modes:

mode 0 : 13-bit counter.

An interrupt is generated when the counter overflows. So it takes 8192 pulses to generate the next interrupt.

mode 1 : 16-bit counter.
Mode 1 is similar to mode 0. It implements a 16-bit counter.
It takes 65536 input pulses to generate the next interrupt.
mode 2 : 8-bit auto reload.
TL0 serves as an 8-bit timer/counter.
When the timer/counter overflows the number stored in TH0 is copied into TL0 and the count continues.
An interrupt is generated each time the counter overflows and a reload is performed.
mode 3 : TIMER1 is inactive and holds its count. (TIMER1).
For TIMER0 in timer mode two 8-bit timers are available and in counter mode one 8-bit timer is available. See a datasheet for more details.

The timer/counter can be configured with the CONFIG statement.
The first argument is the timer/counter you want to configure, TIMER0 in this case.
GATE specifies if external timer control with the INT0 pin is enabled.
MODE specifies the timer/counter mode (0-3).

So CONFIG TIMER0 = COUNTER, GATE = INTERNAL, MODE=2 will configure TIMER0 as a COUNTER with not external gatecontrol , in mode 2 (auto reload)

When the timer/counter is configured the timer/counter is stopped so you must start it afterwards with the START TIMER0 statement.

The ON TIMERx statement can be used to respond to a timer/counter interrupt when the timer overflows.

When the timer/counter is used in mode 2 (auto reload) the reload value can be specified with the LOAD TIMERx, value statement.
Because it is an 8-bit register a maximum time of 255 uS can be achieved.

So for a period of 10 uS you must supply a value of (256-10) is 246. To make things easier you can assign the value directly : LOAD TIMERx , 250 will internally be transformed into 256-250=6.

This saves you the trouble of calculating the correct value.

The COUNTER0 and COUNTER1 variables hold the values of timer/counter 0 and 1.
You can also set the timer/counter contents with the COUNTER0 = value statement.

Please note that you with the LOAD statement, you can only load a byte value into the timer/counter.
Because the statement is meant for timer/counter mode 2.

Also note that you can assign a value to the timer/counter with the COUNTER0/COUNTER1 variables. You can not use the TIMER0/TIMER1 in it's place but it does the same thing : assigning/retrieving the timer/counter.

Port 3 is a unique port because it has alternative functions.
That is you can use it as a port like P3.1 = 1 or SET P3.1 or you can make use of the double function of this port.

Port Alternative function
P3.0 RxD receive data for RS-232
P3.1 TxD transmit data for RS-232
P3.2 INT0 interrupt 0 input/timer 0 gate control
P3.3 INT1 interrupt 1 input/timer 1 gate control
P3.4 T0 timer 0 input or counter input
P3.5 T1 timer 1 input or counter input
P3.5 -
P3.7 -

When you make use of the PRINT, INPUT and other RS-232 related statements
P3.0 and P3.1 are used for the RS-232 interface.

When you make use of the INT0/INT1 interrupts, you must connect an interrupt source to the corresponding pins. A switch for example.
The INTx interrupt can occur on the falling edge of a signal or when the signal is low.
Use the following statements to specify the trigger:

SET TCON.0 Falling edge generates interrupt for INT0.
RESET TCON.0 Low signal generates interrupt for INT0.
SET TCON.2 Falling edge generates interrupt for INT1.
RESET TCON.2 Low signal generates interrupt for INT1.
When TCON.x is RESET the interrupts keep on occurring while the input is low.r When TCON.x is SET the interrupt only occurs on the falling edge.

To test if a hardware interrupt is generated you can test the TCON.1 and TCON.3 flags.
These flags are set by hardware when an external interrupt edge is detected.
They are reset by the RETURN statement of the interrupt service routine or subroutine.
TCON.1 must be tested for INT0 and TCON.3 must be tested for INT1.

Some uPs have an additional timer named TIMER2. It depends on the used chip which features TIMER2 has.

Ports & Power Up
Port 1 is an 8-bit bi-directional I/O port. Port pins P1.2 to P1.7 provide internal pull-ups.
P1.0 and P1.1 requires external pull-ups. P1.0 and P1.1 also serve as the positive
input(AIN0) and the negative input(AIN1), respectively, of the on-chip precision
analog comparator.

The port 1 output buffers can sink 20 mA and can drive LED displays directly.
When 1s are written to Port 1 pins, they can be used as inputs.
When pins P1.2 to P1.7 are used as inputs and are externally pulled low,

they will source current because of the internal pullups.

Port 3 pins P3.0 to P3.5, P3.7 are seven bi-directional I/O pins with internal pull-ups.
P3.6 is hard wired as an input to the output of the on-chip comparator and is not
accessible as a general purpose I/O pin.

The port3 output buffers can sink 20 mA.
When 1s are written to Port 3 pins they are pulled high by the internal pullups and can be used as inputs.
Port 3 pins that are externally being pulled low will source current because of the pullups.

Port 3 also serves the functions of various special features of the AT89C2051 as listed below.

Port Alternative function
P3.0 RxD receive data for RS-232
P3.1 TxD transmit data for RS-232
P3.2 INT0 interrupt 0 input/timer 0 gate control
P3.3 INT1 interrupt 1 input/timer 1 gate control
P3.4 T0 timer 0 input or counter input
P3.5 T1 timer 1 input or counter input
P3.5 -
P3.7 -

Writing to a Port
P1 = 255 will write the value 255 to the port 1, setting all the pins to 1
so all pins can be used as inputs.

P1 = 0 will write the value 0 to port 1, setting al pins to zero.

Reading from a Port
byte = P1 will read the value from port 1 and will assign the value to variable byte.

Setting individual pins of a Port

You can also set individual pins of the ports in BASCOM.

SET P1.0 will set pin P1.0 high.

P1.0 = 1 will also set pin P1.0 high.

RESET P1.0 will set pin P1.0 low.
P1.0 = 0 will also set pin P1.0 low.

At power up both ports are high and can be used an inputs.
Individual bits can be set to use a port both as input/output.
For example : P1 = &B00001111 , will set a value of 15 to port 1.
P1.0 to P1.3 can be used as inputs because they are set high.

How to interface the port pins

The schematic above shows how to connect a LED and a relay as an output.