You are on page 1of 55

AT89C55/AT89S52

(3RD YEAR) DEVELOPMENT SYSTEM

OBJECTIVES:
1. To design an Embedded System based on Atmel AT89C55/AT89S52 microcontroller.
2. Programming the system using Assembly & C language and verify the system.
3. Interface different peripherals to the system according to the design requirements.

GROUP Mustafa Aftab


MEMBERS: Shahrukh Alam
ROLL 1924
NUMBERS: 1933
SUBMITTED TO: ENGR. MUHAMMAD ASHRAF KHAN NIAZI

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 1


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SYSTEM BLOCK DIAGRAM:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 2


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Snapshot of AT89S51 Board

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 3


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Practical # 1
In this practical we interface 8 bit led bar with 8051 microcontroller port 1
and run a moving pattern of light on that bar by sending rotating pattern bits
from controller. 16x2 LCD module is interfaced on the same port so we are
using selector switch which selects LED Bar in this practical.

Circuit diagram:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 4


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Assembly Code:
ORG 00H

MOV P1, #0H

MOV A, #1H

AGAIN: MOV P1, A

RL A

ACALL DELAY

SJMP AGAIN

;------------------------------------------------------------------------------------------------------------------------------------------

; DELAY SUBROUTINE

;------------------------------------------------------------------------------------------------------------------------------------------

DELAY: MOV R0, #4

MOV TMOD, #01H

HERE: SETB TR0

CHECK: JNB TF0, CHECK

CLR TR0

CLR TF0

DJNZ R0, HERE

RET

END

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 5


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Practical # 2
In this practical we will interface 16x2 LCD on port 1 of microcontroller and this time switch
enables LCD and disables Led Bar. LCD module is operated in 4 bit mode upper 4 bits of
ports are connected to 4 data pins of LCD and 3 pins are connected to control signal of LCD.
Control signal of LCD includes Enable, Data/ Register select and Enable signals.

Circuit Diagram:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 6


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Assembly Code:
ORG 00H

LCD_REG EQU R0

COMNWRT_M EQU R2

;------------------------------------------------------------------------------------------------------------------------------------------

; MAIN PROGRAM STARTS FROM HERE

;-----------------------------------------------------------------------------------------------------------------------------------------

MAIN:

ACALL INITIALIZE_LCD

MOV DPTR, #LCD_CONTENT

ACALL DISPLAY_MESSAGE

SJMP $

; ~~~~~~~~~~~~~~~~~~~~~SUBROUTINES~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;-----------------------------------------------------------------------------------------------------------------------------------------

; 5 ms DELAY

;----------------------------------------------------------------------------------------------------------------------------------------

delay_5ms: MOV TMOD, #01H

MOV TH0, #HIGH(-5000)

MOV TL0, #LOW(-5000)

SETB TR0

JNB TF0, $

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 7


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

CLR TF0

CLR TR0

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE CAUSES A DELAY

;------------------------------------------------------------------------------------------------------------------------------------------

DELAY_1:

BACK_4: MOV TMOD, #01H ; selecting 1 mode

MOV TL1, #HIGH(-10) ; setting inital value of low byte

MOV TH1, #LOW(-10) ;setting initial value of high byte

SETB TR1

CLR TF1

JUMP: JNB TF1, JUMP

CLR TR1

CLR TF1

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; INITIALIZING LCD Subroutine....

;------------------------------------------------------------------------------------------------------------------------------------------

INITIALIZE_LCD: MOV A, #00B

MOV P1, A

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 8


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, #00100000B ; 4 BIT INTERFACE SET

MOV P1, A

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

ACALL DELAY_5ms

/*Sets 4-bit operation and selects 2-line display and 5x10 dot character font. 4-bit operation starts from
this step and resetting is necessary (Number of display lines and character fonts cannot be changed after
step #3.) */

MOV A, #00100000B

MOV P1, A

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

MOV A, #11000000B

MOV P1, A

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

ACALL DELAY_5ms

MOV A, #02H ; SETS DDRAM ADDRESS 0

ACALL COMNWRT ; CALL COMMAND SUBROUTINE

MOV A, #0CH ; DISPLAY ON, CURSOR OFF

ACALL COMNWRT ; CALL COMMAND SUBROUTINE

MOV A, #01H

ACALL COMNWRT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 9


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE IS USE TO SEND INSTRUCTION TO INSTRUCTION REGISTER OF LCD

