1 Chapter 7 8051 Programming in C
2 Sections 7.1 Data types and time delay in 8051 C 7.2 I/O programming in 8051 C 7.3 Logic operations in 8051 C 7.4 Data conversion programs in 8051 C 7.5 Accessing code ROM space in 8051 C 7.6 Data serialization using 8051 C
3 Why Program the 8051 in C • It is easier and less time consuming to write in C than Assembly. • C is easier to modify and update. • You can use code available in function libraries. • C code is portable to other microcontrollers with little or no modification.
Sequence for any code 4
1. if statement (selection) Structure 5
6 2. switch statement (selection) Structure
3. while Looping (Repetition) Structure 7
4. for Looping (Repetition) Structure 8
9 Translation between C and Assembly • A loop in Assembly MOV R2,#255 ABC:MOV P1,R2 DJNZ R2,ABC • A for-loop in C for (int z=255; z>0; z--) P1=z;
10 Section 7.1 Data Types and Time Delay in 8051 C
11 Re-examine C Data Type • Understanding the data types of C can help programmers to write an efficient code. • We will focus on (See Table7-1) – unsigned char, signed char – unsigned int, signed int, – Single bit: sbit (sfr) , bit (bit-addressable RAM) – Special function register: sfr • C compiler will allocate a RAM space for your variables (char, int & bit).
12 Table 7-1. Some Widely Used Data Types for 8051 C
13 Unsigned Char • The most widely used data types for the 8051 • 8-bit data type • The range of unsigned char: 0-255 (00-FFH) • When do you use unsigned char? – To set counter value (Example 7-1) – The string of ASCII character (Example 7-2) – For toggling ports (Example 7-3)
14 Signed Char • 8-bit data type • 2’s complement representation • The range of unsigned char: -128:+127 (00-FFH) • When do you use signed char? – To present a given quantity such as temperature
15 Example 7-1 (unsigned char) Write an 8051 C program to send values 00-FF to port P1. Solution: #include <reg51.h> void main(void) { unsigned char z; for (z=0; z<=255; z++) P1=z; }
16 Example 7-2 (unsigned char) Write an 8051 C program to send hex values for ASCII characters of 0,1,2,3,4,5,A,B,C, and D to port P1. Solution: #include <reg51.h> void main(void){ unsigned char mynum[]=“012345ABCD”; unsigned char z; for (z=0; z<10; z++) P1=mynum[z]; } Note: “012345ABCD” is stored in RAM and can be changed.
17 Example 7-3 (unsigned char) Write an 8051 C program to toggle all the bits of P1 continuously. Solution: #include <reg51.h> void main(void) { for ( ; ; ) { //repeat forever P1=0x55; //0x: in hex (binary) P1=0xAA; } }
18 Example 7-4 (signed char) Write an 8051 C program to send values of -4 to 4 to port P1. Solution: #include <reg51.h> void main(void) { char mynum[]={+1,-1,+2,-2,+3,-3,+4,-4}; unsigned char z; for (z=0; z<8; z++) P1=mynum[z]; }
19 Integer • 16-bit data type – The range of unsigned int: 0-65535 – The range of signed int: -32,768-32,767 • Since the 8051 is an 8-bit microcontroller and the int data type takes two bytes of RAM, we must not used the int data type unless we have to. • You should try to use unsigned char instead on int.
20 Example 7-5 (unsigned int, sbit) Write an 8051 C program to toggle bit D0 of P1 50,000 times. Solution: #include <reg51.h> sbit MYBIT=P1^0; void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=0; MYBIT=1; } }
21 Time Delay • Three factors that can affect the accuracy of the time delay: – Crystal frequency of 8051 system – 8051 machine cycle timing – Compiler used for 8051 C
22 Example 7-6 (time delay) Write an 8051 C program to toggle bits of P1 continuously forever with some delay. Solution: #include <reg51.h> void main(void) { unsigned int x; for (;;) { P1=0x55; for (x=0;x<40000;x++); //time delay P1=0xAA; for (x=0;x<40000;x++); }}
23 Example 7-7 (1/2) Write an 8051 C program to toggle bits of P1 continuously with a 250 ms delay. Solution: #include <reg51.h> void MSDelay(unsigned int); void main(void) { while(1) { //repeat forever P1=0x55; MSDelay(250); //time delay P1=0xAA; MSDelay(250) }} Assume the program is tested for the DS89C420 with XTML=11.0592MHz. 90ns X 1275 = 114750ns = 1ms void MSDelay(unsigned int itime) { unsigned int i,j; for (i=0; i<itime; i++) for (j=0; j<1275; j++); // 1ms delay}
24 Section 7.2 I/O programming in 8051 C • Way to access SFR and single bit of SFR • Access Bit-addressable RAM
25 Access SFR • Way to access SFR Use name of SFR and reg51.h #include <reg51.h> P1=0x55; //P1=55H • reg51. h is necessary. • See Example 7-1. 2. Use the sfr data type and declare by yourself sfr P1 = 0x90; P1=0x55; //P1=55H • reg51. h is not necessary.
8051 256Byte RAM 26
8015 256Byte RAM 27
28 Access SFR • Way to access SFR 1. Use name of SFR and reg51.h #include <reg51.h> P1=0x55; //P1=55H • reg51. h is necessary. • See Example 7-1. 2. Use the sfr data type and declare by yourself sfr P1 = 0x90; P1=0x55; //P1=55H • reg51. h is not necessary.
29 Example 7-16 Use the sfr data type andeclare by yourself Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): sfr P0 = 0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } }
30 Example 7-16 Use name of SFR and reg51.h Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } } sfr P0 = 0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself
31 Example 7-16 Use name of SFR and reg51.h Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } } #include <reg51.h>
32 sfr P0 = 0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself #include <reg51.h>?
33
34 Access Single Bit of SFR • Way to access a single bit of SFR – Use sbit and name of SFR #include <reg51.h> sbit MYBIT = P1^5; //D5 of P1 • See Example 7-5. – Use sbit to declare the bit of SFR and declare by yourself sbit MYBIT = 0x95; //D5 of P1 • reg51. h is not necessary. • See Example 7-17.
35 Example 7-17 (sbit) Write an 8051 C program to turn bit P1.5 on and off 50,000 times. Solution (a): void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=1; MYBIT=0; } } This program is similar to Example 7-5. sbit MYBIT = 0x95; // P1^5
36 Example 7-17 (sbit) Write an 8051 C program to turn bit P1.5 on and off 50,000 times. Solution (a): void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=1; MYBIT=0; } } This program is similar to Example 7-5. #include <reg51.h> sbit MYBIT=P1^0; sbit MYBIT = 0x95; // P1^5
37 Access Bit-addressable RAM • You can use bit to access one bit of bit- addressable section of the data RAM space 20H-2FH. #include <reg51.h> sbit inbit = P1^0; bit membit; //C compiler assign a RAM space for mybit membit = inbit; //Read P1^0 to RAM • See Example 7-18.
38 Example 7-18 (bit) Write an 8051 C program to get the status of bit P1.0, save it, and send it to P2.7 continuously. Solution: #include <reg51.h> sbit inbit = P1^0; sbit outbit = P2^7; bit membit; void main(void) { while(1) { //repeat forever membit = inbit; outbit = membit }}
39 Section 7.3 Logic operations in 8051 C
40 Bit-wise Operations in C • AND & 0x35 & 0x0F = 0x05 • OR | 0x04 | 0x68 = 0x6C • Exclusive-OR ^ 0x54 ^ 0x78 = 0x2C • Inverter ~ ~0x55 = 0xAA 0011 0101 AND 0000 1111 0000 0101 0000 0100 OR 0110 1000 0110 1100 0101 0100 XOR 0111 1000 0010 1100NOT 0101 0101 0000 0101
41 Bit-wise Shift Operation in C • Shift Right >> 0x9A >> 3 = 0x13 shift right 3 times 0x77 >> 4 = 0x07 shift right 4 times • Shift Left << 0x96 << 4 = 0x60 shift left 4 times 1001 1010  0001 0011 0111 0111  0000 0111 1001 0110  0110 0000
42 Table 7-3. Bit-wise Logic Operations for C
43 Example 7-19 Run the following program on your simulator and examine the results. Solution: #include <reg51.h> void main(void) { P0=0x35 & 0x0F; P0=0x04 | 0x68; P0=0x54 ^ 0x78; P0=~0x35; P0=0x9A >> 3; P0=0x77 >> 4; P0=0x96 << 4; }
44 Section 7.4 Data conversion programs in 8051 C
45 Data Conversion • Packed BCD to ASCII conversion – See Example 7-24 • ASCII to packed BCD conversion – See Example 7-25 • Checksum byte in ROM – See Example 7-26, 27, 28 (using +) • Binary to decimal and ASCII conversion in C – See Example 7-29( using /, %)
46 Table 7-4. ASCII Code for Digits 0-9
Packed BCD to ASCII conversion Example 7-24 Write an 8051 C program to convert packed BCD 0x29 to ASCII and display the bytes on P1 and P2. Solution: #include <reg51.h> void main(void) {unsigned char x,y,z; unsigned char mybyte=0x29; x=mybyte&0x0F; P1=x|0x30; y=mybyte&0xF0; y=y>>4; P2=y|0x30;} 47
ASCII to packed BCD conversion See Example 7-25 Write an 8051 C program to convert ASCII digits of ‘4’ and ‘7’ to packed BCD and display them on P1. Solution: #include <reg51.h> void main(void) { unsigned char bcdbyte; unsigned char w=‘4’; unsigned char z=‘7’; w=w&0x0F; w=w<<4; z=z&0x0F; bcdbyte=w|z; P1=bcdbyte;} 48
Binary to decimal and ASCII conversion in C See Example 7-29( using /, %) Write an 8051 C program to convert 11111101 (FD hex) to decimaland display the digits on P0, P1 and P2. Solution: #include <reg51.h> void main(void){ unsigned char x,binbyte,d1,d2,d3; binbyte=0xFD; x=binbyte/10; d1=binbyte%10; d2=x%10; d3=x/10; P0=d1; P1=d2; P2=d3;} 49
50 Section 7.5 Accessing code ROM space in 8051 C
51 To Store Data • We have three spaces to store data: 1. the 128 bytes RAM space with address range 00-7FH • If you declare variables (ex: char) to store data, C compiler will allocate a RAM space for these variable. 2. Use code space • External code memory (64K) + on-chip ROM (64K) • Data is embedded to code or is separated as a data section 3. External data memory for data • RAM or ROM • see Chapter 14
52 Data Stored in RAM • Where are the variables assigned by C compiler? • 8051 C compiler allocates RAM locations for variables in the following order: – Bank 0: addresses 0-7 – Individual variables: addresses 08H and beyond – Array elements: addresses right after variables • Array size is limited in 128 bytes RAM. – Stack: address right after array elements • Check your simulation tool
53 8052 RAM Space • 8052 has 256 bytes RAM. • Based on 8052 architecture, you should – Use the reg52.h header file. – Choose the 8052 option when compiling the program.
54 Using ROM to Store Data • To make C compiler use the code space (on-chip ROM) instead of RAM space, we can put the keyword “code” in front of the variable declaration. unsigned char mydata[] = “HELLO” • HELLO is saved in RAM. code unsigned char mydata[] = “HELLO” • HELLO is saved in ROM. • See Example 7-33
55 Example 7-33 (1/3) Compare and contrast the following programs and discuss the advantages and disadvantages of each one. Solution (a): #include <reg51.h> void main(void) { P1=“H”; P1=“E”; P1=“L”; P1=“L”; P1=“O”; } Data is embedded into code. Simple, short, not flexible.
56 Example 7-33 (2/3) Solution (b): #include <reg51.h> void main(void) { unsigned char mydata[]=“HELLO”; unsigned char z; for (z=0; z<5; z++) P1 = mydata[z]; } Data is stored in RAM and does not occupied ROM.
57 Example 7-33 (3/3) Solution (c): #include <reg51.h> void main(void) { code unsigned char mydata[]=“HELLO”; unsigned char z; for (z=0; z<5; z++) P1 = mydata[z]; } Data is stored in ROM. However, data and code are separate.
58 Section 7.6 Data serialization using 8051 C
59 Serializing Data • Two ways to transfer a byte of data: 1. Using the serial port. • For PC. See Chapter 10. 2. To transfer data one bit a time and control the sequence of data and spaces in between them. • For LCD, ADC, ROM • Example 7-34
60 Example 7-34 Write a C program to send out the value 44H serially one bit at a time via P1.0. The LSB should go out first. Solution: #include <reg51.h> sbit P1b0 = P1^0; sbit regALSB = ACC^0; void main(void) { unsigned char conbyte = 0x44; unsigned char x; ACC = conbyte; for (x=0; x<8; x++) { P1b0 = regALSB; ACC = ACC >> 1; } } ACC P1.0 D7 D0
61 Thank you

Chapter 7 8051 programming in c

  • 1.
  • 2.
    2 Sections 7.1 Data typesand time delay in 8051 C 7.2 I/O programming in 8051 C 7.3 Logic operations in 8051 C 7.4 Data conversion programs in 8051 C 7.5 Accessing code ROM space in 8051 C 7.6 Data serialization using 8051 C
  • 3.
    3 Why Program the8051 in C • It is easier and less time consuming to write in C than Assembly. • C is easier to modify and update. • You can use code available in function libraries. • C code is portable to other microcontrollers with little or no modification.
  • 4.
  • 5.
    1. if statement(selection) Structure 5
  • 6.
    6 2. switch statement(selection) Structure
  • 7.
    3. while Looping(Repetition) Structure 7
  • 8.
    4. for Looping(Repetition) Structure 8
  • 9.
    9 Translation between Cand Assembly • A loop in Assembly MOV R2,#255 ABC:MOV P1,R2 DJNZ R2,ABC • A for-loop in C for (int z=255; z>0; z--) P1=z;
  • 10.
    10 Section 7.1 Data Typesand Time Delay in 8051 C
  • 11.
    11 Re-examine C DataType • Understanding the data types of C can help programmers to write an efficient code. • We will focus on (See Table7-1) – unsigned char, signed char – unsigned int, signed int, – Single bit: sbit (sfr) , bit (bit-addressable RAM) – Special function register: sfr • C compiler will allocate a RAM space for your variables (char, int & bit).
  • 12.
    12 Table 7-1. SomeWidely Used Data Types for 8051 C
  • 13.
    13 Unsigned Char • Themost widely used data types for the 8051 • 8-bit data type • The range of unsigned char: 0-255 (00-FFH) • When do you use unsigned char? – To set counter value (Example 7-1) – The string of ASCII character (Example 7-2) – For toggling ports (Example 7-3)
  • 14.
    14 Signed Char • 8-bitdata type • 2’s complement representation • The range of unsigned char: -128:+127 (00-FFH) • When do you use signed char? – To present a given quantity such as temperature
  • 15.
    15 Example 7-1 (unsignedchar) Write an 8051 C program to send values 00-FF to port P1. Solution: #include <reg51.h> void main(void) { unsigned char z; for (z=0; z<=255; z++) P1=z; }
  • 16.
    16 Example 7-2 (unsignedchar) Write an 8051 C program to send hex values for ASCII characters of 0,1,2,3,4,5,A,B,C, and D to port P1. Solution: #include <reg51.h> void main(void){ unsigned char mynum[]=“012345ABCD”; unsigned char z; for (z=0; z<10; z++) P1=mynum[z]; } Note: “012345ABCD” is stored in RAM and can be changed.
  • 17.
    17 Example 7-3 (unsignedchar) Write an 8051 C program to toggle all the bits of P1 continuously. Solution: #include <reg51.h> void main(void) { for ( ; ; ) { //repeat forever P1=0x55; //0x: in hex (binary) P1=0xAA; } }
  • 18.
    18 Example 7-4 (signedchar) Write an 8051 C program to send values of -4 to 4 to port P1. Solution: #include <reg51.h> void main(void) { char mynum[]={+1,-1,+2,-2,+3,-3,+4,-4}; unsigned char z; for (z=0; z<8; z++) P1=mynum[z]; }
  • 19.
    19 Integer • 16-bit datatype – The range of unsigned int: 0-65535 – The range of signed int: -32,768-32,767 • Since the 8051 is an 8-bit microcontroller and the int data type takes two bytes of RAM, we must not used the int data type unless we have to. • You should try to use unsigned char instead on int.
  • 20.
    20 Example 7-5 (unsignedint, sbit) Write an 8051 C program to toggle bit D0 of P1 50,000 times. Solution: #include <reg51.h> sbit MYBIT=P1^0; void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=0; MYBIT=1; } }
  • 21.
    21 Time Delay • Threefactors that can affect the accuracy of the time delay: – Crystal frequency of 8051 system – 8051 machine cycle timing – Compiler used for 8051 C
  • 22.
    22 Example 7-6 (timedelay) Write an 8051 C program to toggle bits of P1 continuously forever with some delay. Solution: #include <reg51.h> void main(void) { unsigned int x; for (;;) { P1=0x55; for (x=0;x<40000;x++); //time delay P1=0xAA; for (x=0;x<40000;x++); }}
  • 23.
    23 Example 7-7 (1/2) Writean 8051 C program to toggle bits of P1 continuously with a 250 ms delay. Solution: #include <reg51.h> void MSDelay(unsigned int); void main(void) { while(1) { //repeat forever P1=0x55; MSDelay(250); //time delay P1=0xAA; MSDelay(250) }} Assume the program is tested for the DS89C420 with XTML=11.0592MHz. 90ns X 1275 = 114750ns = 1ms void MSDelay(unsigned int itime) { unsigned int i,j; for (i=0; i<itime; i++) for (j=0; j<1275; j++); // 1ms delay}
  • 24.
    24 Section 7.2 I/O programmingin 8051 C • Way to access SFR and single bit of SFR • Access Bit-addressable RAM
  • 25.
    25 Access SFR • Wayto access SFR Use name of SFR and reg51.h #include <reg51.h> P1=0x55; //P1=55H • reg51. h is necessary. • See Example 7-1. 2. Use the sfr data type and declare by yourself sfr P1 = 0x90; P1=0x55; //P1=55H • reg51. h is not necessary.
  • 26.
  • 27.
  • 28.
    28 Access SFR • Wayto access SFR 1. Use name of SFR and reg51.h #include <reg51.h> P1=0x55; //P1=55H • reg51. h is necessary. • See Example 7-1. 2. Use the sfr data type and declare by yourself sfr P1 = 0x90; P1=0x55; //P1=55H • reg51. h is not necessary.
  • 29.
    29 Example 7-16 Usethe sfr data type andeclare by yourself Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): sfr P0 = 0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } }
  • 30.
    30 Example 7-16 Usename of SFR and reg51.h Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } } sfr P0 = 0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself
  • 31.
    31 Example 7-16 Usename of SFR and reg51.h Write an 8051 C program to toggle all the bit of P0, P1 and P2 continuously with a 250 ms time dealy. Solution (a): void MSDelay(unsigned int); // MSDelay is as same as one in // Example7-1. Ignored it here. void main(void) { unsigned int z; while(1) { //repeat forever P0=0x55; P1=0x55; P2=0x55; MSDelay(250); //time delay P0=0xAA; P1=0xAA; P2=0xAA; MSDelay(250); //time delay } } #include <reg51.h>
  • 32.
    32 sfr P0 =0x80; // declare by yourself sfr P1 = 0x90; // declare by yourself sfr P2 = 0xA0; // declare by yourself #include <reg51.h>?
  • 33.
  • 34.
    34 Access Single Bitof SFR • Way to access a single bit of SFR – Use sbit and name of SFR #include <reg51.h> sbit MYBIT = P1^5; //D5 of P1 • See Example 7-5. – Use sbit to declare the bit of SFR and declare by yourself sbit MYBIT = 0x95; //D5 of P1 • reg51. h is not necessary. • See Example 7-17.
  • 35.
    35 Example 7-17 (sbit) Writean 8051 C program to turn bit P1.5 on and off 50,000 times. Solution (a): void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=1; MYBIT=0; } } This program is similar to Example 7-5. sbit MYBIT = 0x95; // P1^5
  • 36.
    36 Example 7-17 (sbit) Writean 8051 C program to turn bit P1.5 on and off 50,000 times. Solution (a): void main(void) { unsigned int z; for (z=0;z<50000;z++) { MYBIT=1; MYBIT=0; } } This program is similar to Example 7-5. #include <reg51.h> sbit MYBIT=P1^0; sbit MYBIT = 0x95; // P1^5
  • 37.
    37 Access Bit-addressable RAM •You can use bit to access one bit of bit- addressable section of the data RAM space 20H-2FH. #include <reg51.h> sbit inbit = P1^0; bit membit; //C compiler assign a RAM space for mybit membit = inbit; //Read P1^0 to RAM • See Example 7-18.
  • 38.
    38 Example 7-18 (bit) Writean 8051 C program to get the status of bit P1.0, save it, and send it to P2.7 continuously. Solution: #include <reg51.h> sbit inbit = P1^0; sbit outbit = P2^7; bit membit; void main(void) { while(1) { //repeat forever membit = inbit; outbit = membit }}
  • 39.
  • 40.
    40 Bit-wise Operations inC • AND & 0x35 & 0x0F = 0x05 • OR | 0x04 | 0x68 = 0x6C • Exclusive-OR ^ 0x54 ^ 0x78 = 0x2C • Inverter ~ ~0x55 = 0xAA 0011 0101 AND 0000 1111 0000 0101 0000 0100 OR 0110 1000 0110 1100 0101 0100 XOR 0111 1000 0010 1100NOT 0101 0101 0000 0101
  • 41.
    41 Bit-wise Shift Operationin C • Shift Right >> 0x9A >> 3 = 0x13 shift right 3 times 0x77 >> 4 = 0x07 shift right 4 times • Shift Left << 0x96 << 4 = 0x60 shift left 4 times 1001 1010  0001 0011 0111 0111  0000 0111 1001 0110  0110 0000
  • 42.
    42 Table 7-3. Bit-wiseLogic Operations for C
  • 43.
    43 Example 7-19 Run thefollowing program on your simulator and examine the results. Solution: #include <reg51.h> void main(void) { P0=0x35 & 0x0F; P0=0x04 | 0x68; P0=0x54 ^ 0x78; P0=~0x35; P0=0x9A >> 3; P0=0x77 >> 4; P0=0x96 << 4; }
  • 44.
  • 45.
    45 Data Conversion • PackedBCD to ASCII conversion – See Example 7-24 • ASCII to packed BCD conversion – See Example 7-25 • Checksum byte in ROM – See Example 7-26, 27, 28 (using +) • Binary to decimal and ASCII conversion in C – See Example 7-29( using /, %)
  • 46.
    46 Table 7-4. ASCIICode for Digits 0-9
  • 47.
    Packed BCD toASCII conversion Example 7-24 Write an 8051 C program to convert packed BCD 0x29 to ASCII and display the bytes on P1 and P2. Solution: #include <reg51.h> void main(void) {unsigned char x,y,z; unsigned char mybyte=0x29; x=mybyte&0x0F; P1=x|0x30; y=mybyte&0xF0; y=y>>4; P2=y|0x30;} 47
  • 48.
    ASCII to packedBCD conversion See Example 7-25 Write an 8051 C program to convert ASCII digits of ‘4’ and ‘7’ to packed BCD and display them on P1. Solution: #include <reg51.h> void main(void) { unsigned char bcdbyte; unsigned char w=‘4’; unsigned char z=‘7’; w=w&0x0F; w=w<<4; z=z&0x0F; bcdbyte=w|z; P1=bcdbyte;} 48
  • 49.
    Binary to decimaland ASCII conversion in C See Example 7-29( using /, %) Write an 8051 C program to convert 11111101 (FD hex) to decimaland display the digits on P0, P1 and P2. Solution: #include <reg51.h> void main(void){ unsigned char x,binbyte,d1,d2,d3; binbyte=0xFD; x=binbyte/10; d1=binbyte%10; d2=x%10; d3=x/10; P0=d1; P1=d2; P2=d3;} 49
  • 50.
    50 Section 7.5 Accessing codeROM space in 8051 C
  • 51.
    51 To Store Data •We have three spaces to store data: 1. the 128 bytes RAM space with address range 00-7FH • If you declare variables (ex: char) to store data, C compiler will allocate a RAM space for these variable. 2. Use code space • External code memory (64K) + on-chip ROM (64K) • Data is embedded to code or is separated as a data section 3. External data memory for data • RAM or ROM • see Chapter 14
  • 52.
    52 Data Stored inRAM • Where are the variables assigned by C compiler? • 8051 C compiler allocates RAM locations for variables in the following order: – Bank 0: addresses 0-7 – Individual variables: addresses 08H and beyond – Array elements: addresses right after variables • Array size is limited in 128 bytes RAM. – Stack: address right after array elements • Check your simulation tool
  • 53.
    53 8052 RAM Space •8052 has 256 bytes RAM. • Based on 8052 architecture, you should – Use the reg52.h header file. – Choose the 8052 option when compiling the program.
  • 54.
    54 Using ROM toStore Data • To make C compiler use the code space (on-chip ROM) instead of RAM space, we can put the keyword “code” in front of the variable declaration. unsigned char mydata[] = “HELLO” • HELLO is saved in RAM. code unsigned char mydata[] = “HELLO” • HELLO is saved in ROM. • See Example 7-33
  • 55.
    55 Example 7-33 (1/3) Compareand contrast the following programs and discuss the advantages and disadvantages of each one. Solution (a): #include <reg51.h> void main(void) { P1=“H”; P1=“E”; P1=“L”; P1=“L”; P1=“O”; } Data is embedded into code. Simple, short, not flexible.
  • 56.
    56 Example 7-33 (2/3) Solution(b): #include <reg51.h> void main(void) { unsigned char mydata[]=“HELLO”; unsigned char z; for (z=0; z<5; z++) P1 = mydata[z]; } Data is stored in RAM and does not occupied ROM.
  • 57.
    57 Example 7-33 (3/3) Solution(c): #include <reg51.h> void main(void) { code unsigned char mydata[]=“HELLO”; unsigned char z; for (z=0; z<5; z++) P1 = mydata[z]; } Data is stored in ROM. However, data and code are separate.
  • 58.
  • 59.
    59 Serializing Data • Twoways to transfer a byte of data: 1. Using the serial port. • For PC. See Chapter 10. 2. To transfer data one bit a time and control the sequence of data and spaces in between them. • For LCD, ADC, ROM • Example 7-34
  • 60.
    60 Example 7-34 Write aC program to send out the value 44H serially one bit at a time via P1.0. The LSB should go out first. Solution: #include <reg51.h> sbit P1b0 = P1^0; sbit regALSB = ACC^0; void main(void) { unsigned char conbyte = 0x44; unsigned char x; ACC = conbyte; for (x=0; x<8; x++) { P1b0 = regALSB; ACC = ACC >> 1; } } ACC P1.0 D7 D0
  • 61.