If you're used to dealing with protocols between chips, like UART, SPI and I2C, then APRS will feel quite strange. Whereas if you've been involved with CAN, Ethernet, USB at the low level, then APRS will seem quite familiar.
It's not as simple as 1200Hz means 0, and 2200Hz means 1. There are two things which make it different, firstly bit-stuffing, and secondly NRZI encoding.
For reasons that will become clear in a moment, you're not allowed to transmit more than 5 1s in a row. If you want to transmit more than five 1s in a row, you'll have to stuff extra 0s to break up the string of 1s.
Non-Return to Zero inverted is an alternative way to encode a bit stream. Surprisingly, it's the change from one frequency to the next which encodes 0 and 1. Between each 1/1200th of a second, if the frequency changes, that's a 0, and if it doesn't change, that's a 1.
Take your original bit stream. Imagine turning all the 0s into edges, and all the 1s into not-edges, like this:
Then join up the edges, like this:
The receiver uses the frequency changes to synchronise itself to the incoming bit stream. It needs to do this fairly often to make sure it stays synchronised. This is the reason that a long string of 1s isn't allowed. A long string of 1s means a long time without any frequency changes.
For more information on implementing APRS, there's a good set of blog posts on Hugo's Projects which goes into detail about all of the implementation issues.