⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 beacon.i

📁 此源码为商用的电力抄表系统的从机端源程序。通过电力载波模块
💻 I
📖 第 1 页 / 共 2 页
字号:
                                                                                                            #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 *)&reg_setting[0], plc_frame[5]); FLASH_WriteByte((int code *)&reg_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 + -