As Joby said, you need a toolchain. There are a number of steps which have to happen between the C code you have and loading data onto the device:
- The preprocessor converts #include and #define macros, and also processes any conditional compilation (#if) symbols.
- The compiler converts each .c file into assembly code.
- The assembler converts those into object files. These files use relative addressing.
- The linker puts all the object files together into the series of hex digits in the .hex file, and gives them the addresses required by the device. It also brings in any external object files for which you don't have the source code (or have already compiled it in a previous iteration).
This is generally referred to as a toolchain, but may be informally referred to as a compiler.
You'll also need a way to copy the .hex file onto the microcontroller. The usual way to do this is to use a programmer, though it is often convenient to program the device with a bootloader first, and then use this program to copy the .hex file in.
These are some of the most basic steps of embedded software development. You may find native programming a bit easier if you want a slower learning curve. Also, the AT89C51 (now the AT89S51) uses an older 8051 core, you may find more modern processors like the ATmega, PIC18, or (much more new, but more complex) ARM cores (Cortex-M3/M0, probably) to be more user-friendly and well-supported. Another way to learn embedded development is through the Arduino (AVR) system, but that gets you out of C and into a beginner language.