这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 课程3任务1--利用数码管和温度传感器,蜂鸣器实现温度报警器

共5条 1/1 1 跳转至

课程3任务1--利用数码管和温度传感器,蜂鸣器实现温度报警器

菜鸟
2024-06-09 15:34:46     打赏

(一)任务概述

本次主要是以自我提升的态度来参加本次TI的活动,自己在学校上课也在学习MSPM0系列单片机,感谢EEPW提供的这次机会,让我能够巩固拓展自己的知识。这次作业的主要是接着上节课数码管的基础之上,利用温度采集模块进行温度的采集,并将其显示在数码管上,同时利用蜂鸣器,让其温度在高于一定程度时能够实现报警的功能。本次使用的开发板是MSPM0系列的L1306,使用的软件是CCS THEIA.

(二)原理介绍

1.数码管简单回顾

image.png


2.温度采集模块介绍

DS18B20是一种数字式温度传感器,由Maxim Integrated公司生产。它可以测量环境温度,精度为±0.5°C,在-10°C到+85°C的范围内有效。DS18B20采用一根单根的连接线,通过一线控制总线进行数据传输。它具有低功耗特性和4-pin封装,适用于各种应用场合,如电子设备、工业控制系统和汽车领域等。DS18B20可以通过ROM中的唯一64位序列号进行地址编程,用于多个传感器在同一总线上运行,方便使用和管理。

在这里插入图片描述


DS18B20一共有三个引脚,分别是:

  • GND:电源地线

  • DQ:数字信号输入/输出端。

  • VDD:外接供电电源输入端。

  • 注意这个上拉电阻是一定要配置的。



3.蜂鸣器介绍


        1. 有源蜂鸣器:有源蜂鸣器需要外部电源来驱动,一般通过接通电源使内部的震荡器产生声音。有源蜂鸣器通常可以产生声音的频率范围更广,声音更响亮,但也需要较高的电压和电流。

        2. 无源蜂鸣器:无源蜂鸣器是一种内部集成振荡器的器件,不需要外部电源驱动。当电压施加到蜂鸣器上时,内部振荡器会自动振动产生声音。无源蜂鸣器一般功耗低,但声音较小且频率范围较窄。


image.png



image.png


4.硬件接线图

image.png



(三)syscfg配置

syscfg是一个系统配置工具,用于配置和管理嵌入式系统的各种参数和设置。syscfg工具可以帮助开发人员在CCS中轻松地配置系统的各种参数,包括时钟设置、引脚配置、外设功能等。通过syscfg工具,开发人员可以直观地查看和调整系统的配置信息,以满足不同的应用需求。这次我使用的软件是CCS THEIA系列,接下来我将来简单介绍引脚的配置教程与工作。

1.数码管引脚配置及定时器配置

image.png


image.png

2.温度采集模块配置

image.png

3.蜂鸣器配置

image.png

(四)核心代码展示

  1. 变量及宏定义

#include "ti/driverlib/dl_gpio.h"  
#include "ti/driverlib/m0p/dl_core.h"  
#include "ti_msp_dl_config.h"  
#include <stdint.h>  
 
//dio -- PA27 : 串行数据输入  
//SCLK-- PA26 :移位时钟  
//RCLK-- PA13 :并行寄存器锁存时钟  
 
uint8_t Disp_DX[ 16 ]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //段显  
uint8_t Disp_PX[  8 ]={1,2,3,4,5,6,7,8};   //片选  
#define DigitPoint 0x7F //小数点  
  
#define HC595_DAT(x)  ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_DIO_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_DIO_PIN)))  
#define HC595_CLK(x)  ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_SCLK_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_SCLK_PIN)))  
#define HC595_RCK(x)  ((x)?(DL_GPIO_setPins(HC595_PORT, HC595_RCLK_PIN)) : (DL_GPIO_clearPins(HC595_PORT, HC595_RCLK_PIN)))  
 
/* 蜂鸣器相关宏定义 */  
#define BeepON  DL_GPIO_clearPins(BEEP_PORT, BEEP_BEEP_PIN_PIN);  
#define BeepOFF DL_GPIO_setPins(BEEP_PORT, BEEP_BEEP_PIN_PIN);  
 
#define DS18B20_DQ_OUTH DL_GPIO_setPins(DS18B20_PORT, DS18B20_DQ_PIN)    
#define DS18B20_DQ_OUTL DL_GPIO_clearPins(DS18B20_PORT, DS18B20_DQ_PIN)    
#define DS18B20_DQ_READ DL_GPIO_readPins(DS18B20_PORT, DS18B20_DQ_PIN)    
   
#define DS18B20_DQ_IN DL_GPIO_initDigitalInput(DS18B20_DQ_IOMUX);DL_GPIO_disableOutput(DS18B20_PORT, DS18B20_DQ_PIN)    
#define DS18B20_DQ_OUT DL_GPIO_initDigitalOutput(DS18B20_DQ_IOMUX);DL_GPIO_enableOutput(DS18B20_PORT, DS18B20_DQ_PIN)   

#define delay_us_cycle   32   
 
uint8_t  TimerCnt = 0;  
uint16_t TmpVal = 999;  
float realTemp = 0.0;  
 
uint16_t testData = 0;



2.DS18B20代码(部分参考于网络)

/* 延时函数 */  
void inline delay_us(uint16_t us)  
{  
    do{  
        delay_cycles(delay_us_cycle);  
    }while (us --);  
}  
 
/* 复位芯片 */  
static void DS18B20_Rst(void)        
{        
    DS18B20_DQ_OUT;        
    DS18B20_DQ_OUTL;    /* 拉低DQ,复位 */        
    delay_us(750);      /* 拉低750us */        
    DS18B20_DQ_OUTH;    /* DQ=1, 释放复位 */        
    delay_us(15);       /* 延迟15US */        
}  
/* 检查总线上是否存在温度芯片 */  
uint8_t DS18B20_Check(void)    
{    
  uint8_t retry = 0;    
  DS18B20_DQ_IN;    
  while (DS18B20_DQ_READ && retry < 200)    
  {    
    retry++;    
    delay_us(1);    
  };    
  if (retry >= 200)    
    return 1;    
  else    
    retry = 0;    
  while (!DS18B20_DQ_READ && retry < 240)    
  {    
    retry++;    
    delay_us(1);    
  };    
  if (retry >= 240)    
    return 1;    
  return 0;    
}    
/* 芯片初始化 */  
uint8_t DS18B20_Init(void)    
{    
  DS18B20_Rst();    
  return DS18B20_Check();    
}    
/* 读取单bit数据 */  
uint8_t DS18B20_Read_Bit(void)  
{    
  DS18B20_DQ_OUT;    
  uint8_t data;    
  DS18B20_DQ_OUTL;    
  delay_cycles(2 * 32);  
  DS18B20_DQ_OUTH;    
  delay_cycles(12 * 32);  
  DS18B20_DQ_IN;    
  if (DS18B20_DQ_READ)    
    data = 1;    
  else    
    data = 0;    
  delay_cycles(50 * 32);    
  return data;    
}    
/* 读取一字节数据 */  
uint8_t DS18B20_Read_Byte(void)
{    
  uint8_t i, j, dat;    
  dat = 0;    
  for (i = 1; i <= 8; i++)    
  {    
    j = DS18B20_Read_Bit();    
    dat = (j << 7) | (dat >> 1);    
  }    
  return dat;    
}  
/* 写入一字节数据 */  
void DS18B20_Write_Byte(uint8_t dat)    
{    
  uint8_t j;    
  uint8_t testb;    
  DS18B20_DQ_OUT;    
  for (j = 1; j <= 8; j++)    
  {    
    testb = dat & 0x01;    
    dat = dat >> 1;    
    if (testb)    
    {    
      DS18B20_DQ_OUTL;  
      delay_us(2);  
      DS18B20_DQ_OUTH;    
      delay_us(60);  
    }    
    else    
    {    
      DS18B20_DQ_OUTL;  
      delay_us(60);  
      DS18B20_DQ_OUTH;    
      delay_us(12);  
    }    
  }    
}  
/* 启动芯片 */  
void DS18B20_Start(void)  
{    
  DS18B20_Rst();    
  DS18B20_Check();    
  DS18B20_Write_Byte(0xcc);
  DS18B20_Write_Byte(0x44);    
}  
 
