#include #define LEN_BURST 21 // delka burst (pocet vyslanych pulzu) #define LEN_PAUSE_0 21 // delka pauzy pri log. 0 (pocet pulzu, kdy led nesviti) #define LEN_PAUSE_1 63 // delka pauzy pri log. 1 (pocet pulzu, kdy led nesviti) sbit P2_0 = P2^0; /* SFR for P1.0 */ void wait_(){ while (!TF0); TF0 = 0; } void SendPacketNEC(unsigned char a, unsigned char aI, unsigned char c, unsigned char cI){ unsigned char address = a; unsigned char addressI = aI; unsigned char command = c; unsigned char commandI = cI; unsigned char i, j; int k; unsigned char mask = 1; TH0 = 0xE6; TL0 = 0xE6; /* nastaveni timeru na cca 27us xtal = 11.0592e6 / 12 => T = 1,01us chci 27us takze potrebuju 255 - 25 = 230 => TH0 = 0xE6 ..protoze 8.bit citac.. TL0 = 0xE6 */ TR0 = 1; //spusteni citace 1 P2_0 = 0; //radsi zhasnu wait_(); //cekani //HLAVICKA for (k = 0; k < 336; k++){ //336 puluzu burst - 9ms P2_0 = 1; while (TL0 == 237); P2_0 = 0; wait_(); } for (i = 0; i < 168; i++){ //168 puluzu pauza - 4.5ms P2_0 = 0; wait_(); } //PAKET //ADRESS for (i = 0; i < 8; i++){ //pro odeslani celeho paketu for (j = 0; j < LEN_BURST; j++){ //21 puluzu burst P2_0 = 1; //rozsvitim while (TL0 == 237); //cekani - cca 1/4 casu P2_0 = 0; //zhasnu wait_(); } if (address & mask){ // osesílaný bit bude "1" for (j = 0; j < LEN_PAUSE_1; j++){ //63 puluzu pauza P2_0 = 0; wait_(); } }else{ // osesílaný bit bude "0" for (j = 0; j < LEN_PAUSE_0; j++){ //21 puluzu pauza P2_0 = 0; wait_(); } } P2_0 = 0; address >>= 1; } //ADRESS logical inverse for (i = 0; i < 8; i++){ //pro odeslani celeho paketu for (j = 0; j < LEN_BURST; j++){ //21 puluzu burst P2_0 = 1; while (TL0 == 237); P2_0 = 0; wait_(); } if (addressI & mask){ // osesílaný bit bude "1" for (j = 0; j < LEN_PAUSE_1; j++){ //63 puluzu pauza P2_0 = 0; wait_(); } }else{ // osesílaný bit bude "0" for (j = 0; j < LEN_PAUSE_0; j++){ //21 puluzu pauza P2_0 = 0; wait_(); } } P2_0 = 0; addressI >>= 1; } //COMMAND for (i = 0; i < 8; i++){ //pro odeslani celeho paketu for (j = 0; j < LEN_BURST; j++){ //21 puluzu burst P2_0 = 1; while (TL0 == 237); P2_0 = 0; wait_(); } if (command & mask){ // osesílaný bit bude "1" for (j = 0; j < LEN_PAUSE_1; j++){ //63 puluzu pauza P2_0 = 0; wait_(); } }else{ // osesílaný bit bude "0" for (j = 0; j < LEN_PAUSE_0; j++){ //21 puluzu pauza P2_0 = 0; wait_(); } } P2_0 = 0; command >>= 1; } //COMMAND logical inverse for (i = 0; i < 8; i++){ //pro odeslani celeho paketu for (j = 0; j < LEN_BURST; j++){ //21 puluzu burst P2_0 = 1; while (TL0 == 237); P2_0 = 0; wait_(); } if (commandI & mask){ // osesílaný bit bude "1" for (j = 0; j < LEN_PAUSE_1; j++){ //63 puluzu pauza P2_0 = 0; wait_(); } }else{ // osesílaný bit bude "0" for (j = 0; j < LEN_PAUSE_0; j++){ //21 puluzu pauza P2_0 = 0; wait_(); } } P2_0 = 0; commandI >>= 1; } P2_0 = 0; TR0 = 0; } void main(){ unsigned char address = 0x00; unsigned char addressI = 0xBF; unsigned char command = 0x43; unsigned char commandI = 0xBC; P2 = 0; //nastaveni casovacu 0 a 1 do 8bit rezimu TMOD = 0x22; // casovac1 8-bit auto-reload z TH1 PCON = 0x80; // SMOD doubles baud rate TL1 = 0xFD; // 19200 baud rate TH1 = 0xFD; // auto TR1 = 1; // start timer1 SendPacketNEC(address, addressI, command, commandI); while (1){ } }