📄 main.c
字号:
#include <msp430x41x.h> //系统文件夹内找
#include "main.h" //当前文件夹内找
// #pragma memory = no_init
uint tt3[6],tt4[6],tt5[6];
uchar wt3[6],wt4[6],wt5[6];
uint tt2[6]={150,660,840,1180,1200};
uchar wt2[6]={180,180,180,180,180};
// #pragma memory = default
int main(void)
{
uchar i;
Sys_Init();
//开始温度转换-------------------------
i = 10;
i1=1;
i2=0;
i3=0;
i4=0;
time_yanshi =0;
key_yanshi =0;
day =1;
daf =0;
dd = '0';
ds = '0';
while(Ds18b20_Init() & (--i) );
Ds18b20_WriteByte(SkipROM);
Ds18b20_WriteByte(Convert);
Delay_ms(900);
//ReleaseDQ(); //寄生电源时要拉高DQ
//------------------------------------
while(1)
{
if (ds=='1')
temG();
TempCal(&wendu_fuhao, &wendu_zhensu, &wendu_yusu);
Display();
if (dd== '1')
{
dd='0';
LPM3; //进入低功耗模式n,n:0~4。
} //若不希望进入低功耗模式,屏蔽本句,但要加延时1s以完成温度转换。
if (wdj =='1')
{
pp=0x1100; //每天写温度
for (i=0;i<5;i++)
{pp=pp+0x0002;
flash_writeByte(pp, wt2[i]);
}
wdj='0';
dd='1';
}
}
}
/********************************************************
* Display *
********************************************************/
void Display(void)
{
if(wendu_fuhao)
LCDMEM[0] = digit[10]; //显示"-"
else
LCDMEM[0] = digit[12];
LCDMEM[3] = digit[wendu_zhensu%10];
LCDMEM[3] |= 0x10; //小数点
wendu_zhensu /= 10;
LCDMEM[2] = digit[wendu_zhensu%10];
LCDMEM[1] = digit[wendu_zhensu/10];
LCDMEM[4] = (digit[wendu_yusu/10] & 0x0f)<<4;//取低位放在高位,低位为标志符
LCDMEM[5] = (digit[wendu_yusu/10] & 0xf0)>>4; //取高位放在低位
LCDMEM[5] |= (digit[wendu_yusu%10] & 0x0f)<<4;
LCDMEM[6] = (digit[wendu_yusu%10] & 0xf0)>>4;
}
/********************************************************
* SYS初始化 *
********************************************************/
void Sys_Init(void)
{
uchar i=0;
/***以下填充用户代码,对各种模块、中断、外围设备等进行初始化***/
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP14PF; // Configure load caps
SCFI0 |= FN_2; //频率范围
SCFQCTL =30; //N,如不设置默认=31
SCFI0 |= FLLD_2; //D=2,PUC后的默认值=2
//FLL_CTL1 |= FLL_DIV_4; //4分频,P1.5输出:f=32768/4
FLL_CTL0 |= DCOPLUS;//在MCLK前分频 f=D*(N+1)*faclk,2*(30+1)*32768=2031616Hz
LCDCTL = LCDON + LCD4MUX + LCDP2; // STK LCD 4Mux, S0-S17
BTCTL = BTFRFQ1; // STK LCD freq, 基本定时器输出fLCD=fACLK/64
P5SEL = 0xFC; // Common and Rxx all selected,公共极和 Rxx 选择
//WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
WDTCTL = WDT_ARST_1000; // 1s dog timer
IE1 |= WDTIE;
_EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
IE2 |= BTIE; //打开基本定时器中断
BTCTL |= BTDIV + BTIP1+ BTIP2; // 1s interrupt
P1IES = BIT4 + BIT5; //P1.5,P1.6中断为1->0
P1IE = BIT4 + BIT5; //允许P1.5,P1.6中断,
for(i=0;i<12;i++)
LCDMEM[i] = digit[12];
time_yanshi = 5; //每5秒采集并显示温度
P1DIR = BIT4 + BIT5; // P1.1 & P1.5 to output direction
// P1SEL = 0x22; // P1.1 & P1.5 to output MCLK & ACLK
// P6DIR |= BIT3;
// P6OUT = BIT3;
}
/*****************************************************************************
基本定时器中断函数
*
*****************************************************************************/
#pragma vector=BASICTIMER_VECTOR
__interrupt void BasTimer()
{
static uchar times;
times++;
if (times >59); // 1799)
{
daf++;
times = 0;
if (daf % 30 == 0)
{
ds= '1'; // 半小时测温 P6OUT ^= BIT3;
LPM3_EXIT; //退出中断后退出低功耗模式。
}
if (daf ==1440)
{
day++; //12:00增加1天,记录温度
wdj='1';
daf=1;
}
}
}
/*****************************************************************************
看门狗定时器中断函数
*
*****************************************************************************/
#pragma vector=WDT_VECTOR
__interrupt void wdtchdogTimer()
{
static uchar time1,time2;
time1++;time2++;
if (time2 >1 )
{
time2 = 0; //if(dw=='0')
P6OUT &= ~BIT3;//2S停止执行器
P6OUT &= ~BIT4;//停止执行器
dw = '1';
}
if (time1 > time_yanshi)
{
time1 = 0; // P6OUT ^= BIT3;
LPM3_EXIT; //退出中断后退出低功耗模式。
}
}
/*****************************************************************************
端口1中断函数 p1.0 接红外out,p1.7 p1.6 p1.5 p1.4 接键
多中断中断源:P1IFG.0~P1IFG7
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{ uchar i,j,k,n=0;
if((P1IFG&BIT0) == BIT0)
{
P1IFG &= ~BIT0; //清除P1.0中断标志
P1IE &=~BIT0; //关闭P1.0中断功能
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {P1IE|=BIT0;return;}
}
Delay_ms(20/1.4);
if (IRIN==1) goto I1; //确认IR信号出现
while(!IRIN); //等待IR变为高电平
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{Delay_us(140);}
while (!IRIN) //等 IR 变为高电平
{Delay_us(140);}
while (IRIN) //计算IR高电平时长
{
Delay_us(140);
n++;
if (n>=30){P1IE|=BIT0;return;}
}
dat[j]=dat[j] >> 1;
if (n>=11) {dat[j] = dat[j]|0x80;}
n=0;
}
}
if (dat[2]!=~dat[3]) {P1IE|=BIT0;return;}//此句刚开始可以屏蔽,见到效果后再尝试打开校验
dat[5]=dat[2] & 0x0F;
dat[6]=dat[2] & 0xF0;
dat[6]=dat[6] >> 4;
//beep();
P1IE|=BIT0;
}
if((P1IFG&BIT4) == BIT4)
{
P1IFG &= ~BIT4; //清除P1.4中断标志
P1IE &=~BIT4; //关闭P1.4中断功能
mu1();
}
if((P1IFG&BIT5) == BIT5)
{
P1IFG &= ~BIT5; //清除P1.5中断标志
P1IE &=~BIT5; //关闭P1.5中断功能
mu2();
}
if((P1IFG&BIT6) == BIT6)
{
P1IFG &= ~BIT6; //清除P1.6中断标志
P1IE &=~BIT6; //关闭P1.6中断功能
mu3();
}
if((P1IFG&BIT7) == BIT7)
{
P1IFG &= ~BIT7; //清除P1.7中断标志
P1IE &=~BIT7; //关闭P1.7中断功能
mu4();
}
}
/*****************************************************************************
端口2中断函数
多中断中断源:P2IFG.0~P2IFG7
进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断
******************************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2()
{
if((P2IFG&BIT5) == BIT5) //关闭状态
{
P2IFG &= ~BIT5; //清除P2.5中断标志
P2IE &=~BIT5; //关闭P2.5中断功能
dw = '0';
}
if((P2IFG&BIT6) == BIT6) //全开状态
{
P2IFG &= ~BIT6; //清除P2.6中断标志
P2IE &=~BIT6; //关闭P2.6中断功能
dw = '2';
}
}
/********************************************************
* DS18B20初始化 *
********************************************************/
uchar Ds18b20_Init(void) //存在返0,否则返1
{
uchar temp = 1;
uchar outtime = ReDetectTime; //超时时间
while(outtime-- && temp)
{
IoOut_DQ();
Delay_ms(2); //(250)1514us时间可以减小吗
ReleaseDQ();
Delay_us(2);
PullDownDQ();
Delay_us(600); //614us(480-960)
ReleaseDQ();
Delay_us(70); //73us(>60)
IoIn_DQ();
temp = ReadDQ();
Delay_us(500); //us
}
return temp;
}
/********************************************************
* 写bit2DS18B20 *
********************************************************/
void Ds18b20_WriteBit(uchar bitdata)
{
IoOut_DQ();
if(bitdata)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -