Embedded C Programming
Embedded C Programming
Programming 8051 in C
C code is portable
C data types for the 8051
Since one of the goals of 8051 C programmers is to
create smaller hex files, it is worthwhile to re-examine
C data types for 8051 C
This will help programmers 2 create smaller hex files
Unsigned char
8-bit data type-takes value in the range of 0-255 (00-
FFH)
Most widely data types for the 8051
Signed char is default
Write an 8051 C program to send values 00-FF to
P1
#include<reg51.h>
Void main (void)
{
unsigned char z;
for(z=0;z<=255;z++)
P1=z;
}
Toggle all the bits of P1 continuously
#include<reg51.h>
void main (void)
{
for(; ;) // repeat forever
{
P1=0x55; // 0x indicates data is in hex
P1=0xAA;
}
}
Signed char
8-bit data type dat uses d MBS-D7 to represent – or +
value
Values from -128 to +127
Default is signed char
Unsigned int
16-bit data type
Values in the range 0-65535 (0000-FFFF H)
Used to set counter values of >256
Takes 2 bytes of memory
Sbit data type
Used for a single bit
Format:
sbit name= bit
For ex:
sbit LED =P1^0
Write an 8051 C program to toggle bit D0 of port
P1 50,000 times
#include<reg51.h>
sbit MYBIT=P1^0; //sbit is declared out of main
//program
Void main (void)
{
unsigned int z;
for(z=0;z<50000;z++)
{
MYBIT=o;
MYBIT=1;
}
}
Time delay using C
There are two ways to create a time delay in 8051 C:
1. Using a simple for loop
2. Using the 8051 timers
Three factors that can affect the accuracy of delay
Compiler choice
Crystal frequency
The 8051 design
Original 8051 design used 12 clock periods per m/c cycle
DS5000- 4 clock periods per m/c cycle
DS89C420- 1 clock periods per m/c cycle
Toggle all the bits of P1 continuously with some
delay
#include<reg51.h>
void main (void)
{
unsigned int x;
for(; ;) // repeat forever
{
P1=0x55; // 0x indicates data is in hex
for (x=0;x<40,000;x++); //delay size unknown
P1=0xAA;
for (x=0;x<40,000;x++);
}
}
Get a byte of data from P0. If it is less than 100,
send it to P1; otherwise send it to P2
#include<reg51.h>
void main (void)
{
unsigned int mybyte;
P0=0xFF;
for(; ;) // repeat forever
{
mybyte = P0; // 0x indicates data is in hex
if(mybyte<100)
P1=mybyte; //send it to P1 if less than 100
else
P2=mybyte; //send it to P2 if more than 100
}
}