/*
OLED
SCL ----------P3.0
SDA ----------P3.1
VCC ----------3.3V
GND ----------GND
风扇
DATA ----------P2.4
VCC ----------3.3V
GND ----------GND
DS18B20
DATA ----------P1.5
VCC ----------3.3V
GND ----------GND
功能:
S1 改变占空比为 0 400 600 800
展开代码S2 改变占空比为根据温度变化
展开代码OLED每0.5S刷新一次温度显示
展开代码DS18B20测温
*/
S1 改变占空比为 0 400 600 800 手动档位
S2 自动档位
OLED显示温度
DS18B20测温
cpp展开代码 * S1 改变占空比为  0  400  600  800
 *       S2 改变占空比为根据温度变化
 *       OLED每0.5S刷新一次温度显示
 *       DS18B20测温
cpp展开代码void main(void)
{
    WDTCTL = WDTPW | WDTHOLD; /* Stop watchdog timer */
    P5SEL |= BIT4 + BIT5; /* XT1引脚复用,用作晶振 */
    UCSCTL6 &= ~(XT1OFF + XT2OFF); /* 打开XT1、XT2 */
    P5SEL |= BIT2 + BIT3; /* XT2引脚复用,用作晶振 */
    while (SFRIFG1 & OFIFG) /* 等待晶振正常起振 */
    {
        SFRIFG1 &= ~OFIFG;
        UCSCTL7 &= ~(DCOFFG + XT1LFOFFG + XT2OFFG);
    }
    UCSCTL4 |= SELA__XT1CLK + SELS__XT2CLK + SELM__XT2CLK; /* 时钟源选择   ACLK---XT1CLK   SMCLK---XT2CLK   MCLK---XT2CLK */
    UCSCTL5 |= DIVA__1 + DIVS__4 + DIVM__1; /* 时钟源分频  ACLK/1=32768HZ     SMCLK/4=1MHZ        MCLK/1=4MHZ */
    OLED_Init(); /* OLED初始化 */
    P1DIR |= BIT0; /* LED0 */
    P1OUT |= BIT0;
    P4DIR |= BIT7; /* LED1 */
    P4OUT |= BIT7;
    P1REN |= BIT1; //KEY1
    P1OUT |= BIT1;
    P2REN |= BIT1; //KEY2
    P2OUT |= BIT1;
    DS18b20_Port_Init();
    TA1CTL |= MC_1 + TASSEL_1 + TACLR; /* 10MS 定时 */
    TA1CCR0 = 32768 / 100;
    TA1CCTL0 = CCIE;
    P2DIR |= BIT4; /* 方向 */
    P2SEL &= ~BIT4; /* 第二功能不开 */
    P2OUT |= BIT4; /* 方向 */
    OLED_ShowString(0, 1, "TEMP :");
    OLED_ShowString(0, 3, "POWER:");
    OLED_ShowChar(50, 3, '0', 16);
    _EINT(); //打开总中断
    while (1)
    {
        //按键S1  改变风扇占空比
        if ((P2IN & BIT1) == 0)
        {
            delay_ms(10);
            if ((P2IN & BIT1) == 0)
            {
                while ((P2IN & BIT1) == 0)
                    ;
                fengshansudu = (fengshansudu + 1) % 4; // 0 1  2  3代表不转和三档速度
                if (fengshansudu == 0)
                {
                    P2DIR |= BIT4; /* 方向 */
                    P2SEL &= ~BIT4; /* 第二功能不开 */
                    P2OUT |= BIT4; /* 方向 */
                }
                else
                {
                    P2DIR |= BIT4; /* 方向 */
                    P2SEL |= BIT4; /* 第二功能不开 */
                    TA2CCR0 = 1000; /* PWM模式    计数到1000  PWM周期就是1MS */
                    TA2CCTL1 = OUTMOD_3; /* 模式 */
                    TA2CCR1 = 2; /* 占空比 */
                    TA2CTL = TASSEL_2 + MC_1 + TACLR; /* smclk, up-down mode, clear TAR  1MHZ */
                    TA2CCR1 = 200 + fengshansudu * 200; /* 占空比 */
                }
                P1OUT ^= BIT0; //为了观察
            }
        }
        //按键S2  改变风扇  为 自动档位
        if ((P1IN & BIT1) == 0)
        {
            delay_ms(10);
            if ((P1IN & BIT1) == 0)
            {
                while ((P1IN & BIT1) == 0)
                    ;
                P2DIR |= BIT4; /* 方向 */
                P2SEL |= BIT4; /* 第二功能不开 */
                TA2CCR0 = 1000; /* PWM模式    计数到1000  PWM周期就是1MS */
                TA2CCTL1 = OUTMOD_3; /* 模式 */
                TA2CCR1 = 2; /* 占空比 */
                TA2CTL = TASSEL_2 + MC_1 + TACLR; /* smclk, up-down mode, clear TAR  1MHZ */
                fengshansudu = 4; //代表自动速度
                P4OUT ^= BIT7; //为了观察
            }
        }
        //打开定时器
        TA1CTL |= MC_1 + TASSEL_1 + TACLR; /* 10MS 定时 */
        LPM0; //进入低功耗
    }
}
cpp展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


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