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

📄 intmcu.c

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

Uchar DI_Status[3];
Uchar PINA_temp,PINB_temp,PINE_temp,PINF_temp;
unsigned char DI_data_cur[12],DI_data[12],DI_data_pre[12]; //状态寄存器


void port_init(void)                                       //端口初始化
{
  DDRA = 0x00;
  DDRB = 0xe0;
  DDRE = 0x00;
  DDRF = 0x00;
  DDRC = 0x00;
  DDRD = 0x10;
  PORTG = 0x08;
  DDRG  = 0x08;
}

void DI_handle(void)                                       //开关状态读取
{
  PINA_temp = PINA;
  PINB_temp = PINB;
  PINE_temp = PINE;
  PINF_temp = PINF;

/**************Channel 1*****************/   
  if(PINA_temp & (1<<3))
      DI_Status[0] |= (1<<0);
  else 
      DI_Status[0] &= (~(1<<0));
  
  if(PINF_temp & (1<<2))
      DI_Status[0] |= (1<<1);
  else 
      DI_Status[0] &= (~(1<<1));
	 
/**************Channel 2*****************/ 
  if(PINF_temp & (1<<3))
      DI_Status[0] |= (1<<2);
  else 
      DI_Status[0] &= (~(1<<2));

  if(PINA_temp & (1<<2))
      DI_Status[0] |= (1<<3);
  else 
      DI_Status[0] &= (~(1<<3));

/**************Channel 3*****************/
  if(PINE_temp & (1<<7))
      DI_Status[0] |= (1<<4);
  else 
      DI_Status[0] &= (~(1<<4));

  if(PINE_temp & (1<<1))
      DI_Status[0] |= (1<<5);
  else 
      DI_Status[0] &= (~(1<<5));

/**************Channel 4*****************/
  if(PINE_temp & (1<<0))
      DI_Status[0] |= (1<<6);
  else 
      DI_Status[0] &= (~(1<<6));

  if(PINE_temp & (1<<6))
      DI_Status[0] |= (1<<7);
  else 
      DI_Status[0] &= (~(1<<7));
	  
/**************Channel 5*****************/
  if(PINA_temp & (1<<5))
      DI_Status[1] |= (1<<0);
  else 
      DI_Status[1] &= (~(1<<0));

  if(PINF_temp & (1<<0))
      DI_Status[1] |= (1<<1);
  else 
      DI_Status[1] &= (~(1<<1));
   
/**************Channel 6*****************/
  if(PINF_temp & (1<<1))
      DI_Status[1] |= (1<<2);
  else
      DI_Status[1] &= (~(1<<2));
  
  if(PINA_temp & (1<<4))
      DI_Status[1] |= (1<<3);
  else 
      DI_Status[1] &= (~(1<<3));
	  
	  
//PB1,PE3  PE2,PB0  PA7,PA1   PA0,PA6   PB3,PE5   PE4,PB2	  
	  
/**************Channel 7*****************/
  if(PINB_temp & (1<<1))
      DI_Status[1] |= (1<<4);
  else 
      DI_Status[1] &= (~(1<<4));

  if(PINE_temp & (1<<3))
      DI_Status[1] |= (1<<5);
  else 
      DI_Status[1] &= (~(1<<5));
	  
/**************Channel 8*****************/
  if(PINE_temp & (1<<2))
      DI_Status[1] |= (1<<6);
  else 
      DI_Status[1] &= (~(1<<6));
	  
  if(PINB_temp & (1<<0))
      DI_Status[1] |= (1<<7);
  else 
      DI_Status[1] &= (~(1<<7));
	  
/**************Channel 9*****************/
  if(PINA_temp & (1<<7))
      DI_Status[2] |= (1<<0);
  else 
      DI_Status[2] &= (~(1<<0));
	   
  if(PINA_temp & (1<<1))
      DI_Status[2] |= (1<<1);
  else 
      DI_Status[2] &= (~(1<<1));

/**************Channel 10*****************/
  if(PINA_temp & (1<<0))
      DI_Status[2] |= (1<<2);
  else 
      DI_Status[2] &= (~(1<<2));

  if(PINA_temp & (1<<6))
      DI_Status[2] |= (1<<3);
  else 
      DI_Status[2] &= (~(1<<3));

/**************Channel 11*****************/
  if(PINB_temp & (1<<3))
      DI_Status[2] |= (1<<4);
  else 
      DI_Status[2] &= (~(1<<4));
	
  if(PINE_temp & (1<<5))
      DI_Status[2] |= (1<<5);
  else 
      DI_Status[2] &= (~(1<<5));

/**************Channel 12*****************/
  if(PINE_temp & (1<<4))	
      DI_Status[2] |= (1<<6);
  else 
      DI_Status[2] &= (~(1<<6));

  if(PINB_temp & (1<<2))
      DI_Status[2] |= (1<<7);
  else 
      DI_Status[2] &= (~(1<<7));
	  
///test
 // if((DI_Status[0] != 0xaa) || (DI_Status[1] != 0xaa) || (DI_Status[1] != 0xaa))
     // PORTB |= (1<<5);

  data_tranfer();                                        //刷新DI_data_cur[]的值

}


void data_tranfer(void)
{
  unsigned char i,j;
  
  for(j=0;j<3;j++)
  {
    for(i=0;i<8;i=i+2)
	 { 
	   if(((DI_Status[j]>>i) & 0x03) == 0x03)
           DI_data_cur[(j<<2)+(i>>1)] =  0x5a;
	   else if(((DI_Status[j]>>i) & 0x03) == 0x00)      
	       DI_data_cur[(j<<2)+(i>>1)] =  0;
	   else if(((DI_Status[j]>>i) & 0x03) == 0x02)
	       DI_data_cur[(j<<2)+(i>>1)] =  0xa5;
     }
  }

}



void timer0_init(void)
{
 TCCR0A = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT0 = 0x83; //set count
 OCR0  = 0x7D;
 TCCR0A = 0x05; //start timer
}

void init_devices(void)
{
 port_init();
 timer0_init(); 
 TIMSK0 = 0x01; 
}

void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0e; //WATCHDOG ENABLED - dont forget to issue WDRs
}

⌨️ 快捷键说明

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