;------------------------------------------------------------------------------------------------------------------------------------------

COMNWRT: ACALL CHECK

MOV COMNWRT_M, A

ANL A, #11110000B

MOV P1, A ; COPY REG A TO PORT1

CLR P1.0 ; RS=0 FOR COMMAND

CLR P1.1 ; R/W FOR WRITE

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

MOV A, COMNWRT_M

SWAP A

ANL A, #11110000B

MOV P1, A

CLR P1.0 ; RS=0 FOR COMMAND

CLR P1.1 ; R/W FOR WRITE

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

RET

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 10


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;------------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE WRITES DATA ON LCD

;------------------------------------------------------------------------------------------------------------------------------------------

DATAWRT: ACALL CHECK

MOV 31H, A

ORL A, #00001111B

ANL A, #11110001B

MOV P1, A

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

MOV A, 31H

SWAP A

ORL A, #00001111B

ANL A, #11110001B

MOV P1, A

SETB P1.2 ; E=1 FOR HIGH PULSE

CLR P1.2 ; E=0 FOR H-TO-L PULSE

RET ; CHECK BUSY FLAG OF LCD

CHECK: SETB P1.7 ; TO CONFIGURE P1.7 AS AN INPUT BIT

CLR P1.0 ; RS=0 FOR COMMAND

SETB P1.1 ; R/W=1,READ LCD

LOOP: CLR P1.2 ; E=0 FOR L-H PULSE

ACALL DELAY_1

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 11


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SETB P1.2 ; E=1 FOR L-TO-H PULSE

JB P1.7, LOOP ; CHECK BUSY FLAG,IF FLAG=1 STAY HERE

CLR P1.2 ; E=0 FOR L-H PULSE

ACALL DELAY_1

SETB P1.2

NOP

CLR P1.2

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; DISPLAY DATA ON LCD

;------------------------------------------------------------------------------------------------------------------------------------------

DISPLAY_MESSAGE:

MOV LCD_REG, #00H ; CLEARING LCD REGISTER

LOOP_1: CLR A

MOVC A, @A+DPTR

ACALL DATAWRT

INC LCD_REG

INC DPTR

CJNE LCD_REG, #32, LOOP_2

SJMP HERE_1

LOOP_2: CJNE LCD_REG, #16, LOOP_1

MOV A, #0C0H

ACALL COMNWRT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 12


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SJMP LOOP_1

HERE_1: CLR A

MOV DPTR, #00H

MOV LCD_REG, #00H

RET

LCD_CONTENT:

DB " 4 Bit Mode LCD "

DB " INTERFACING ",0

END

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 13


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Practical # 3
In this practical we interface Dallas Semiconductor serial RTC with 8051 board and Time and
date are shown on LCD.

Circuit Diagram:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 14


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Assembly Code:
ORG 00H

SCL BIT P2.4

SDA BIT P2.5

COUNTER EQU 31H

FLAG EQU 20H

ACK BIT FLAG.0

LASTREAD BIT FLAG.1

PM BIT FLAG.2

LCD_REG EQU R0

SAVE EQU R1

COMNWRT_M EQU R2

RTC EQU 32H

BCD EQU 41H

;------------------------------------------------------------------------------------------------------------------------------------------

; MAIN PROGRAM STARTS FROM HERE

;---------------------------------------------------------------------------------------------------------------------------------------

MAIN:

ACALL INITIALIZE_LCD

MOV P1, 0ffh

CLR LASTREAD

CLR ACK

MOV DPTR, #RTC_CONTENT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 15


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DISPLAY_MESSAGE

; add this code only when u r setting time on rtc, once u set time and date then don't add it.

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

; SETTING TIME AND DATE ON RTC

ACALL START_CONDITION

MOV A, #11010000B ; DEVICE ADDRESS + WRITE MODE SELECTED

ACALL SEND_BYTE

MOV A, #0H

; MOVE THE ADDRESS OF THE FIRST LOCATION IN THE ADDRESS POINTER

ACALL SEND_BYTE

MOV A, #00000000B ; enabling oscillator, setting seconds:00

ACALL SEND_BYTE

MOV A, #00110101B ; setting minutes=35

ACALL SEND_BYTE

MOV A, #01110001B ; setting hours=11 AM(12 hour mode selected)

ACALL SEND_BYTE

MOV A, #00000100B ; setting day of week=4

ACALL SEND_BYTE

MOV A, #00100001B ; setting date=21

ACALL SEND_BYTE

MOV A, #00010000B ; setting month of year=10

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 16


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL SEND_BYTE

MOV A, #00010000B ; setting year=10(2010)

ACALL SEND_BYTE

MOV A, #10010000B ; setting OUT=1, SQEW=1, 1hz clock

ACALL SEND_BYTE

ACALL STOP_CONDITION

ACALL DELAY

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;----------------------------------------------------------------------------------------------------------------------------------------

; READ DATA FROM RTC

;----------------------------------------------------------------------------------------------------------------------------------------

READ:

CLR LASTREAD

; Reading RTC

ACALL START_CONDITION

MOV A, #11010000B ; DEVICE ADDRESS + WRITE MODE SELECTED

ACALL SEND_BYTE

MOV A, #0H

; SETTING POINTER VALUE 0, SO READING OF RTC STARTS FROM

; REGISTER # 1

ACALL SEND_BYTE

ACALL STOP_CONDITION

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 17


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DELAY

ACALL START_CONDITION

MOV A, #11010001B ; DEVICE ADDRESS + READ MODE SELECTED

ACALL SEND_BYTE

ACALL DELAY

ACALL READ_BYTE ; READING SECOND

ANL A, #01111111B ; MASKING OSCILLATOR HAULT BIT =0

MOV RTC, A

ACALL READ_BYTE ; READING MIN

MOV RTC+1, A

ACALL READ_BYTE ; READING HOUR

JNB ACC.5, AM ; IF PM BIT IS HIGH THEN SET pm FLAG

SETB PM

SJMP GO_ON

AM: CLR, PM

GO_ON: ANL A, #00011111B ; MASKING PM BIT =0 in Acc

MOV RTC+2, A

ACALL READ_BYTE

MOV RTC+3, A

ACALL READ_BYTE

MOV RTC+4, A

ACALL READ_BYTE

MOV RTC+5, A

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 18


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SETB LASTREAD

ACALL READ_BYTE

MOV RTC+6, A

ACALL STOP_CONDITION

ACALL DISPLAY_RTC

SJMP READ

START_CONDITION:

SETB SDA

ACALL SCL_HIGH

ACALL DELAY
; PROVIDING DELAY OF T hold time/repeated start= 4.7uSEC (ATLEAST)

CLR SDA ; SENDING H-to-L Pulse (Control Signal)

RET

STOP_CONDITION:

CLR SDA

ACALL SCL_HIGH

ACALL DELAY

SETB SDA ; SENDING L-to-H Pulse (Control Signal)

RET

SEND_BYTE:

CLR SCL

MOV COUNTER, #08

LOOP_0:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 19


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

JNB ACC.7, NOT_ONE

SETB SDA

SJMP ONE

NOT_ONE:

CLR SDA

ONE: LCALL DELAY

ACALL SCL_HIGH

LCALLDELAY

RL A

CLR SCL

DJNZ COUNTER, LOOP_0

ACALL DELAY

SETB SDA

SETB ACK

ACALL SCL_HIGH

ACALL DELAY

JNB SDA, CLEAR

CLR ACK

CLEAR:

ACALL DELAY

CLR SCL

ACALL DELAY

RET

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 20


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;----------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE READS ONE BYTE OF DATA FROM THE DS1307

;-----------------------------------------------------------------------------------------------------------------------------------

READ_BYTE:MOV COUNTER, #08H ; SET COUNTER FOR 8 BITS OF DATA

MOV A, #00H

SETB SDA ; SET SDA HIGH TO ENSURE LINE FREE

READ_BITS: LCALL SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH

LCALLDELAY

MOV C, SDA ; MOVE DATA BIT INTO CARRY BIT \

RLC A ; ROTATE CARRY BIT INTO ACC.0

CLR SCL ; TRANSITION SCL HIGH-TO-LOW

DJNZ COUNTER, READ_BITS ; LOOP FOR 8 BITS

JB LASTREAD, ACKN ; CHECK TO SEE IF THIS IS THE LAST READ

CLR SDA ; IF NOT LAST READ SEND ACKNOWLEDGE BIT

ACKN: LCALL SCL_HIGH ; PULSE SCL TO TRANSIMIT ACKNOWLEDGE

LCALLDELAY

CLR SCL ; OR NOT ACKNOWLEDGE BIT

RET

;---------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE SETS THE CLOCK LINE HIGH

;----------------------------------------------------------------------------------------------------------------------------------------

SCL_HIGH:

SETB SCL ; SET SCL HIGH

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 21


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

JNB SCL, $ ; LOOP UNTIL STRONG 1 ON SCL

RET

;---------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE DELAY THE BUS

;---------------------------------------------------------------------------------------------------------------------------------------

DELAY: NOP ; DELAY FOR BUS TIMING

NOP

NOP

NOP

NOP

RET

;-----------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE IS FOR DISPLAYING RTC DATA ON LCD

;-----------------------------------------------------------------------------------------------------------------------------------------

DISPLAY_RTC: ACALL BCD_ASCII_CONVERTER

MOV A, #80H+5

ACALL COMNWRT

MOV A, BCD+4 ; DISPLAYING HOURS

ACALL DATAWRT

MOV A, BCD+5

ACALL DATAWRT

MOV A, #':'

ACALL DATAWRT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 22


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, BCD+2 ; DISPLAYING MINUTES

ACALL DATAWRT

MOV A, BCD+3

ACALL DATAWRT

MOV A, #':'

ACALL DATAWRT

MOV A, BCD ; DISPLAYING SECONDS

ACALL DATAWRT

MOV A, BCD+1

ACALL DATAWRT

MOV A, #0C0H+5

ACALL COMNWRT

MOV A, BCD+8

ACALL DATAWRT

MOV A, BCD+9 ; DISPLAYING DAY OF MONTH

ACALL DATAWRT

MOV A, #'-'

ACALL DATAWRT

MOV A, BCD+10

ACALL DATAWRT

MOV A, BCD+11 ; DISPLAYING MONTH

ACALL DATAWRT

MOV A, #'-'

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 23


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DATAWRT

MOV A, BCD+12

ACALL DATAWRT

MOV A, BCD+13 ; DISPLAYING YEAR

ACALL DATAWRT

MOV A, #080h+14d

ACALL COMNWRT

JNB PM, SHOW_AM

MOV A, #'P'

ACALL DATAWRT

MOV A, #'M'

ACALL DATAWRT

SJMP ATLAST

SHOW_AM: MOV A, #'A'

ACALL DATAWRT

MOV A, #'M'

ACALL DATAWRT

ATLAST: RET

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 24


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE CONVERTS BCD DATA INTO ASCII (for displaying on LCD)

;------------------------------------------------------------------------------------------------------------------------------------

BCD_ASCII_CONVERTER:

; SECONDS

MOV A, RTC

MOV SAVE, A

SWAP A

ANL A, #0FH

ORL A, #30H

MOV BCD, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+1, A

; MINUTES

MOV A, RTC+1

MOV SAVE, A

SWAP A

ANL A, #0FH

ORL A, #30H

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 25


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV BCD+2, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+3, A

; HOURS

MOV A, RTC+2

MOV SAVE, A

SWAP A

ANL A, #0FH

ORL A, #30H

MOV BCD+4, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+5, A

; DAY OF WEEK

MOV A, RTC+3

MOV SAVE, A

SWAP A

ANL A, #0FH

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 26


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ORL A, #30H

MOV BCD+6, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+7, A

; DAY OF MONTH

MOV A, RTC+4

MOV SAVE, A

SWAP A

ANL A,#0FH

ORL A,#30H

MOV BCD+8, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+9, A

; MONTH

MOV A, RTC+5

MOV SAVE, A

SWAP A

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 27


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ANL A, #0FH

ORL A, #30H

MOV BCD+10, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+11, A

; YEAR

MOV A, RTC+6

MOV SAVE, A

SWAP A

ANL A,#0FH

ORL A,#30H

MOV BCD+12, A

MOV A, SAVE

ANL A, #0FH

ORL A, #30H

MOV BCD+13, A

RET

DELAY_5ms: This subroutine is same as in the practical # 2 so it is not repeated here.

DELAY_1: This subroutine is same as in the practical # 2 so it is not repeated here.

INITIALIZE_LCD: This subroutine is same as in the practical # 2 so it is not repeated here.

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 28


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

COMNWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DATAWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DISPLAY_MESSAGE: This subroutine is same as in the practical # 2 so it is not repeated here.

DISPLAY: DB " DS1307 Serial "

DB " RTC inteface ",0

RTC_CONTENT: DB "TIME: "

DB "DATE: ",0

;----------------------------------------------------------------------------------------------------------------------------------------

END

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 29


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Practical # 4
In this practical we interface 0831 serial ADC with microcontroller and display its data on
serial port.

Circuit diagram:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 30


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Assembly Code:
ORG 00H

CS BIT P2.2

DO BIT P2.3

CLK BIT P2.1

COMNWRT_M EQU R2

LCD_REG EQU R0

ADC_DATA EQU R1

;------------------------------------------------------------------------------------------------------------------------------------------

; MAIN PROGRAM STARTS FROM HERE

;------------------------------------------------------------------------------------------------------------------------------------------

MAIN:

ACALL INITIALIZE_LCD

MOV DPTR, #DISPLAY

ACALL ISPLAY_MESSAGE

SETB DO ; configure it as an input

H1: CLR CS

NOP ; wait for setup time

SETB CLK ; first clock pulse

NOP

NOP

CLR CLK
INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 31
AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

NOP

NOP

CLR A

MOV R3, #08

H2: SETB CLK

NOP

NOP

CLR CLK

NOP

NOP

MOV C, DO ; move this value in carry

RLC A

DJNZ R3, H2

SETB CS

ACALL DISPLAY_ADC_VALUE

JMP H1

DELAY_5ms: This subroutine is same as in the practical # 2 so it is not repeated here.

DELAY_1: This subroutine is same as in the practical # 2 so it is not repeated here.

INITIALIZE_LCD: This subroutine is same as in the practical # 2 so it is not repeated here.

COMNWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DATAWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DISPLAY_MESSAGE: This subroutine is same as in the practical # 2 so it is not repeated here.

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 32


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;------------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE DISPLAY ADC VALUE ON LCD

;------------------------------------------------------------------------------------------------------------------------------------------

DISPLAY_ADC_VALUE:
;Convert 8 bit adc value into 3 digit BCD result and save it at

;locations 34H,33H,32H

MOV B, #0AH

DIV AB

MOV 32H,B

MOV B, #0AH

DIV AB

MOV 33H, B

MOV B, #0AH

DIV AB

MOV 34H, B

MOV A, #0C0H + 6

ACALL COMNWRT

MOV A, 34H

ORL A, #30H

ACALL DATAWRT

MOV A, 33H

ORL A, #30H

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 33


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DATAWRT

MOV A, 32H

ORL A, #30H

ACALL DATAWRT

RET

DISPLAY: DB " 0831 Serial ADC"

DB "value: ",0

END

Practical # 5

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 34


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

In this practical we are performing serial communication between 8051 and host pc. The
data of ADC is transferred to PC as well as it is also displayed on LCD.

Circuit Diagram:

In this circuit MAX232 level translator is not shown and directly a virtual terminal is
connected which displays the data out from 8051 UART, notices that same data is also
present on LCD as well.

Assembly Code:

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 35


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;This program is used to out data on serial port as well as on LCD, if it is

;only desired to output data on serial port then LCD portion can be erased

ORG 00H

CS BIT P2.2

DO BIT P2.3

CLK BIT P2.1

COMNWRT_M EQU R2

LCD_REG EQU R0

;------------------------------------------------------------------------------------------------------------------------------------------

; MAIN PROGRAM STARTS FROM HERE

;------------------------------------------------------------------------------------------------------------------------------------------

MAIN:

ACALL INITIALIZE_LCD

MOV DPTR, #DISPLAY

ACALL DISPLAY_MESSAGE

mov SCON,#50H ;enabling serial port

mov TMOD,#20H ;Timer 1, mode 2

mov TH1,#-3 ;9600 baud rate

SETB TR1 ;start timer 1

SETB DO ;configure it as an input

H1: CLR CS

NOP ;wait for setup time

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 36


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SETB CLK ;first clock pulse

NOP

NOP

CLR CLK

NOP

NOP

CLR A

MOV R3, #08

H2: SETB CLK

NOP

NOP

CLR CLK

NOP

NOP

MOV C, DO ;move this value in carry

RLC A

DJNZ R3, H2

SETB CS

ACALL DISPLAY_ADC_VALUE

JMP H1

;------------------------------------------------------------------------------------------------------------------------------------------

; ALTHOUGH THIS SUBROUTINE HAS SAME NAME AS IN PREVIOUS PRACTICALS BUT IT IS

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 37


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

; MODIFIED

;------------------------------------------------------------------------------------------------------------------------------------------

delay_5ms:

ORL TMOD, #01H

MOV TH0, #HIGH(-5000)

MOV TL0, #LOW(-5000)

SETB TR0

JNB TF0, $

