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

📄 main._c

📁 工业开关量检测模块的原代码,带断线检测功能
💻 _C
字号:
#include "main.h"

VCI_CAN_OBJ msg[2],rece_data[3];
long id1,id2,id3,id4,id5;

unsigned char ID_nu,ID_net;
unsigned char Pass_Flag,Send_Flag,Temp_Flag,Time;
extern Uchar DI_Status[3],send_count;
extern Uchar PINA_temp,PINB_temp,PINE_temp,PINF_temp;
extern unsigned char DI_data_cur[12],DI_data[12],DI_data_pre[12];
unsigned int RUN;

extern unsigned long CANMOBID[15];
extern unsigned long CANMOBMD[15];



#pragma abs_address: 0x29B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x39B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x49B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x59B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x69B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x79B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x89B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x99B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xA9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xB9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xC9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xD9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xE9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0xF9B0     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address


#pragma abs_address: 0x0004     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x000C    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0014  
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x001C    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0024    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x002C     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0034     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x003C    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x004C   
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0054     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x005C     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0064     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x006C    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0074     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x007C    
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address

#pragma abs_address: 0x0084     
  asm("nop");
  asm("nop");
  RESET;
#pragma end_abs_address



#pragma interrupt_handler timer0_ovf_isr:18
void timer0_ovf_isr(void)                              //定时1毫秒
{
 TCNT0 = 0x83; //reload counter value
 Time++;
 RUN++;
 if(Time>15)
 {
 Time = 0;
 Temp_Flag = 0x5a;
 RUN_LED();
 }
 if(RUN>50)
 {
 WDR();
 RUN_LED();
 RUN = 0;
 Send_Flag = 0x5a;
 }
}

void main(void)
{
 unsigned char i;
 long tempp;
 CLI();
 init_devices();                                             //器件初始化
 init_data();                                                //数据初始化
 
 ID_nu = get_id();                                           //读取拨码开关的值
 ID_net = ID_nu;                                             //计算网络ID号

 Pass_Flag = 0x01;
 tempp = ID_net*256;
 Pass_Flag <<= 1;
 id1 = BASE_ADDR+tempp;
 id2 = BASE_ADDR+1+tempp;
 id3 = BASE_ADDR/256+tempp*256;
 Pass_Flag <<= 1;
 id4 = BASE_ADDR/256+tempp*256+1;
 id5 = BASE_ADDR/256+tempp*256+2;
 Pass_Flag <<= 1;
 CANMOBID[0] = id1;
 CANMOBID[1] = id2;
 CANMOBID[3] = id3;
 CANMOBID[4] = id4;
 CANMOBID[5] = id5;
 if(Pass_Flag!=0x08)
 RESET;
 can_init ();   
 
 DI_handle();                                                //读取开关状态 去抖动处理
 for(i=0;i<12;i++)
 {
 DI_data_pre[i] =DI_data_cur[i];
 DI_data[i] =DI_data_cur[i];
 }
 SEI();
 watchdog_init();
 WDR();
 WDR();

  while(1)
  {
 
   WDR();
   ID_nu = get_id();                                           //读取拨码开关的值
   ID_net = ID_nu;                                             //计算网络ID号
   if(tempp!=ID_nu*256)
   {    
    CLI();
     tempp = ID_net*256;
	 Pass_Flag = 0x01;
       id1 = BASE_ADDR+tempp;
       id2 = BASE_ADDR+1+tempp;
	 Pass_Flag <<= 1;  
	   WDR();
       id3 = BASE_ADDR/256+tempp*256;
	 Pass_Flag <<= 1;  
       id4 = BASE_ADDR/256+tempp*256+1;
       id5 = BASE_ADDR/256+tempp*256+2;
	 Pass_Flag <<= 1;
	   WDR();
       CANMOBID[0] = id1;
       CANMOBID[1] = id2;
       CANMOBID[3] = id3;
       CANMOBID[4] = id4;
       CANMOBID[5] = id5;
	  if(Pass_Flag!=0x08)
          RESET;
       can_init ();  
	SEI();   
   }
   
    if(send_count>25)                                          //连续25次发送失败则复位
	RESET;
	
    if(Temp_Flag == 0x5a)                                       //定时读去状态标志
  {  
    CLI();
	
	WDR();
	TIMSK0 = 0x00; 
	if(LED)
	{
	PORTB &= 0X3F;                                           //灭网络灯
	}
	else
	
	PORTB |= 0Xc0;              
	
    DI_handle();                                             //读取开关状态
   
    for(i=0;i<12;i++)
   {
      if(DI_data_pre[i] == DI_data_cur[i])                   //去抖处理
     {
	   DI_data[i] = DI_data_cur[i];
	  }
      else if (DI_data_pre[i] != DI_data_cur[i])
	     {
		  DI_data[i] = DI_data_pre[i];
		 } 
	  DI_data_pre[i] = DI_data_cur[i];                      //新旧值更新
      }
	Temp_Flag = 0x00;                                       //清除定时标志
	
	Time = 0;
	
	timer0_init();
	
	TIMSK0 = 0x01; //timer interrupt sources
	
	WDR();
	SEI();
	}
	
   if(Send_Flag == 0x5a)	
   {
     WDR();
    msg[0].ID = id1;                                     //前八个通道数据发送
	for(i=0;i<8;i++)
	{
	msg[0].Data[i] =  DI_data[i];
	}
    can_tx (msg[0]);
	send_count++;
	msg[1].ID = id2;
	for(i=0;i<4;i++)                                     //后四个通道数据发送
	{
	msg[1].Data[i] =  DI_data[i+8]; 
	}
    for(i=4;i<8;i++)
	{
	msg[1].Data[i]=0x00;
	}
    can_tx (msg[1]);
	send_count++;
	Send_Flag = 0x00;
	 WDR();
     }
	
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -