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

📄 test_430.c

📁 中断服务程序
💻 C
字号:
//*******************************************************************************
//
//                MSP430F1121
//             -----------------
//         /|\|              XIN|-  
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            |             P2.0|-->LED
//功能:MSP430F1121控制程序
//说明:中断信号
//              WATER--P1.3
//              BREAK--P1.2
//              8563_INT--P1.1
//              485_INT--P2.0
//      数据线:D1--P2.4
//              D0--P2.2     
//    控制信号:SP6201_EN1--P2.3
//************************初始化端口***********************************
void Iint_Port1(void);
void Iint_Port2(void);
void ReportData(unsigned char i);
void PowerCtrl(unsigned char i);
void delay_time(unsigned char);
void init_TimeA(void);
//**************************变量定义********************************//
unsigned char time_count,time_count_x;
//================================================================// 
#include  <msp430x11x1.h>
unsigned int data,data1;
void main(void)
{ 
  int j;
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  Iint_Port1();                         //初始化端口P1
  Iint_Port2();                         //初始化端口P2
  init_TimeA();                         //初始化定时器A
  _EINT();                              // Enable interrupts中断使能      
  PowerCtrl(0);

  //***************************
 /*  PowerCtrl(1);
  delay_time(2);
  ReportData(1);//时钟唤醒   
  delay_time(2);   
  ReportData(2);//WATER唤醒
  delay_time(2);
  ReportData(3);//BREAK唤醒
  delay_time(2);  
  ReportData(4);//485唤醒
  delay_time(2);  
 */
  //***************************
  while(1)
  { 
  data=P2IN;      //p2.2=1 p2.4=0     0000 0100 
 data=data&0x14;  // 0001 0100    1110 1011
 //  data=data|0xeb;
  if(data==0x14)
    {
    for(j=0;j<=5000;j++);
//    if(data==0x14)
//    PowerCtrl(0);
    }
  else
    {

    }
  }

}
//**************************函数定义********************************//
void Iint_Port1(void)                      
{   
  P1SEL&=0x00;                         //0000 0000  P1均为普通I/O
  P1DIR&= 0XF1;                        //置P1.1 P1.2 P1.3为输入 1111 0001
  P1IES|=0x0C;                         //0000 1100 选择下降沿触发(P1.2接BREAK,P1.3接WATER;)
  P1IE|=0x0C;                         //0000 1100 打开中断允许
  P1IFG=0;                              //P1IES的切换可能使P1IFG置位,需清除  
    
}  
//================================================================// 
void Iint_Port2(void)
{
  P2SEL&=0x00;                //0000 0000 全为普通I/O口
  P2DIR |= 0x08;              // 置P2.3  为输出 0000 1000
  P2DIR &= 0XEA;              // 置P2.0 P2.2 P2.4 为输入 1110 1010
  P2IES&=~0X01;                //0000 0001 选择上升沿触发(P20接485_INT)?????
//  P2IES|=0X01;                //0000 0001 选择下降沿触发(P20接485_INT)?????
  P2IE|=0X01;                 //0000  0001 允许产生中断
  P2IFG=0;                   //中断标志清零
  P2OUT&=0XF7;                //P2.3置低 1111 0111
}
//================================================================// 
//p1口中断函数部分
#pragma vector=PORT1_VECTOR
__interrupt void P1_ISR(void)  //P1口中断服务程序
{ 
  int j=0;
  if(P1IFG&BIT1)           //判断P1.1中断是否发生//
    {
    for(j=0;j<=1000;j++);    //软件去抖,延时20ms左右
    if(P1IFG&BIT1)
    P1IFG&=~BIT1;            //清除中断标志
    PowerCtrl(1);              //P2.3置高,ARM上电
    ReportData(1);
    }
  if(P1IFG&BIT2)           //判断P1.2中断是否发生//
    {
    for(j=0;j<=1000;j++);    //软件去抖,延时20ms左右
    if(P1IFG&BIT2)
    P1IFG&=~BIT2;            //清除中断标志
    PowerCtrl(1);              //P2.3置高,ARM上电
    ReportData(3);
    }
  else if(P1IFG&BIT3)     //判断P1.3中断是否发生
    {
    for(j=0;j<=1000;j++);  //软件去抖,延时20ms左右
    if(P1IFG&BIT3)
    P1IFG&=~BIT3;           //清除中断标志
    PowerCtrl(1);           //P2.3置高,ARM上电
    ReportData(2);
    }

} 
//================================================================//
//p2口中断函数部分
#pragma vector=PORT2_VECTOR
__interrupt void P2_ISR(void)  //P2口中断服务程序,485_INT--P2.0
{ 
  int j=0;
  if(P2IFG&BIT0)          //判断P2.0中断是否发生//
  {
  for(j=0;j<=1000;j++);   //软件去抖,延时20ms左右
  if(P2IFG&BIT0)
  P2IFG&=~BIT0;           //清除中断标志
  P2OUT=0X08;              //P2.3置高,ARM上电
  ReportData(4);
  }
}
//=======================电源控制=============================// 
void PowerCtrl(unsigned char i)
{
  if(i==1)
    P2OUT|=0X08;              //P2.3置高,ARM上电  0000 1000
  else if(i==0)
    P2OUT&=0XF7;              //P2.3置低,ARM上电 1111 0111
}
//=======================上报数据=============================// 
//  D0  D1  系统状态 D0--P2.2 D1--P2.4
//  0   0   时钟唤醒
//  0   1   WATER唤醒
//  1   0   BREAK唤醒
//  1   1   485唤醒
//================================================================// 
void ReportData(unsigned char i)
{
  int j;
  P2DIR |= 0X14;               // 置P2.2 P2.4为输出 0001 0100
  switch(i)
    {
    case 1:                     //时钟唤醒 0 0
    P2OUT&=0XEB;                //P2.2=0 P2.4=0   1110 1011
    break;
    case 2:                     //WATER唤醒
    P2OUT&=0XFB;                //P2.2=0 P2.4=1  1111 1011  
    P2OUT|=0X10;                //P2.2=0 P2.4=1  0001 0000 
    break;
    case 3:                     //BREAK唤醒
    P2OUT&=0XEF;                //P2.2=1 P2.4=0  1110 1111  
    P2OUT|=0X04;                //P2.2=1 P2.4=0  0000 0100   
    break;
    case 4:                     //485唤醒
    P2OUT|=0X14;                //P2.2=1 P2.4=1  0001 0100  
    break;
    default:
    break;
    }
    for(j=0;j<=10000;j++);   //延时时间加长!
    for(j=0;j<=10000;j++);
    for(j=0;j<=10000;j++);   //延时时间加长!
    for(j=0;j<=10000;j++);    
  P2DIR &= 0XEA;              // 置P2.0 P2.2 P2.4 为输入 1110 1010
}

//============================初始化定时器A====================================//
void init_TimeA(void)
{
      TACTL=TASSEL0+TACLR;//时钟:ACLK;清TAR(计数器内容)
      CCTL0=CCIE;   //CCR0中断使能
      CCR0=16384;   // 设定中断间隔,32KHz晶振,0.5S  计数值=0.5S/(1/32.768*1000)=16384
      TACTL|=MC0;   // 加计数 工作模式:增计数模式 MC0=1 MC1=0
}
//===========================延时函数(延时时间time_data/2秒)=====================================//
void delay_time(unsigned char time_data)
      {
      time_count=0;
      while(time_count<time_data)
          {
          ;
          }
      }

//=======================定时器A中断===============================//
#pragma vector=TIMERA0_VECTOR
__interrupt   void Timer_A(void)
//interrupt[TIMERA0_VECTOR] void Timer_A (void)
{
      time_count++;       //延时程序使用
      time_count_x++;
      if(time_count_x>1500)
              {
              time_count_x=0;
              }
/*      Clear_wdt();*/
    P1OUT ^= 0x01;    // Toggle P1.0 0.5s电平翻转一次 

}
//================================================================//

⌨️ 快捷键说明

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