一、任务目标
实现温度报警器
二、功能分析
温度报警功能的实现涉及的主要是温度的采集和报警形式的选择。
根据现有的模块资源,温度的采集通过18B20温度传感器模块式;
报警形式可以通过板载的LED实现:目前有一个单独LED(红色)用于开启显示,一个RGB LED灯,用于状态展示(红色指示超温,黄色指示过温,绿色指示正常)实现光报警;开发套件中提供了一个有源蜂鸣器,用于声报警,两种报警频率对应两种过温状态;再结合课程2中用到的数码管用于实时温度的显示。
三、硬件原理分析
本课程搭配的新模块主要是18B20温度传感器模块,有源蜂鸣器模块。
咱们先了解一下有源蜂鸣器模块:

本模块式通过一个S8550三极管进行驱动,当IO口输入低电平时蜂鸣器响,所以控制蜂鸣器只需要1个引脚就可以。
接下来看一看18B20温度传感器:

模块中应该对数据线已经上拉了电阻,并且配备了一个LED来指示供电状态。
18B20是一种“单总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,18B20是一种新型的、体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。18B20在使用中不需要任何外围元件,全部传感器元件及转换电路集成在一只形如三极管的集成电路内,测量结果直接输出数字温度信号,以“一根总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。传感器的管脚顺序从左到右排列:管脚1为GND,管脚2为数据DQ,管脚3为VDD。如果传感器插反,电源将短路,传感器会发烫,容易损坏。
由于DS18B20是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证数据的完整性。DS18B20时序包括:初始化时序、写(0和1)时序、读(0和1)时序。DS18B20发送所有的命令和数据都是字节的低位在前。
四、软件分析
本节课程的软件设计方面主要是18B20的驱动设计和报警判断程序。
驱动设计
初始化程序-复位和存在脉冲
与DS18B20的所有通信都从一个初始化序列开始,该序列包含一个复位脉冲从主控制器发出,然后是DS18B20的存在脉冲。当DS18B20发送在场脉冲响应复位,它是指示主人它是开着的公共汽车准备开动了。在初始化过程中,总线主通过拉动单总线来传输(TX)复位脉冲最低480μs。然后总线主释放总线并进入接收模式(RX)。当总线被释放时,5kΩ上拉电阻将单总线拉高。当DS18B20检测到这个上升沿,它等待15μs到60μs,然后通过拉低1线总线发送一个存在脉冲60 ~ 240μs。

写入时间段
有两种写时间段:“写1”时间段和“写0”时间段。总线主机使用“写1”时隙向DS18B20写入逻辑1,使用“写0”时隙向DS18B20写入逻辑0。所有写时隙的持续时间必须至少为60μs,每个写时隙之间的恢复时间必须至少为1μs。这两种类型的写时隙都是由主机拉低1-Wire总线发起的(参见图14)。为了生成一个Write 1时隙,在将1-Wire总线拉低后,总线主必须在15μs内释放1-Wire总线。当总线被释放时,5kΩ上拉电阻将把总线拉高。要生成一个Write 0时隙,在拉低1-Wire总线后,总线主必须在时隙的持续时间内(至少60μs)保持总线的低电平。
DS18B20在主端启动写时隙后的15 ~ 60μs窗口内对1线总线进行采样。如果在采样窗口期间总线是高的,一个1被写入DS18B20。如果线路低,则写入一个0到DS18B20。

驱动代码如下:
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0x44);
}
uint16_t DS18B20_GetTemp(void)
{
uint16_t tem;
uint8_t temp,TH,TL;
DS18B20_Start();
DS18B20_Rst();
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;
tem=(float)tem*0.625;
if(temp) return tem;
else return -tem;
}功能实现中在定时器中断中进行采集和判断,蜂鸣器的不同频率也是通过定时器实现的:
if(LED.Mode_On_Off == 1)
{
LED.Upcnt++;
if(LED.Upcnt%(50*(LED.Mode_speed+1)) == 0)
{
if(LED.UpFlag == 1)
Buzzer_toggle;
LED.Upcnt = 0;
}
}
if(Digital.Mode_On_Off == 1)
{
Digital.Upcnt++;
if(Digital.Upcnt%50 == 0)
{
Digital.Upcnt = 0;
temp = DS18B20_GetTemp();
Data_Split(temp);
if(temp<270)
{
LED2_Green_SET;
LED2_Red_RESET;
LED.UpFlag = 0;
Buzzer_SET;
}
else if(temp>=270 && temp<290)
{
LED2_Green_SET;
LED2_Red_SET;
LED.Mode_speed = 2;
LED.UpFlag = 1;
}
else
{
LED2_Green_RESET;
LED2_Red_SET;
LED.Mode_speed = 0;
LED.UpFlag = 1;
}
}
}五、实验结果
中级报警:

高级报警:

我要赚赏金
