Introduction: Speed Control of DC Motor With 8051

Hey friends this is my 3rd year BE project " Speed control of DC motor"which i could like to share with you .In this you will learn how to interface LCD,hex keypad and motor .The code is written in assembly      
to simplify I have first explained separately LCD interfacing hex keypad interfacing ,motor interfacing with L293D 

so Lets get Started !!!

Step 1: Materials Required

*Hex keypad
*DC motor 

I assume u have basic knowledge of 8051 programming in assembly

Step 2: Interfacing DC Motor -L293D

L293D is a dual H-Bridge motor driver, So with one IC we can interface two DC motors which can be controlled in both clockwise and counter clockwise direction we can control speed of each dc motor by giving PWM to enable pin .L293D has output current of 600mA and peak output current of 1.2A per channel. Moreover for protection of circuit from back EMF ouput diodes are included within the IC. The output supply (VCC2) has a wide range from 4.5V to 36V, which has made L293D a best choice for DC motor driver.

    As you can see in the circuit, three pins are needed for interfacing a DC motor (A, B, Enable). If you want to control speed enable pin is connetcted to the PWM pin of microcontroller . I have connected only one motor and  used the enable pin to contol the speed of dc motor.

Step 3: Interfacing LCD

I will not go in deep with LCD as it is a too vast topic  i have mentioned some sites which are very use full 

    LCD consist of 16 pin 
    Vdd-positive voltage
    Vee-contrast setting
data pin  D0 to D7
    backlight pin LED and LED-

  The LCD requires 3 control lines (RS, R/W & EN) & 8 (or 4) data lines.When RS is low (0), the data is to be treated as a command. When RS is high (1), the data being sent is considered as text data which should be displayed on the screen.
When R/W is low (0), the information on the data bus is being written to the LCD. When RW is high (1), the program is effectively reading from the LCD. Most of the times there is no need to read from the LCD so this line can directly be connected to Gnd thus saving one controller line.The ENABLE pin is used to latch the data present on the data pins. A HIGH - LOW signal is required to latch the data. 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.


Step 4: Interfacing HEX Keypad

Hex key pad is essentially a collection of 16 keys arranged in the form of a 4×4 matrix. Hex key pad usually have keys representing numerics 0 to 9 and characters A to F.
    The hex keypad has 8 communication lines namely R1, R2, R3, R4, C1, C2, C3 and C4.  R1 to R4 represents the four rows and C1 to C4 represents the four columns. When a particular key is pressed the corresponding row and column to which the terminals of the key are connected gets shorted. For example if key 1 is pressed row R1 and column C1 gets shorted and so on. The program identifies which key is pressed by a method known as column scanning. In this method a particular row is kept low (other rows are kept high) and the columns are checked for low. If a particular column is found low then that means that the key connected between that column and the corresponding row (the row that is kept low) is been pressed. For example if  row R1 is initially kept low and column C1 is found low during scanning, that means key 1 is pressed.


Step 5: Complete Code

Now as we know LCD, hex keypad and L293D interfacing we will now discuss  the flow of program 
    First I have have initialized LCD to display "press E-enter to change PWM" then we enter a loop to generate PWM each time it enters a loop it checks for E-enter ,it remains in this loop until key E is pressed ,once E key is pressed it changes the display to " Enter PWM-" now hex keypad is scanned to get the PWM, a three digit number from 0-255.Now as we now from hex keypad scan  we get three digit ASCII number.first this ASCII number is converted into hex by masking the higher nibble
ANL A,#0FH                     ; MASK HIGHER NIBBLE

now the number we get is converted into three digit number using convert motor
//---------CONVERT MOTOR--------------
        MOV R3,A      ; SAVE NUMBER IN R3
        MOV A,R1      ;
        MOV    R2,A      ;Put counter in R2

        MUX: MOV B,#10
        MUL AB          ; MULTIPLY 10
        DJNZ R2,MUX       ;depending on position

        ADD A,R7
        MOV R7,A

when first number is entered it is multiplied by 100 then saved in R7 a counter in R1 is used to keep the track of digits place then the second number is multiplied by 10 and added to first number saved in R7 and the number unit place is added to get the PWM

after this execution the program jumps back to LCD to change the display ,and then PWM loop to rotate the motor with new PWM and the cycle continues      


finally the complete code,hex file and proteus file is here

Microcontroller Contest

Participated in the
Microcontroller Contest