📄 main.c
字号:
//****************************************************************************\
//文件名:main.c
//描述: 控制主函数,使用MSP430F149A
//****************************************************************************/
#include <MSP430x14x.h>
#include "xieyi.h"
#include "Receiver.h"
#include "df_uart0.h"
#include "df_uart1.h"
#include "24c02.h"
#include "Time_A.h"
#include "pwm_timer_b.h"
#include "Ctrl_Temp.h"
#include "ds18b20.h"
#include "i2c.h"
float nTempperature;
float Kp ; // 比例系数
float Ki ; // 积分系数
float Kd ; // 微分系数
float fTempSet ; // 设定高温度
//函数声明区
void InitSys();
void Adrress_choose();
int main( void )
{
//short i;
//float temp=0;
InitSys(); //系统初始化
while(1)
{
if (FRAME_OK())
HandleCommand(); //如果上位机有信号,执行通信命令
////nTempperature =GetTemperature();
/*{
for(i=0;i<5;i++)
temp+=GetTemperature();
nTempperature=temp/5;
temp=0;
SendCommand("L&%f&",nTempperature);
} */ //计算温度平均值
if (Ctrl_Temp_Flag == START_HEAT_COOL) //如果中断标志为1
{
CtrlTemp();
Ctrl_Temp_Flag = STOP_HEAT_COOL;
nTempperature =GetTemperature(); //每2秒读一次温度,存起来
SendCommand("L&%d&|PWM_Duty%f|FERR%f|Kp fD1Ek%f|Ki * fErr0%f|",(int)(nTempperature*10),PWM2_Duty,fErr0,(fErr0 - fErr1),(Ki * fErr0));
}
}
}
//****************************************************************************
//系统初始化函数
//描述:关闭看门狗,开XT2振荡器,选择MCLK、SMCLK为XT2,初始化其他外设
//调用:其他外设初始化函数
//****************************************************************************
void InitSys()
{
unsigned int iq0;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+DIVS_0+SELS; //选择MCLK、SMCLK为XT2
{
P5DIR = (BIT6|BIT4|BIT2);
P5OUT = BIT2; /*lighten led*/
}
Uart0Init(); //初始化串口0
Uart1Init(); //初始化串口1
Start_I2C(); //启动I2C总线
Init_DS18B20();
InitTimeB(); //TimerB初始化
InitTimeA(); //TimerA初始化
GoTimer(1); //启动TimerA定时器
CtrlPwm3(1); //启动风扇
Adrress_choose();
{
/*P4SEL&=~BIT1;
P4DIR|=BIT1;
P4OUT|=BIT1;
P4SEL&=~BIT2;
P4DIR|=BIT2;
P4OUT&=~BIT2;*/
}
_EINT(); //打开全局中断控制
}
void Adrress_choose()
{
nAddress = Address();
if( 'C' == Address() )
//{
// NUMBER = 400;
// Kp = 0.007f; // 比例系数
// Ki = 0.004; // 积分系数
// Kd = 0.001; // 微分系数
// fTempSet = 37.0;
//}
//else
{
NUMBER = GetMsValue(10000);
Kp = 0.4f; // 比例系数
Ki = 0.1; // 积分系数
Kd = 0.01; // 微分系数
fTempSet = 16.0;
}
CtrlTemp();
TimCh0 = HEAT_COOL_INTERVAL;
}
//****************************************************************************
//端口2中断函数
//****************************************************************************
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
if((P2IFG&BIT0) == BIT0)
{
P2IFG &= ~BIT0; //清除中断标志
}
else if((P2IFG&BIT1) ==BIT1)
{
P2IFG &= ~BIT1; //清除中断标志
}
else if((P2IFG&BIT2) ==BIT2)
{
P2IFG &= ~BIT2; //清除中断标志
}
else if((P2IFG&BIT3) ==BIT3)
{
P2IFG &= ~BIT3; //清除中断标志
}
else if((P2IFG&BIT4) ==BIT4)
{
P2IFG &= ~BIT4; //清除中断标志
}
else if((P2IFG&BIT5) ==BIT5)
{
P2IFG &= ~BIT5; //清除中断标志
}
else if((P2IFG&BIT6) ==BIT6)
{
P2IFG &= ~BIT6; //清除中断标志
}
else
{
P2IFG &= ~BIT7; //清除中断标志
}
LPM3_EXIT; //退出中断后退出低功耗模式。
}
//****************************************************************************
//看门狗定时器中断函数
//****************************************************************************
#pragma vector=WDT_VECTOR
__interrupt void WatchDog()
{
LPM3_EXIT; //退出中断后退出低功耗模式。
}
//****************************************************************************
//比较器A中断函数
//****************************************************************************
#pragma vector=COMPARATORA_VECTOR
__interrupt void ComparatorA()
{
LPM3_EXIT; //退出中断后退出低功耗模式。
}
//****************************************************************************
//定时器B中断函数
//中断源:CC0
//****************************************************************************
#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0()
{
LPM3_EXIT; //退出中断后退出低功耗模式。
}
//****************************************************************************
//不可屏蔽中断函数
//****************************************************************************
#pragma vector=NMI_VECTOR
__interrupt void Nmi()
{
if((IFG1&OFIFG)==OFIFG) //振荡器失效
{
IFG1 &= ~OFIFG;
}
else if((IFG1&NMIIFG)==NMIIFG) //RST/NMI不可屏蔽中断
{
IFG1 &= ~NMIIFG;
}
else if((FCTL3&ACCVIFG)==ACCVIFG) //存储器非法访问
{
FCTL3 &= ~ACCVIFG;
}
LPM3_EXIT; //退出中断后退出低功耗模式。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -