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

📄 main.c

📁 msp430F413用DS18B20测温
💻 C
📖 第 1 页 / 共 2 页
字号:
 #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 + -