/*
硬件:DS18B20+OLEDIIC+绿灯+红灯+一个按键+蜂鸣器+加热片
功能:
1 显示温度
2 显示临界值,按键可以加减临界值,临界值在20~35之间可调。
3 实际温度高于(临界值+1)后绿灯亮表示降温。
4 实际温度低于(临界值-1)后加热片工作表示加热。
5 实际温度高于35摄氏度无源蜂鸣器报警。
6 设置温度时候,临界值高于30摄氏度,红灯亮,提醒避免设置温度过高。
LINE:
DS18B20: VCC-VCC DS-P15 GND-GND
OLED
VCC-VCC SCL-P20 SDA-P21BUZZER
GND-GND IN-P22JIAREPIAN
GND-GND IN-P23KEY
GREEN LED
RED LED
*/
cpp展开代码int main( void )
{
    unsigned char   dis[10];
    unsigned char   time_cyc = 0;
    WDTCTL = WDTPW + WDTHOLD;               /* Stop WDT */
    if ( CALBC1_8MHZ == 0xFF )              /* If calibration constant erased */
    {
        while ( 1 )
            ;                       /* do not load, trap CPU!! */
    }
    DCOCTL  = 0;                            /* Select lowest DCOx and MODx settings */
    BCSCTL1 = CALBC1_8MHZ;                  /* Set range */
    DCOCTL  = CALDCO_8MHZ;                  /* Set DCO step + modulation * / */
    /* 初始化显示 */
    OLED_Init();                            /* OLED初始化 */
    OLED_ShowString( 0, 0, "DS18B20:" );
    OLED_ShowString( 0, 4, "SET:" );
    display_set_temp();
    /* 10MS */
    CCTL0   = 0;                            /* CCR0 interrupt enabled */
    CCR0    = 10000;                        /* 10ms */
    TACTL   = TASSEL_2 + MC_2 + ID_3;       /* SMCLK, contmode */
    _EINT();
    /*按键端口 */
    P1DIR   &= ~BIT3;
    P1SEL   &= ~BIT3;
    P1SEL2  &= ~BIT3;
    P1REN   |= BIT3;
    P1OUT   |= BIT3;
    /* 绿灯端口 */
    P1DIR |= BIT6;
    /* 红灯端口 */
    P1DIR |= BIT0;
    /* 蜂鸣器端口 PWM:当TA1CCR1=500 蜂鸣器响,当TA1CCR1=0,蜂鸣器不响 */
    P2DIR       |= BIT2;
    P2SEL       |= BIT2;
    /* 加热片端口 */
    P2DIR |= BIT3;
    while ( 1 )
    {
        CCTL0 = CCIE;
        LPM0;
        time_cyc = (time_cyc + 1) % 30;
        if ( time_cyc == 1 )                                    /* 30 个10ms执行一次 */
        {
            temp_value  = get_one_temperature();        /* 读取温度 */
            dis[0]      = temp_value % 1000 / 100 + '0';
            dis[1]      = temp_value % 100 / 10 + '0';
            dis[2]      = '.';
            dis[3]      = temp_value % 10 + '0';
            dis[4]      = 'C';
            dis[5]      = 0;
            OLED_ShowString( 0, 2, dis );
        }
        /* 以下是根据温度控制 */
        if ( temp_value > (set_temp + 10) )             /* 3 实际温度高于(临界值+1)后绿灯亮表示降温。 */
        {
            P1OUT   |= BIT6;                        /* 高电平 绿灯点亮 */
            P2OUT   |= BIT3;                        /* 加热片不工作 */
            OLED_ShowString( 0, 6, "cooling" );
        }else if ( temp_value < (set_temp - 10) )       /* 4 实际温度低于(临界值-1)后加热片工作表示加热。 */
        {
            P1OUT   &= ~BIT6;                       /* 绿灯不亮 */
            P2OUT   &= ~BIT3;                       /* 低电平 加热片工作 */
            OLED_ShowString( 0, 6, "heating" );
        }else  {
            P1OUT   &= ~BIT6;                       /* 绿灯不亮 */
            P2OUT   |= BIT3;                        /* 加热片不工作 */
            OLED_ShowString( 0, 6, "        " );
        }
        /* 5 实际温度高于35摄氏度无源蜂鸣器报警。 */
        if ( temp_value > 350 )
        {
            TA1CCR1 = 500;                          /* PWM占空比 500/1000  蜂鸣器响 */
        }else  {
            TA1CCR1 = 0;
        }
        /* 6 设置温度时候,临界值高于30摄氏度,红灯亮,提醒避免设置温度过高。 */
        if ( set_temp > 300 )
        {
            P1OUT |= BIT0;                          /* 高电平 红灯点亮 */
        }else  {
            P1OUT &= ~BIT0;
        }
        /* 以下是按键处理   2 显示临界值,按键可以加减临界值,临界值在20~35之间可调。 */
        if ( time_key == 0 )
        {
            if ( double_key_ifg == 0 )
            {
                if ( (P1IN & BIT3) == 0 )
                {
                    while ( (P1IN & BIT3) == 0 )
                        ;               /* 当循环 等待按键松开 */
                    time_key    = 10;   /* 时间内双击按键检测 */
                    double_key_ifg  = 1;
                }
            }else  {
                double_key_ifg = 0;             /*上次按过 这次恢复到0 是单击 */
                /* 单击按键处理 */
                if ( set_temp < 350 )
                {
                    set_temp += 10;
                }
                display_set_temp();
            }
        }else  {
            if ( double_key_ifg == 1 )      /*上次按过 时间内再次按了 */
            {
                if ( (P1IN & BIT3) == 0 )
                {
                    while ( (P1IN & BIT3) == 0 )
                        ;       /* 当循环 等待按键松开 */
                    double_key_ifg  = 0;
                    time_key    = 0;
                    /* 双击按键处理 */
                    if ( set_temp > 200 )
                    {
                        set_temp -= 10;
                    }
                    display_set_temp();
                }
            }
        }
    }
}
cpp展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2



本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!