📄 beacon.i
字号:
#line 183 "D:\KEIL\C51\INC\PHILIPS\REG922.H" /0 #line 2 "wr_flash.h" /0 extern bit FLASH_WriteNByte(unsigned int addr, unsigned char *dat_buf, unsigned char no); extern void FLASH_ReadNByte(unsigned int addr, unsigned char *dat_buf, unsigned char no); bit FLASH_WriteByte(unsigned int addr, unsigned int dat); #line 10 "beacon.c" /0 extern code unsigned char METER_ADDR[6]; unsigned char code reg_setting[2]; unsigned char tm1_count, count1_reload; unsigned char inter1; void (*beacon_timer_proc)(); idata unsigned char beacon_timer_count; idata unsigned char beacon_timer_val; bit beacon_timer_enable; void (*beacon_rx_timer_proc)(); idata unsigned char beacon_rx_timer_count; idata unsigned char beacon_rx_timer_val; bit beacon_rx_timer_enable; void delay(unsigned int cnt); extern idata unsigned char plc_frame[18]; idata char beacon_frame_count,beacon_rx_frame_count; code struct link_status link_status_1[15]; extern idata unsigned char thres_ea; void plc_tx_beacon(); void beacon_time_out(); void enable_beacon_timer(); void disable_beacon_timer(void); void beacon_rx_time_out(); void enable_beacon_rx_timer(); void disable_beacon_rx_timer(void); void write_table(unsigned char i, unsigned char add_R, unsigned char add_L, unsigned char ave_ea, unsigned char ave_eb,unsigned char succ_rate); void send_beacon() { unsigned char i, k; setup_beacon_timer(100, beacon_time_out); beacon_frame_count = 0; enable_beacon_timer(); while(beacon_frame_count < 10){;} disable_beacon_timer(); while(1) { for (k=1; k<=5; k++) { delay (50000); delay (50000); for (i=1; i<=100; i++) { Rxok = 0; delay (i*100); Rxok = 1; delay (10100-i*100); } for (i=1; i<=50; i++) { Rxok = 0; delay (10200-i*200); Rxok = 1; delay (i*200); } } } } void delay (unsigned int cnt) { while (--cnt); } void beacon_time_out() { disable_beacon_timer(); plc_tx_beacon(); beacon_frame_count++; enable_beacon_timer(); } void enable_beacon_timer(void) { beacon_timer_count = 0; beacon_timer_enable = 1; } void disable_beacon_timer(void) { beacon_timer_count = 0; beacon_timer_enable = 0; } void plc_tx_beacon(void) { unsigned char i; unsigned char self_address_R,self_address_L; self_address_R = METER_ADDR[0]; self_address_L = METER_ADDR[1]; plc_frame[0] = self_address_R; plc_frame[1] = self_address_L; plc_frame[2] = self_address_R; plc_frame[3] = self_address_L; plc_frame[4] = 0xcc; plc_frame[5] = 0xBC; plc_frame[6] = beacon_frame_count; for(i=7;i<18;i++) {plc_frame[i] = 0xBC;} sync_sendchar(0x7F); send_block(plc_frame, 18); send(); while (TX_BUSY == 0); } void beacon_rx_process() { unsigned char local_address_R, local_address_L; unsigned char average_ea , average_eb; unsigned char i,j,min_ea, wr_ea_index; bit flag_first_frame; unsigned char success_received_frame; local_address_R = METER_ADDR[0]; local_address_L = METER_ADDR[1]; average_ea = 0; average_eb = 0; beacon_rx_frame_count = 0; setup_beacon_rx_timer(230, beacon_rx_time_out); disable_beacon_rx_timer(); uart_sendchar(0XFF); uart_sendchar(0XFF); uart_sendchar(0XFF); uart_sendchar(0XFF); for(i=0;i<15;i++) { uart_sendchar(link_status_1[i].address_R); uart_sendchar(link_status_1[i].address_L); uart_sendchar(link_status_1[i].average_ea); uart_sendchar(link_status_1[i].average_eb); uart_sendchar(link_status_1[i].success_rate); } uart_sendchar(reg_setting[0]); uart_sendchar(reg_setting[1]); while(1) { if (plc_recved()) { plc_getframe(plc_frame); if(!read_crc()) { RXOK = 0; if ((plc_frame[0]==plc_frame[2])&&(plc_frame[1]==plc_frame[3])&& (plc_frame[4]==0xcc)) { disable_beacon_rx_timer(); if(flag_first_frame == 0) { average_ea = read_reg(0XEA); average_eb = read_reg(0xEB); flag_first_frame = 1; } else { average_ea = (average_ea + read_reg(0XEA))>>1; average_eb = (average_eb + read_reg(0xEB))>>1; } success_received_frame++; beacon_rx_frame_count = plc_frame[6]; uart_sendchar(0x99); for(i=0;i<18;i++) { uart_sendchar(plc_frame[i]); } uart_sendchar(average_ea); uart_sendchar(average_eb); uart_sendchar(success_received_frame); if (beacon_rx_frame_count!= 10-1) { enable_beacon_rx_timer(); } } if ((plc_frame[0]==0x00)&&(plc_frame[1]==0x00)&&(plc_frame[2]==local_address_R)&&(plc_frame[3]==local_address_L)&&(plc_frame[4]==0xFF)) { send_table(); } if ((plc_frame[0]==0x00)&&(plc_frame[1]==0x00)&&(plc_frame[2]==local_address_R)&&(plc_frame[3]==local_address_L)&&(plc_frame[4]==0xC0)) { clear_table(); plc_frame[0] = local_address_R; plc_frame[1] = local_address_L; plc_frame[2] = 0x00; plc_frame[3] = 0x00; plc_frame[4] = 0xC1; sync_sendchar(0x7F); send_block(plc_frame, 18); send(); while (TX_BUSY == 0); } if ((plc_frame[0]==0x00)&&(plc_frame[1]==0x00)&&(plc_frame[2]==local_address_R)&&(plc_frame[3]==local_address_L)&&(plc_frame[4]==0xc2)&&(plc_frame[8]==0xc2)&&(plc_frame[12]==0xc2)) { if((plc_frame[5]==plc_frame[9])&&(plc_frame[5]==plc_frame[13])&&(plc_frame[6]==plc_frame[10])&&(plc_frame[6]==plc_frame[14])) { EA = 0; FLASH_WriteByte((int code *)®_setting[0], plc_frame[5]); FLASH_WriteByte((int code *)®_setting[1], plc_frame[6]); EA = 1; plc_frame[0] = local_address_R; plc_frame[1] = local_address_L; plc_frame[2] = 0x00; plc_frame[3] = 0x00; plc_frame[4] = 0xC3; plc_frame[8] = 0xC3; plc_frame[12] = 0xC3; for(i=0;i<250;i++) for(j=0;j<250;j++); sync_sendchar(0x7F); send_block(plc_frame, 18); send(); while (TX_BUSY == 0); } else { plc_frame[0] = local_address_R; plc_frame[1] = local_address_L; plc_frame[2] = 0x00; plc_frame[3] = 0x00; plc_frame[4] = 0xC4; plc_frame[8] = 0xC4; plc_frame[12] = 0xC4; for(i=0;i<250;i++) for(j=0;j<250;j++); sync_sendchar(0x7F); send_block(plc_frame, 18); send(); while (TX_BUSY == 0); } uart_sendblock(plc_frame,18); } RXOK = 1; } } if (beacon_rx_frame_count == 10-1) { disable_beacon_rx_timer(); min_ea = 200; for(i=0;i<15;i++) { if(min_ea > link_status_1[i].average_ea) { min_ea = link_status_1[i].average_ea; wr_ea_index = i; } if(min_ea==0) break; } uart_sendchar(min_ea); uart_sendchar(wr_ea_index); if(average_ea > min_ea) { for(i=0;i<15;i++) { if((plc_frame[0]==link_status_1[i].address_R)&&(plc_frame[1]==link_status_1[i].address_L)) { wr_ea_index = i; } } EA = 0; write_table(wr_ea_index, plc_frame[0], plc_frame[1], average_ea, average_eb,success_received_frame); EA = 1; } average_ea = 0; average_eb = 0; beacon_rx_frame_count = 0; success_received_frame = 0; flag_first_frame = 0; } } } void beacon_rx_time_out() { disable_beacon_rx_timer(); beacon_rx_frame_count++; enable_beacon_rx_timer(); } void enable_beacon_rx_timer(void) { beacon_rx_timer_count = 0; beacon_rx_timer_enable = 1; } void disable_beacon_rx_timer(void) { beacon_rx_timer_count = 0; beacon_rx_timer_enable = 0; } void write_table(unsigned char i, unsigned char add_R, unsigned char add_L, unsigned char ave_ea, unsigned char ave_eb,unsigned char succ_rate) { EA = 0; FLASH_WriteByte((int code *)&link_status_1[i].address_R, add_R); FLASH_WriteByte((int code *)&link_status_1[i].address_L, add_L); FLASH_WriteByte((int code *)&link_status_1[i].average_ea, ave_ea); FLASH_WriteByte((int code *)&link_status_1[i].average_eb, ave_eb); FLASH_WriteByte((int code *)&link_status_1[i].success_rate, succ_rate); EA = 1; uart_sendchar(0xEE); uart_sendchar(0xEE); uart_sendchar(0xEE); uart_sendchar(0xEE); uart_sendchar(link_status_1[i].address_R); uart_sendchar(link_status_1[i].address_L); uart_sendchar(link_status_1[i].average_ea); uart_sendchar(link_status_1[i].average_eb); uart_sendchar(link_status_1[i].success_rate); } void timer1_init(unsigned char interval, unsigned char count) { TMOD = (TMOD & 0x0F) | 0x10; TAMOD = 0x00; TH1 = interval; TL1 = 0; inter1=TH1; EX1 = 1; IT1 = 1; ET1 = 1; TR1 = 1; EA = 1; count1_reload = count; tm1_count = count; beacon_timer_enable = 0; beacon_rx_timer_enable = 0; } void timer1_ISR (void) interrupt 3 { TH1 = inter1; TL1 = 0; if (tm1_count-- == 0) { tm1_count = count1_reload; if (beacon_timer_enable == 1) { beacon_timer_count++; if (beacon_timer_count == beacon_timer_val) { beacon_timer_count = 0; beacon_timer_proc(); } } if (beacon_rx_timer_enable == 1) { beacon_rx_timer_count++; if (beacon_rx_timer_count == beacon_rx_timer_val) { beacon_rx_timer_count = 0; beacon_rx_timer_proc(); } } } } void setup_beacon_timer(unsigned char t, void (*proc)()) { beacon_timer_val = t; beacon_timer_proc = proc; beacon_timer_count = 0; beacon_timer_enable = 1; } void setup_beacon_rx_timer(unsigned char t, void (*proc)()) { beacon_rx_timer_val = t; beacon_rx_timer_proc = proc; beacon_rx_timer_count = 0; beacon_rx_timer_enable = 1; } void send_table_frame() { unsigned int i,j; uart_sendchar(0x77); for(i=0;i<18;i++) uart_sendchar(plc_frame[i]); sync_sendchar(0x7F); send_block(plc_frame, 18); send(); while(TX_BUSY == 0); RXOK = 0; for(i=0;i<350;i++) for(j=0;j<500;j++); RXOK = 1; RXOK = 0; for(i=0;i<350;i++) for(j=0;j<500;j++); RXOK = 1; } void send_table() { unsigned char local_address_R, local_address_L, i, j; local_address_R = METER_ADDR[0]; local_address_L = METER_ADDR[1]; plc_frame[0]=local_address_R; plc_frame[1]=local_address_L; plc_frame[2]=0x00; plc_frame[3]=0x00; plc_frame[4]=0xF0; i = 0; j = 4; while(i<75) { if (++j>17) { send_table_frame(); j = 4; plc_frame[4]++; } else plc_frame[j] = *(int code *)(&link_status_1[0].address_R+i++); } while(j ++ < 18) plc_frame[j] = 0xaa; send_table_frame(); } void clear_table() { unsigned char i; for(i=0;i<15;i++) { write_table(i,0,0,0,0,0); } } void disable_watchdog() { EA = 0; ACC = WDCON; ACC = ACC & 0x00; WDCON = ACC; WFEED1 = 0xA5; WFEED2 = 0x5A; EA = 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -