【TB作品】MSP430F5529单片机,火灾报警器,DS18B20温度显示,温控风扇

功能

这段代码是一个基于msp430微控制器的嵌入式系统程序,主要实现了以下功能:

  1. 初始化和配置

    • 初始化了OLED显示屏、DS18B20温度传感器、火焰传感器、风扇(通过PWM控制)和蜂鸣器。
    • 设置了CPU时钟源和分频,以满足各组件的工作需求。
    • 配置了中断服务例程用于定时更新温度显示。
  2. DS18B20温度传感器

    • 定义了一系列函数来初始化DS18B20传感器,并读取温度值。通过单总线协议与DS18B20通信,进行温度转换并读取温度数据。
    • get_one_temperature函数用于读取温度传感器的值,并将其转换为摄氏度的整数值。
  3. 火焰传感器

    • 监测P1.2引脚上的火焰传感器状态。当检测到低电平(表示有火焰)时,蜂鸣器通过改变TA2CCR2的值产生声音警告。无火焰时蜂鸣器关闭。
  4. 风扇控制

    • 根据温度值控制风扇速度。温度低于40°C时不转动,40°C到60°C之间以50%占空比转动,60°C以上全速转动。通过PWM控制风扇的转速。
  5. OLED显示

    • 使用OLED显示屏实时显示系统状态和当前温度。每隔0.5秒,通过中断服务例程更新一次温度显示。
  6. 低功耗管理

    • 在等待下一次温度更新或事件触发时,微控制器进入低功耗模式(LPM0)以节省能源。

综上所述,这个程序设计了一个相对完整的环境监控系统,能够自动检测环境温度、响应火焰存在报警,并根据温度调节风扇转速,同时所有这些信息都会实时显示在OLED屏幕上。

硬件

cpp 复制代码
/*
 * OLED
 * SCL ----------P3.0
 * SDA ----------P3.1
 * VCC ----------3.3V
 * GND  ----------GND
 *
 *
 * DS18B20
 * DATA ----------P1.5
 * VCC ----------3.3V
 * GND  ----------GND
 *
 * 火焰传感器
 * DATA ----------P1.2
 * VCC ----------3.3V
 * GND  ----------GND
 *
 *
 * 风扇
 * 这里是PWM引脚 注意接驱动
 * DATA ----------P2.4
 * VCC ----------3.3V
 * GND  ----------GND
 *
 *
 * 蜂鸣器
 * DATA ----------P2.5
 * VCC ----------3.3V
 * GND  ----------GND
 *
 *

 *
 *
 *
 * 火焰传感器(输出低)检测到火焰蜂鸣器响(没有火焰时蜂鸣器关闭)
 * 没有火焰时蜂鸣器关闭
 *
 * 温度小于40  风扇不转
 * 40到60      占空比50%转
 * 60以上          全速转
 *
 * 显示屏实时显示温度
 *
 *

部分代码

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 |= BIT2; //火焰传感器
    P1OUT |= BIT2;

    DS18b20_Port_Init();

    TA1CTL |= MC_1 + TASSEL_1 + TACLR; /* 10MS 定时 */
    TA1CCR0 = 32768 / 100;
    TA1CCTL0 = CCIE;

    P2DIR |= (BIT4 + BIT5); /* 方向 */
    P2SEL |= (BIT4 + BIT5); /* 第二功能不开 */
    TA2CCR0 = 1000; /* PWM模式    计数到1000  PWM周期就是1MS */
    TA2CCTL1 = OUTMOD_7; /* 模式 */
    TA2CCR1 = 0; /* p2.4  占空比 */
    TA2CCTL2 = OUTMOD_7; /* 模式 */
    TA2CCR2 = 0; /* p2.5 占空比  蜂鸣器 */
    TA2CTL = TASSEL_2 + MC_1 + TACLR; /* smclk, up-down mode, clear TAR  1MHZ */

    OLED_ShowString(0, 1, "     SYSTEM");
    OLED_ShowString(0, 4, "Temp :");

    _EINT(); //打开总中断

    while (1)
    {

        //火焰传感器
        if ((P1IN & BIT2) == 0)
        {
            delay_ms(1);
            if ((P1IN & BIT2) == 0)
            {
                //低电平就是有火焰的情况
                TA2CCR2 = 500; /* p2.5 占空比  蜂鸣器 */

            }
        }

        if ((P1IN & BIT2) == 1)
        {
            delay_ms(1);
            if ((P1IN & BIT2) == 1)
            {
                //高电平就是没有火焰的情况
                TA2CCR2 = 0; /* p2.5 占空比  蜂鸣器 */

            }
        }

        //打开定时器
        TA1CTL |= MC_1 + TASSEL_1 + TACLR; /* 10MS 定时 */
        LPM0; //进入低功耗

    }
}
char counts = 0;
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0()
{
    TA1CTL = 0; //关闭定时器

    counts = (counts + 1) % 50;
    if (counts == 49)
    {
        //0.5s刷新一次温度
        temp_value = get_one_temperature();

        //根据温度改变占空比
        if (temp_value < 400)
        {
            //温度小于40度 不转
            TA2CCR1 = 0;
        }
        else if (temp_value < 60)
        {
            //温度小于60  50%占空比
            TA2CCR1 = 500; //最大值998
        }
        else
        {
            //温度大于60  99%占空比
            TA2CCR1 = 998; //最大值998
        }

        /* 距离存入数组里 */
        count = 0;
        xianshishuzu[count++] = temp_value % 1000 / 100 + '0';
        xianshishuzu[count++] = temp_value % 100 / 10 + '0';
        xianshishuzu[count++] = '.';
        xianshishuzu[count++] = temp_value % 10 / 1 + '0';
        xianshishuzu[count++] = ' ';
        xianshishuzu[count++] = 'C';
        xianshishuzu[count++] = 0;

        /* 显示出来 温度*/
        OLED_ShowString(50, 4, xianshishuzu);

    }

    LPM0_EXIT; //退出低功耗

}

全部代码

cpp 复制代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
相关推荐
FreakStudio42 分钟前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
EVERSPIN4 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
芯橦6 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海10 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu11 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白11 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_11 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人12 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时12 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件
bai_lan_ya12 小时前
stm32定时器中断和外部中断
stm32·单片机·嵌入式硬件