float DS18B20_Get_Temp(void)    
{    
  uint8_t temp;    
  uint8_t TL, TH;    
  int16_t tem;    
  float fValue = 0.0;  
  DS18B20_Start();
  DS18B20_Rst();    
  DS18B20_Check();    
  DS18B20_Write_Byte(0xcc);  
  DS18B20_Write_Byte(0xbe);  
  TL = DS18B20_Read_Byte();
  TH = DS18B20_Read_Byte();
   
  if (TH > 7)    
  {    
    TH = ~TH;    
    TL = ~TL;    
    temp = 0; // 温度为负    
  }    
  else    
    temp = 1; // 温度为正    
  tem = TH;   // 获得高八位    
  tem <<= 8;    
  tem += TL;                // 获得低八位    
  fValue = (float)tem * 0.0625; // 转换    
  if (temp)    
    return fValue; // 返回温度值    
  else    
    return -fValue;    
}  
 
 
/* 数码管相关功能函数 */  
/* 开启数码管输出 */  
void Display_Out()  
{  
    HC595_RCK(0);  
    delay_cycles(100);  
    HC595_RCK(1);  
    delay_cycles(100);  
}  
 
/* 串行数据写入 */  
void HC595_WriteData(uint8_t data)  
{  
    uint8_t i;  
    for(i = 0; i < 8; i++)  
    {  
        if(data&0x80)  
        {  
            HC595_DAT(1);  
        }  
        else  
        {  
            HC595_DAT(0);  
        }  
        data <<=1;  
        delay_cycles(100);  
        HC595_CLK(0);  
        delay_cycles(100);  
        HC595_CLK(1);  
        delay_cycles(100);  
    }  
}  
 
/* 按位点亮数码管 */  
void HC595_SEND_DATA(uint8_t disp_num, uint8_t disp_bit)  
{  
    HC595_WriteData(disp_num);  
    HC595_WriteData(1<<disp_bit);  
    Display_Out();  
}

3.主函数

int main(void)  
{  
    SYSCFG_DL_init();  
 
    DL_GPIO_setPins(BEEP_PORT, BEEP_BEEP_PIN_PIN);  
 
    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);  
 
    while (1)
     {  
        Disp_Temp(realTemp);  
    }  
}  

void TIMER_0_INST_IRQHandler(void)  
{  
    switch(DL_Timer_getPendingInterrupt(TIMER_0_INST)){  
        case DL_TIMER_IIDX_ZERO:  
        TimerCnt ++;  
        if(TimerCnt >= 25)  
        {  
            TimerCnt = 0;  
            realTemp = DS18B20_Get_Temp();//温度数据一秒读取一次  
 
            /* 温度判断 超过30报警 */  
            if (realTemp > 30.0) {  
                BeepON;  
            }  
            else {  
                BeepOFF;  
            }  
        }  
        break;  
 
        default:  
            break;  
    }  
}

(五)总结

通过这个项目,我学会了如何使用DS18B20温度传感器进行数据采集,并且将数据显示在数码管上,同时实现了高温报警功能。这为我积累了更多的嵌入式系统开发经验。这个项目不仅帮助我提升了技术水平,还具有很高的实用性。将所学到的知识应用到实际的环境温度监测中,通过数码管和蜂鸣器实时监控和报警,体现了创造性和实用性,以后会更加努力学习单片机知识。










关键词: 课程     任务    

高工
2024-06-10 16:09:20     打赏
2楼

谢谢分享


专家
2024-06-10 19:33:03     打赏
3楼

谢谢分享


工程师
2024-06-13 08:31:01     打赏
4楼

学习了。谢谢分享。


院士
2024-06-16 12:08:36     打赏
5楼

谢谢分享,学习了


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]