×
嵌入式 > 技术百科 > 详情

MSP430G2553做DS18B20温度控制器

发布时间:2020-06-20 发布时间:
|
//P2.5 继电器输出
#include"msp430g2553.h"
#include"LCD1602_4bit.h"
#include"DS18B20.H"
unsigned char temp_L,temp_H,temp_s,temp_s_flag,temp_s_H,temp_s_M,temp_s_L,temp;
unsigned char time_num;
unsigned char i1;
unsigned char table_1[]="Real:";
unsigned char table_2[]="set:";
unsigned char table_3[]="setting:";
unsigned char key3_flag;//,key1_flag,key2_flag;
void time0_int(void)
{
CCTL0 = CCIE;              //CCTLx是捕获/比较控制寄存器
CCR0 = 40000;
TACTL = TASSEL_2+MC_1+ID_3;//增计数模式从0计到CCR0
}
void io_int(void)
{
  P1DIR&=~BIT3;//输入
  P1DIR&=~BIT4;//输入
  P2DIR&=~BIT4;//输入
  P2DIR|=BIT5;//输出
  
}
 
void key_scan(void)
{
  if((P2IN&BIT4)==0)
  {
    delay_ms(15);
    if((P2IN&BIT4)==0)
    {
    key3_flag++;
    if(key3_flag==5)
    {
      key3_flag=0;
   for(i1=0; i1<4; i1++)
   {
   LCD1602_4bit_CMD(0xc0+i1);
   LCD1602_4bit_Data(table_2[i1]);
   }
     if(temp_s_flag==0)
     {
     LCD1602_4bit_CMD(0xc0+0x04);
     LCD1602_4bit_Data(0x20);   
     }
     else
     {
     LCD1602_4bit_CMD(0xc0+0x04);
     LCD1602_4bit_Data(0x2d);   
     }
   LCD1602_4bit_CMD(0xc0+0x05);
   LCD1602_4bit_Data(0x30+temp_s_H);
   LCD1602_4bit_CMD(0xc0+0x06);
   LCD1602_4bit_Data(0x30+temp_s_M);
   LCD1602_4bit_CMD(0xc0+0x07);
   LCD1602_4bit_Data(0x30+temp_s_L);
   for(i1=0; i1<5; i1++)
   {
   LCD1602_4bit_CMD(0xc8+i1);
   LCD1602_4bit_Data(0x20);
   }
    }
 
    if(key3_flag==1)
    {
      temp_s_flag=0;temp_s_H=0;temp_s_M=0;temp_s_L=0;
      LCD1602_4bit_CMD(0xc0+0x09);
      LCD1602_4bit_Data(0x20); 
     for(i1=0; i1<8; i1++)
     {
     LCD1602_4bit_CMD(0xc0+i1);
     LCD1602_4bit_Data(table_3[i1]);
     }
       if(temp_s_flag==0)
       {
       LCD1602_4bit_CMD(0xc0+0x09);
       LCD1602_4bit_Data(0x20);   
       }
       else
       {
       LCD1602_4bit_CMD(0xc0+0x09);
       LCD1602_4bit_Data(0x2d);   
       }
       LCD1602_4bit_CMD(0xc0+0x0a);
       LCD1602_4bit_Data(0x30+temp_s_H);
       LCD1602_4bit_CMD(0xc0+0x0b);
       LCD1602_4bit_Data(0x30+temp_s_M);
       LCD1602_4bit_CMD(0xc0+0x0c);
       LCD1602_4bit_Data(0x30+temp_s_L);
    }
    while((P2IN&BIT4)==0)
    {} 
    }
  }
  if((P1IN&BIT3)==0)
  {
    delay_ms(15);
    if((P1IN&BIT3)==0)
    {
    if(key3_flag==1)
    {
      LCD1602_4bit_CMD(0xc0+0x09);
      LCD1602_4bit_Data(0x20);//空格
      temp_s_flag=0;//表示正温度
    }
    if(key3_flag==2)
    {
      temp_s_H++;
      if(temp_s_H==2)
      {
      temp_s_H=0;
      }
        if(temp_s_flag==1)
        {
        temp_s_H=0;
        }
      LCD1602_4bit_CMD(0xc0+0x0a);
      LCD1602_4bit_Data(0x30+temp_s_H);
    }
    if(key3_flag==3)
    {
      temp_s_M++;
      if(temp_s_M==10)
      {
      temp_s_M=0;
      }
        if(temp_s_flag==0&&temp_s_H==1&&(temp_s_M>2))
        {
        temp_s_M=0;
        }
        if(temp_s_flag==1&&(temp_s_M>5))
        {
        temp_s_M=0;
        }      
      LCD1602_4bit_CMD(0xc0+0x0b);
      LCD1602_4bit_Data(0x30+temp_s_M);
    }
    if(key3_flag==4)
    {
      temp_s_L++;
      if(temp_s_L==10)
      {
      temp_s_L=0;
      }
        if(temp_s_flag==0&&temp_s_H==1&&temp_s_M==2&&(temp_s_L>5))
        {
        temp_s_L=0;
        }
        if(temp_s_flag==1&&temp_s_M==5&&(temp_s_L>5))
        {
        temp_s_L=0;
        } 
      LCD1602_4bit_CMD(0xc0+0x0c);
      LCD1602_4bit_Data(0x30+temp_s_L);
    }  
 
    while((P1IN&BIT3)==0)
    {} 
    }
  }
  if((P1IN&BIT4)==0)
  {
    delay_ms(15);
    if((P1IN&BIT4)==0)
    {
    if(key3_flag==1)
    {
      LCD1602_4bit_CMD(0xc0+0x09);
      LCD1602_4bit_Data(0x2d); 
      temp_s_flag=1;//表示负温度    
    }
    if(key3_flag==2)
    {
    temp_s_H--;
    if(temp_s_H==255)
    {
    temp_s_H=1;
    }
      if(temp_s_flag==1)
      {
      temp_s_H=0;
      }
      LCD1602_4bit_CMD(0xc0+0x0a);
      LCD1602_4bit_Data(0x30+temp_s_H);
    }
    if(key3_flag==3)
    {
      temp_s_M--;
      if(temp_s_M==255)
      {
      temp_s_M=9;
      }
        if(temp_s_flag==0&&temp_s_H==1&&(temp_s_M>2))
        {
        temp_s_M=2;
        }
        if(temp_s_flag==1&&(temp_s_M>5))
        {
        temp_s_M=5;
        } 
      LCD1602_4bit_CMD(0xc0+0x0b);
      LCD1602_4bit_Data(0x30+temp_s_M);
    }
    if(key3_flag==4)
    {
      temp_s_L--;
      if(temp_s_L==255)
      {
      temp_s_L=9;
      }
        if(temp_s_flag==0&&temp_s_H==1&&temp_s_M==2&&(temp_s_L>5))
        {
        temp_s_L=5;
        }
        if(temp_s_flag==1&&temp_s_M==5&&(temp_s_L>5))
        {
        temp_s_L=5;
        }  
      LCD1602_4bit_CMD(0xc0+0x0c);
      LCD1602_4bit_Data(0x30+temp_s_L);   
    } 
    while((P1IN&BIT4)==0)
    {} 
    }
  }
}
void display(void)
{
  temp=(temp_H&0x0f)<<4;
  if((temp_H&0xf0)==0xf0)
  {
    LCD1602_4bit_CMD(0x85);
    LCD1602_4bit_Data(0x2d);
  }
  else
  {
    LCD1602_4bit_CMD(0x85);
    LCD1602_4bit_Data(0x20);
  }
    temp=temp|((temp_L&0xf0)>>4);
    LCD1602_4bit_CMD(0x86);
    LCD1602_4bit_Data(0x30+temp/100);
    LCD1602_4bit_CMD(0x87);
    LCD1602_4bit_Data(0x30+(temp%100)/10);
    LCD1602_4bit_CMD(0x88);
    LCD1602_4bit_Data(0x30+temp%10);
    
}
void warning(void)
{
if(temp_s_flag==0)
{
if(temp>=(temp_s_L*100+temp_s_M*10+temp_s_L))
{P2OUT|=BIT5;}
else
{P2OUT&=~BIT5;}
}
if(temp_s_flag==1)
{
if(temp<=(temp_s_M*10+temp_s_L))
{P2OUT|=BIT5;}
else
{P2OUT&=~BIT5;}
}
}
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
   DCOCTL  = 0x00;                           // Set DCO 1MHz
   BCSCTL1 = CALBC1_1MHZ;                    
   DCOCTL  = CALDCO_1MHZ;
   
   
   
   //time0_int();
   _EINT();
 
   P2DIR |= 0x0f;
   P1DIR |= 0xf0;
   delay_ms(20);
   io_int();
   LCD1602_4bit_init();
   for(i1=0; i1<5; i1++)
   {
   LCD1602_4bit_CMD(0x80+i1);
   LCD1602_4bit_Data(table_1[i1]);
   }
   for(i1=0; i1<4; i1++)
   {
   LCD1602_4bit_CMD(0xc0+i1);
   LCD1602_4bit_Data(table_2[i1]);
   }   
   
 
   while(1)
   {
//   LCD1602_4bit_CMD(0x85);
//   LCD1602_4bit_Data(0x30+time_num);
   Read_temp();
   key_scan();
   display();
   warning();
/*   P2OUT|=BIT5;
   delay_ms(2000);
   P2OUT&=~BIT5;
   delay_ms(2000);
   P1OUT&=~BIT6;
   delay_ms(1000);*/
   }
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void timeA1(void)
{
time_num++;
if(time_num==20)
{
time_num=0;
}
 
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端