以下是我变编的,大家觉得这样编 精度是否已达到,还是根本不能这样编,精确到0.001MS.
#include "DHM015.c" #include "hw.h" #include "math.h" void main (void) { MSP430Init();//430初始化 WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms DHM015Init();//液晶初始化 WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms _EINT();//开总中断 while(1) { WDTCTL = WDT_ARST_1000;//设定看门狗定时时间为1s _BIS_SR(LPM3_bits);//低功耗 WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms //WDTCTL=WDTPW+WDTHOLD; if((Flag&RESET)==RESET)//是否复位键按下 WDTCTL = 0;//写入错误看门狗键值,使程序复位 else { if(Flag2==2) //是否已两次采样 { Tsum=(4086*cnt+Compare)*1000000/800000 ; Flag2=0; } /***************************************显示结果 ***************************************/ WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms DisplayResult(); } } }
/******************************************************************************** 函数原型: void MSP430Init(void) 函数功能: 430单片机初始化函数,在该函数中对时钟,I/O口,各个外围模块进行初始化。 调用 入口参数: 无 出口参数: 无 *********************************************************************************/ void MSP430Init(void) { int i; WDTCTL = WDT_ARST_250;//设定看门狗定时时间为250ms BCSCTL1 |= ~XT2OFF;//关闭XT2 //wait in loop until crystal is stable { IFG1&=~OFIFG; for (i = 0xFF; i > 0; i--); // Time for flag to set }while(OFIFG&IFG1); BCSCTL2=SELS; //SMCLK的时钟源为TX2CLK;8MHZ; //--------------------------------I/O initial------------------------------------// P1DIR |= 0xFF; P1OUT = 0; P2DIR |= 0xFF; P2OUT = 0; P3DIR |= 0xFF; P3OUT = 0; P4DIR |= 0xFF; P4OUT = 0;
P5DIR |= 0xFF; P5OUT = 0;
P6DIR |= 0xFF; P6OUT = 0;
//----------------------------------TimerB---------------------------------------// TBCTL=TBSSEL1+TBCLR;//选择SMCLK作为时钟源 TBCCTL0=CCIE;//中断允许 TBCCR0=4096;//计时0.1MS TBCTL=MC_1;//增计数 TBCCTL1=CCIE+CAP+CM_3;//捕获模式,上下源都捕获 #if VERSION>126 #pragma vector=TIMERA0_VECTOR __interrupt void TimerA(void) #else interrupt[TIMERA0_VECTOR] void TimerA(void) #endif { switch(TBIV) { case 2:Newcapture=CCR1; Compare=Oldcapture-Newcapture; Oldcapture=CCR1; Flag2++; case 14: cnt++; } } } |