Tuesday, December 27, 2011

INPUT/OUTPUT programming in 8051 C

Ports 0-3 are both byte accessible and bit accessible. So below are few examples to see how to use byte accessible property of ports.
#include<reg51.h>
/*
 * program to get byte from P1
 * and send it to P2
 * after 1/2 second delay
 */
void msdelay(unsigned int x)
{
                unsigned int i,j; //loop variables
                for(i = 0; i<x; i++)
                                for(j = 0;j<1275; j++);
}//end of msdelay()
void main()
{
                unsigned char mybyte;
                P1 = 0xFF; //make P1 input
                while(true)
                {
                                mybyte = P1; //get byte from P1
                                msdelay(500);
                                P2 = mybyte;
                }// end of while
}// end of main
// end of program

#include<reg51.h>
/*
 * increment LED's connected on
 * Port 2
 *
 */
#define LED P2;
// we can also define P2 as shown above
void main()
{
                LED = 0; //clear P2
                while(true)
                {
                                LED++;
                }// end of while
}// end of main
// end of program

Bit addressable I/O programming
As Port 0-3 are bit addressable too so here are few example to see how we can use it.
There are few things to see. In reg51.h we can use ports bit in format Px^y, where x is port number and y is bit number.
Also we need to use sbit data type to use bits of ports.

#include<reg51.h>
/*
 * toggling bit P2.4 without
 * disturbing other P2 bits
 *
 */
void msdelay(unsigned int x)
{
                unsigned int i,j; //loop variables
                for(i = 0; i<x; i++)
                                for(j = 0;j<1275; j++);
}//end of msdelay()
sbit mybit = P2^4;
//this is how we do it
void main()
{
                while(true)
                {
                                mybit = 1;//turn on
                                msdelay(somedelay);
                                mybit = 0;//turn off
                }// end of while
}// end of main
// end of program

#include<reg51.h>
/*
 * door sensor connected to P1.1
 * buzzer connected to P1.7
 * when door sensor open sound buzzer
 * by sending pulse of few hundered hz
 *
 */
void msdelay(unsigned int x)
{
                unsigned int i,j; //loop variables
                for(i = 0; i<x; i++)
                                for(j = 0;j<1275; j++);
}//end of msdelay()
sbit dsensor = P1^1;
sbit buzzer = P1^7;
// this is how we do it
void main()
{
                dsensor = 1; // make it input
                while(dsensor == 1)// check
                {
                                buzzer = 0;
                                msdelay(300);
                                buzzer = 1;
                                msdelay(300);
                }// end of while
}// end of main
// end of program

Accessing SFR address 80 – FFh
Another way to access ports through bits or bytes is through their RAM address. These RAM address can be accessed by using sfr datat type of reg51.h. See table below for addresses.

Port  0
Address
P0.0
80h
P0.1
81h
P0.2
82h
P0.3
83h
P0.4
84h
P0.5
85h
P0.6
86h
P0.7
87h

Port 1
Address
P1.0
90h
P1.1
91h
P1.2
92h
P1.3
93h
P1.4
94h
P1.5
95h
P1.6
96h
P1.7
97h
P1.8
Okay there is no P1.8.

Port 2
Address
P2.0
A0h
P2.1
A1h
P2.2
A2h
P2.3
A3h
P2.4
A4h
P2.5
A5h
P2.6
A6h
P2.7
A7h

Port 3
Address
P3.0
B0h
P3.1
B1h
P3.2
B2h
P3.3
B3h
P3.4
B4h
P3.5
B5h
P3.6
B6h
P3.7
B7h

Few program demonstrating usage.
#include<reg51.h>
/*
 * toggle ports P0,P1,P2
 * continuously with 250ms delay
 *
 */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
// see how address are initailized using sfr keyword
void msdelay(unsigned int x)
{
                unsigned int i,j; //loop variables
                for(i = 0; i<x; i++)
                                for(j = 0;j<1275; j++);
}//end of msdelay()
void main()
{
                while(true)
                {
                                P0 = 0x55;
                                P1 = 0x55;
                                P2 = 0x55;
                                msdelay(250);
                                P0 = 0xAA;
                                P1 = 0xAA;
                                P2 = 0xAA;
                                msdelay(250);
                }// end of while
}// end of main
// end of program

#include<reg51.h>
/*
 * program to toggle P2.1 on and off
 * for some time
 *
 */
sbit mybit = 0xA1;
one more way to decalare P2^1
void main()
{
                unsigned int z;
                for(z = 0;z< sometime; z++)
                {
                                mybit = 0;
                                mybit = 1;
                }// end of for loop
}// end of main
// end of program

This is all I could think off. Rest I will explain as it comes.

No comments:

Post a Comment