CLR TF0

CLR TR0

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE CAUSES A DELAY, IT IS ALSO MODIFIED

;------------------------------------------------------------------------------------------------------------------------------------------

DELAY_1:

BACK_4: ORL TMOD, #01H ;selecting 1 mode

MOV TL0, #HIGH(-10) ;setting initial value of low byte

MOV TH0, #LOW(-10) ;setting initial value of high byte

SETB TR0

CLR TF0

JUMP: JNB TF0, JUMP

CLR TR0

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 38


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

CLR TF0

RET

INITIALIZE_LCD: This subroutine is same as in the practical # 2 so it is not repeated here.

COMNWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DATAWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DISPLAY_MESSAGE: This subroutine is same as in the practical # 2 so it is not repeated here.

;------------------------------------------------------------------------------------------------------------------------------------------

; Although this routine has same name as in the previous practical but it is modified form

;display_adc_value convert 8 bit adc value into 3 digit BCD result and save it at locations
;34H,33H,32H

;------------------------------------------------------------------------------------------------------------------------------------------

MOV B, #0AH

DIV AB

MOV 32H, B

MOV B, #0AH

DIV AB

MOV 33H,B

MOV B, #0AH

DIV AB

MOV 34H, B

MOV A, #0C0H + 6

ACALL COMNWRT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 39


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, 34H

ORL A, #30H

ACALL SERIAL_OUT

ACALL DATAWRT

MOV A, 33H

ORL A, #30H

ACALL SERIAL_OUT

ACALL DATAWRT

MOV A, 32H

ORL A, #30H

ACALL SERIAL_OUT

ACALL DATAWRT

MOV A, #0AH ; line feed ASCII code for new line

ACALL SERIAL_OUT

MOV A, #0DH ; carriage return ASCII code for new line

ACALL SERIAL_OUT

RET

;------------------------------------------------------------------------------------------------------------------------------------------

; DATA TRANSFER FROM SERIAL PORT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 40


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;------------------------------------------------------------------------------------------------------------------------------------------

SERIAL_OUT:

MOV SBUF, A

JNB TI, $

CLR TI

RET

DISPLAY: DB " 0831 Serial ADC"

DB "value: " ,0

END

Practical # 6
INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 41
AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

In this practical we use two external interrupts of AT89S51 microcontroller and also interface
8 Kilo Byte EEPROM on the same I2C (software) bus where RTC was interfaced, so routines
of I2C communication are copied from practical # 3.

Circuit Diagram:

In this practical, on first external interrupt we store the time and date of RTC in EEPROM and
on second interrupt we retrieve stored values of time and date from EEPROM and display
them on LCD.
INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 42
AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

Assembly Code:

SCL BIT P2.4

SDA BIT P2.5

COUNTER EQU 31H

FLAG EQU 20H

ACK BIT FLAG.0

LASTREAD BIT FLAG.1

PM BIT FLAG.2

LCD_REG EQU R0

SAVE EQU R1

COMNWRT_M EQU R2

RTC EQU 32H

BCD EQU 41H

ORG 00H

LJMP MAIN ; BYPASS INTERRUPT VECTOR TABLE

ORG 003H ; P3.2 (12) IVT

LJMP READ_RTC_AND_STORE_IT_IN_EEPROM

ORG 0013H ; P3.3 (13) IVT

LJMP READ_EEPROM_AND_DISPLAY_IT_ON_LCD

;---------------------------------------------------------------------------------------------------------------------------------------

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 43


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

; MAIN PROGRAM STARTS FROM HERE

;---------------------------------------------------------------------------------------------------------------------------------------

ORG 030H

MAIN: MOV P1, #0FFH

ACALL INITIALIZE_LCD

MOV DPTR, #INITIAL_MESSAGE

MOV IE, #85H ; ENABLING GLOBAL INTERRUPT AND EXTERNAL

; INTERRUPTS 0 AND 1

SJMP $ ; WAIT FOR INTERRUPT

; -------------------------------------------------------------------------------------------------------------------------------------------

; SUBROUTINES

;-------------------------------------------------------------------------------------------------------------------------------------------

DELAY_5ms: This subroutine is same as in the practical # 2 so it is not repeated here.

DELAY_1: This subroutine is same as in the practical # 2 so it is not repeated here.

INITIALIZE_LCD: This subroutine is same as in the practical # 2 so it is not repeated here.

COMNWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DATAWRT: This subroutine is same as in the practical # 2 so it is not repeated here.

