/* * filename: udp.c * * siteplayer connected to an 8051 www.siteplayer.com * polls keypad, if different from the last one, then send udp to linux * this examples shows keypad, but can be hooked up to door/window * magnetic sensors, in Linux, data are entered to a database (MySQL) * together with date time stamp that can be retrieve and analyze * later on * use bit banging for serial UART 9600 because the 8051 UART is already * being use to send message to a PC. * */ #include \mc\8051reg.h #define LCD *(char*)0x4200 #define CONTROL *(char*)0x0100 #define PORTC *(char*)0x0103 #define KEY *(char*)0x6000; register unsigned char dummy_char, flag, current_key, temp_key, previous_key; main() { CONTROL = 0x0f; /* all port of 8155 output */ putstr("init...\n"); current_key = 0; temp_key = 1; for(;;) { do { current_key = KEY; temp_key = current_key; short_delay(); current_key = KEY; } while (current_key != temp_key); if (current_key != previous_key) { previous_key = current_key; /* save current key */ /* write 'A', current_key, 'B' to siteplayer */ putstr("preparing data starting at address 0...\n"); dummy_char = 0x92; send_serial(); dummy_char = 0x00; /* low byte of address */ send_serial(); dummy_char = 0x00; /* high byte of address */ send_serial(); dummy_char = 0x41; /* 'A' */ send_serial(); dummy_char = current_key; dummy_char &= 0x0f; /* clear upper nibble */ dummy_char += 0x30; /* add hex thirty */ send_serial(); dummy_char = 0x42; /* 'B' */ send_serial(); /* clear area of siteplayer for ack from linux */ putstr("clearing area of siteplayer for linux ack...\n"); dummy_char = 0x92; send_serial(); dummy_char = 0x03; /* low byte of address */ send_serial(); dummy_char = 0x00; /* high byte of address */ send_serial(); dummy_char = 0x00; send_serial(); dummy_char = 0x00; send_serial(); dummy_char = 0x00; send_serial(); /* send udp to linux...\n"); */ putstr("sending udp to linux...\n"); dummy_char = 0x50; send_serial(); short_delay(); /* give linux time */ /* read ack from siteplayer */ dummy_char = 0xC0; /* read byte from siteplayer */ send_serial(); dummy_char = 0x03; /* address */ send_serial(); get_serial(); if (dummy_char == 0x41) putstr("Ack received...\n"); else putstr("Ack not received...\n"); } } } toggle_led() { dummy_char = 0x90; /* send serial command */ send_serial(); dummy_char = 0x14; /* low byte address */ send_serial(); dummy_char = 0xff; /* high byte address */ send_serial(); if (flag == 0) { dummy_char = 0x00; /* turn on led */ send_serial(); flag = 1; } else { dummy_char = 0x01; /* turn off led */ send_serial(); flag = 0; } } send_serial() { asm { PUSH A save accumulator PUSH 0 save R0 PUSH 1 save R1 MOV A,dummy_char putc CLR P1.2 MOV R0,#45 DJNZ R0,* MOV R1,#8 putc1 RRC A MOV P1.2,C MOV R0,#45 DJNZ R0,* DJNZ R1,putc1 SETB P1.2 RRC A MOV R0,#45 DJNZ R0,* POP 1 POP 0 POP A RET } } get_serial() { asm { PUSH A PUSH 0 PUSH 1 getc JB P1.1,* MOV R0,#22 DJNZ R0,* JB P1.1,getc MOV R1,#8 getc1 MOV R0,#45 DJNZ R0,* MOV C,P1.1 RRC A DJNZ R1,getc1 MOV dummy_char,A POP 1 POP 0 POP A RET } } delay() { unsigned int j; for(j=0; j<20000; j++); } short_delay() { unsigned int j; for(j=0; j<300; j++); }