📄 test_430.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 + -