DISPLAY_MESSAGE: This subroutine is same as in the practical # 2 so it is not repeated here.

BCD_ASCII_CONVERTER: This subroutine is same as in the practical # 3 so it is not repeated here.

START_CONDITION: This subroutine is same as in the practical # 3 so it is not repeated here.

STOP_CONDITION: This subroutine is same as in the practical # 3 so it is not repeated here.

READ_BYTE: This subroutine is same as in the practical # 3 so it is not repeated here.

DELAY: This subroutine is same as in the practical # 3 so it is not repeated here.

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 44


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SCL_HIGH: This subroutine is same as in the practical # 3 so it is not repeated here.

;-------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROTUINE IS MODIFIED TO SEND BYTE TO RTC AS WELL AS TO EEPROM

;--------------------------------------------------------------------------------------------------------------------------------------

SEND_BYTE:

CLR SCL

MOV COUNTER, #08

LOOP_0: JNB ACC.7, NOT_ONE

SETB SDA

SJMP ONE

NOT_ONE: CLR SDA

ONE: LCALL DELAY_5ms ; THIS DELAY IS ADDED B/C WRITE TIME OF

; EEPROM IS 5 ms

LCALL DELAY_5ms ; FOR ONLY RTC SIMPLE DELAY CAN BE CALLED

ACALL SCL_HIGH

LCALL DELAY

RL A

CLR SCL

DJNZ COUNTER, LOOP_0

ACALL DELAY

SETB SDA

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 45


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

SETB ACK

ACALL SCL_HIGH

ACALL DELAY

JNB SDA, CLEAR

CLR ACK

CLEAR: ACALL DELAY

CLR SCL

ACALL DELAY

RET

;-----------------------------------------------------------------------------------------------------------------------------------------

; DISPLAY RTC TIME AND DATE ON LCD (MODIFIED)

;----------------------------------------------------------------------------------------------------------------------------------------

DISPLAY_RTC: MOV DPTR, # RTC_CONTENT

ACALL DISPLAY_MESSAGE

ACALL BCD_ASCII_CONVERTER

MOV A, #80H+5

ACALL COMNWRT

MOV A, BCD+4 ; DISPLAYING HOURS

ACALL DATAWRT

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 46


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, BCD+5

ACALL DATAWRT

MOV A, #':'

ACALL DATAWRT

MOV A, BCD+2 ; DISPLAYING MINUTES

ACALL DATAWRT

MOV A, BCD+3

ACALL DATAWRT

MOV A, #':'

ACALL DATAWRT

MOV A, BCD ; DISPLAYING SECONDS

ACALL DATAWRT

MOV A, BCD+1

ACALL DATAWRT

MOV A, #0C0H+5

ACALL COMNWRT

MOV A, BCD+8

ACALL DATAWRT

MOV A, BCD+9 ; DISPLAYING DAY OF MONTH

ACALL DATAWRT

MOV A, #'-'

ACALL DATAWRT

MOV A, BCD+10

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 47


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DATAWRT

MOV A, BCD+11 ; DISPLAYING MONTH

ACALL DATAWRT

MOV A, #'-'

ACALL DATAWRT

MOV A, BCD+12

ACALL DATAWRT

MOV A, BCD+13 ; DISPLAYING YEAR

ACALL DATAWRT

MOV A, #080H+14D

ACALL COMNWRT

JNB PM, SHOW_AM

MOV A, #'P'

ACALL DATAWRT

MOV A, #'M'

ACALL DATAWRT

SJMP ATLAST

SHOW_AM: MOV A, #'A'

ACALL DATAWRT

MOV A, #'M'

ACALL DATAWRT

ATLAST: RET

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 48


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

;------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE READ RTC AND STORE THE CONTENT OF RTC IN EEPROM

; FOR TEMPORARY STORAGE CONTROLLER RAM IS USED, CONTENT READ ARE

; ALSO DISPLAYED ON LCD

;------------------------------------------------------------------------------------------------------------------------------------

READ_RTC_AND_STORE_IT_IN_EEPROM:

MOV P1, #0FFH

CLR LASTREAD

CLR ACK

; READING RTC AND SAVING ITS CONTENT IN CONTROLLER RAM

ACALL START_CONDITION

MOV A, #11010000B ; DEVICE ADDRESS + WRITE MODE SELECTED

ACALL SEND_BYTE

