You might have seen a "Hello World!" program code example while learning some programming language. While it is useful for getting familiar with the basics of that language, it also gives you a head start in that environment. If you ever want to learn some new programming language, you might want to Google out a "Hello world!' program code to get started. The code I am about to discuss serves the same purpose for the 8051 microcontroller because it is the most simplest task to perform. Play close attention if you want everything to work properly.
LED TOGGLE
LED (Light Emitting Diodes) are simple lights that you can turn ON/OFF. They glow when they are ON and they don't when they are not. They look somewhat familiar to the picture below
Standard RED LEDs |
The bigger leg represents the POSITIVE terminal while the shorter one is definitely NEGATIVE. So you take care of the legs when you use them (high voltage goes to POSITIVE while NEGATIVE is connected to GROUND of the power supply). In our diagrams, we are used to representing it with the symbol as shown so don't get confused. The left terminal is POSITIVE while the right end is NEGATIVE terminal.
LED Symbol |
INTERFACING LED TO 8051
There are two genuine methods of interfacing (in simple words, connecting) LED to your 8051. Both will work just fine but have opposite programming techniques.
LED INTERFACE 1 |
LED INTERFACE 2 |
The resistor is important in interface 2 to limit the flowing current and avoid damaging the LED and/or MCU but I wouldn't care much about the resistor in interface 1 as 8051 MCU won't/can't damage the LED but let's not go into the safety problems. If you ask me, I would go for interface 1 without using any resistor at all! because it has worked for me every time.
I will explain the program code in detail but let me tell you beforehand, as a conceptual hint, the difference between these two interfaces.
- Interface 1 will glow LED ONLY if the PIN value is HIGH as current flows towards ground.
- Interface 2 will glow LED ONLY if the PIN value is LOW as current flows towards PIN due to its lower potential.
PROGRAM CODE
Let me go straight into the code now. I will explain both Assembly and C Language code so let's get started. You can download the program code in ZIP form by following the link in the download section at the end of this post. I am sure you know how to create HEX file using KEIL and then simulate the code using PROTEUS and when you're done verifying your code, you can easily program the 8051 MCU.
For practical testing, you will need a test circuit for the 8051 MCU which is the most fundamental requirement of the project and you can't help but implement it for successful output. Honestly, it's very simple once you get used to it, I promise.
It will be tricky to explain each portion of the code. You need to learn ASSEMBLY Language to understand it all properly. The flow of the program is such that it toggles PIN1.0 of PORT1. In other words,
- Move 00000001 to PORT1 (each port is 8bit wide)
- Wait for some time
- Move PORT1 value to accumulator where we can complement it using CPL and thus it becomes 11111110 (PIN1.0 is being toggled)
- Move this new value back to PORT1
- Wait for some time and repeat the process.
So the value of PIN1.0 keeps toggling (ON/OFF) after some delay. The delay is implemented by using three nested loops. The loops will run 10 x 200 x 200 times and I don't know the exact amount of time it takes because I am not interested in it at the moment. For now, let's just say that the delay is long enough for the human eye to witness the LED blinking.
The same code in C language will look somewhat like this
C LANGUAGE CODE |
As you can see, it becomes relatively easier to write in C language. Just use normal C operators to manipulate data and values. Now the most important thing in this code is that it is good practise to give the MCU an infinite task to do (by using infinite while loop) so that it will never get out of the loop, stop and just sit there looking at your face. It must constantly perform some operation.
The delay function used in this code is also a general one and it roughly provides the required delay in milliseconds as defined by the input parameter. So we are talking of one second when we say delay(1000). You can use this function for now but don't ever use it when timing is crucial and you need more accuracy.
Here is the simulation design for PROTEUS that I used. As I said, I wouldn't care much about the resistor. Neither in the simulation nor in practical scenario.
PROTEUS SIMULATION DESIGN |
I have also included the design file in the download package. I hope that this post has given you an idea of how things are done in real. It gets easier with practise. Any suggestion/feedback is highly appreciated as I might have missed something. Remember that there is always an easier way around in programming so I encourage you to learn, understand and then venture on your own adventure. Goodluck for the implementation.
This ZIP package contains the following files
- Assembly Language Code
- C Language Code
- Compiled HEX file
- Proteus Design File
You can use all these files at your will but remember that they are for the sake of understanding the concept. You have to know what's going on and then it won't hurt if you just copy/paste but if you do it without caring about understanding, well all I can say is that it's not good for development.
thank you so much :)
ReplyDeleteYou're welcome :)
Deletethanx sir
ReplyDeleteYou're welcome :)
DeleteGood day sir' i'm an elecronics hobbiest and had been using proteus in my small pcb design of analogue circuits. Lately i found interest in coding and eager to learn, can you please give some inputs on easier programming language aside from C?
ReplyDeleteThanks in advance!
Honestly speaking, I haven't yet searched for another programming language aside from C when it comes to microcontroller programming. It is quite basic and easy to learn. Normally people start by learning C as their first programming language plus you can get plenty of help form different resources. As you get used to it, you can easily shift to another language whenever required.
DeleteThank you :)
ReplyDeleteCrystal clear for any beginner. Thank you
ReplyDeleteThank you Mr. Anonymous :)
Deletehi 8051
ReplyDeleteplease can you tell me that for connecting a 8051 on a breadboard for blinking LED's we need an (external)oscillator or not?
Of course. 8051 won't work without the external oscillator.
DeleteHow to glow 3 different pattern with led's using single switch??
ReplyDeleteYou can use a three-way switch to have three unique combinations. Each combination will trigger a specific LED pattern.
DeleteYa it can we glow 3 different patterns of leds with single switch
Deletei need a program to glow even or odd led in 8 led s using loops
ReplyDeleteThat's pretty simple. I am sure you can do it yourself. You can take my code and modify it to achieve your desired result.
DeleteNicely Explained
ReplyDeleteThank you for appreciating :)
Deletesir plz send me assembly language for digital temperature sensor project
DeleteI am afraid I cannot send you the code. Perhaps you can try doing it yourself and let me know if you are stuck somewhere.
Deletei want to glow 8 led simunteneously when only one key is pressed
ReplyDeleteSure. Connect 8 LEDs with any port then use the PORT NAME instead of PIN NUMBER and they will glow all at once.
DeleteNicely Explained, it work. THX
ReplyDeletethis is really good... have a better understanding of this topic now...
ReplyDeleteGood to know :)
Deleteits hardware parts??
ReplyDeleteMicroncontroller, LED, Reset Circuitry, Resistor, Power supply :)
Deletehow to display decrementing series values in led7segment using pointers?
ReplyDeleteI assume you're talking about Seven Segment Display (SSD)? If yes, you need to understand the basics of SSD in my other post.
Delete8051 SEVEN SEGMENT DISPLAY (SSD) INTERFACE
Then you can easily create a pointer that points to a counter variable. Decrement the value and display it on SSD.
Hope this helps!
how to display decremented series of values in led7 segment using dptr pointer in the program
ReplyDeleteStore a value somewhere. Point to that value. Send it to the Seven Segment Display and decrement until you reach your terminating point.
DeleteI understand your points Sir but I have a doubt. How would we program the ports of microcontroller to be as inputs or outputs. I know that to set any port as input we have to make that port high but, should this be done at the first lines of programming or it can be done at any time.
ReplyDeleteyour sincerely
Jasser
By default, all the PINs of 8051 microcontroller are configured as INPUT i-e they are HIGH and you can use them as INPUT directly. Otherwise you have to set them LOW for use as OUTPUT. And you can do this at any stage in the code, not necessarily at the start. But it's a good practice to write all declarations at the beginning so that it's easy to understand.
Deletewhats the clock frequency of the crystal used ?
ReplyDeleteFor this particular case, you could in fact use any crystal. I have used 12MHz in the Proteus example.
DeleteTHANK YOU! THIS SURE HELPED ME GET STARTED!
ReplyDeleteYou're welcome :)
DeleteBeautifully explained!! V clear!! Crystal clearly explained!! Any beginner can understand!! All your blog's are too good!! I follow it regularly!!
ReplyDeleteGood to know :)
Delete