; SETTING POINTER VALUE 0, SO READING OF RTC STARTS FROM REGISTER # 1

MOV A, #0H

ACALL SEND_BYTE

ACALL STOP_CONDITION

ACALL DELAY

ACALL START_CONDITION

MOV A, #11010001B ; DEVICE ADDRESS + READ MODE SELECTED

ACALL SEND_BYTE

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 49


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

ACALL DELAY

ACALL READ_BYTE ; READING SECOND

ANL A, #01111111B ; MASKING OSCILLATOR HAULT BIT =0

MOV RTC, A

ACALL READ_BYTE ; READING MIN

MOV RTC+1, A

ACALL READ_BYTE ; READING HOUR

JNB ACC.5, AM ; IF PM BIT IS HIGH THEN SET PM FLAG

SETB PM

SJMP GO_ON

AM: CLR PM

GO_ON: ANL A, #00011111B ; MASKING PM BIT =0 in Acc

MOV RTC+2, A

ACALL READ_BYTE

MOV RTC+3, A

ACALL READ_BYTE

MOV RTC+4, A

ACALL READ_BYTE

MOV RTC+5, A

SETB LASTREAD

ACALL READ_BYTE

MOV RTC+6, A

ACALL STOP_CONDITION

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 50


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

; WRITING DATA ON EEPROM

ACALL START_CONDITION

MOV A, #10100000B

ACALL SEND_BYTE

MOV A, #00000000B

ACALL SEND_BYTE

MOV A, #00000000B

ACALL SEND_BYTE

MOV A, RTC

ACALL SEND_BYTE

MOV A, RTC+1

ACALL SEND_BYTE

MOV A, RTC+2

ACALL SEND_BYTE

MOV A, RTC+3

ACALL SEND_BYTE

MOV A, RTC+4

ACALL SEND_BYTE

MOV A, RTC+5

ACALL SEND_BYTE

MOV A, RTC+6

ACALL SEND_BYTE

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 51


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, #00H

JNB PM, STORE_AM

MOV A, #0FFH

; IF AM THEN STORE A=00H, IF PM THEN STORE A=0FFH

STORE_AM: ACALL SEND_BYTE

ACALL DELAY

ACALL STOP_CONDITION

ACALL DISPLAY_RTC

RETI

;-------------------------------------------------------------------------------------------------------------------------------------

; THIS SUBROUTINE READ EEPROM AND DISPLAY PREVIOUSLY STORED TIME

; AND DATE ON RTC

;------------------------------------------------------------------------------------------------------------------------------------

READ_EEPROM_AND_DISPLAY_IT_ON_LCD:

CLR LASTREAD

ACALL DELAY

ACALL START_CONDITION

MOV A, #10100000B

ACALL SEND_BYTE

MOV A, #00000000B

ACALL SEND_BYTE

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 52


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV A, #00000000B

ACALL SEND_BYTE

ACALL DELAY

ACALL START_CONDITION

MOV A, #10100001B

ACALL SEND_BYTE

ACALL DELAY

ACALL READ_BYTE

MOV RTC, A

ACALL DELAY_5ms

ACALL READ_BYTE

MOV RTC+1, A

ACALL DELAY_5ms

ACALL READ_BYTE

MOV RTC+2, A

ACALL DELAY_5ms

ACALL READ_BYTE

MOV RTC+3, A

ACALL DELAY_5ms

ACALL READ_BYTE

MOV RTC+4, A

ACALL DELAY_5ms

ACALL READ_BYTE

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 53


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

MOV RTC+5, A

ACALL DELAY_5ms

ACALL READ_BYTE

MOV RTC+6, A

SETB LASTREAD

ACALL DELAY_5ms

ACALL READ_BYTE

JNB ACC.5, AM_i ;IF PM BIT IS HIGH THEN SET PM FLAG

SETB PM

SJMP GO_ON_i

AM_i: CLR PM

GO_ON_i: ACALL STOP_CONDITION

ACALL DISPLAY_RTC

RETI

;------------------------------------------------------------------------------------------------------------------------------------------

INITIAL_MESSAGE: DB " 8K Byte Serial "

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 54


AT89C55/AT89S52
(3RD YEAR) DEVELOPMENT SYSTEM

DB "EEPROM Interface", 0

RTC_CONTENT: DB "TIME: "

DB "DATE: ", 0

END

INSTITUTE OF INDUSTRIAL ELECTRONICS ENGINEERING – IIEE KARACHI 55

You might also like