单片机温度报警程序 (51单片机温度报警设计)

第8节介绍了使用 DHT11 温湿度传感器制作温度警报器的方法。相信有的朋友应该看出,警报器是基于一个温度“阈值”的,即只要温度高于 15 摄氏度,就发出警报,整个系统并不关心其他温度值。

使用低成本的热敏电阻

可以看出,按照第8节的方法使用 DHT11 制作温度警报器,其实有些浪费资源,因为 DHT11 能够测量温湿度的绝对值,而系统并没有用到这个功能,仅仅使用了 DHT11 在 15 摄氏度这个点的状态。

单片机实现温度检测需要些什么,51单片机温度报警器设计

那么,更合适的制作温度警报器的方法是什么呢?经过上一节的介绍,我们已经能够使用单片机的 ADC 外设测量电压了,只要再使用一个热敏电阻,就能够解决第8节的需求了。很明显,热敏电阻的价格比 DHT11 的价格便宜多了。

单片机实现温度检测需要些什么,51单片机温度报警器设计

热敏电阻,顾名思义,就是它的阻值会随着温度变化。如下图:

单片机实现温度检测需要些什么,51单片机温度报警器设计

将热敏电阻串入电路,只要使用单片机的 ADC 外设测量热敏电阻两端电压,就可以知道环境温度的相对变化量了。记录温度为 15 摄氏度时的电压值 Vref,之后只要将 ADC 采样的电压值与 Vref 对比,就能知道是否需要报警了。

使用热敏电阻制作温度计

这里为了快速实验,简单将热敏电阻与定电阻串联了,使用 51 单片机的 P1.0 口(即 ADC 通道 0)测量热敏电阻的电压:

单片机实现温度检测需要些什么,51单片机温度报警器设计

参照上一节介绍的 ADC 采样C语言程序:

// 获取 10 位 adc
WORD get_adc_res(BYTE ch)
{
 WORD res = 0;
 res = get_adc_h8bit(ch);
 res <<= 2;
 res |= ADC_LOW2;
 return res;
}
void main()
{
 init_uart(9600);
 adc_init();
 while(1){
 delay_about_100ms(2);
 printf("adc: %0.2f\r\n", 5.0*((float)get_adc_res(0))/1024.0);
 }
}

连接好各个组件:

单片机实现温度检测需要些什么,51单片机温度报警器设计

现在编译程序烧写到单片机,打开电脑端的串口调试软件,可以看出单片机已经能够成功测出热敏电阻的电压值了:

单片机实现温度检测需要些什么,51单片机温度报警器设计

用手捏住热敏电阻,会发现电压值升高了,说明这种方法能够检测环境温度变化。

利用热敏电阻制作温度警报器

在温度为 15 摄氏度时,记录热敏电阻的电压值为 3.88V。因为我使用的这款热敏电阻温度越高阻值越低,相应的 P1.0 测量的电压值也越大。

所以当温度超过 15 摄氏度时,也即单片机测量的电压值大于 3.88V 时,单片机应驱动 LED 小灯执行“闪烁”报警动作。热敏电阻两端的电压低于 3.88V 时,温度正常,单片机应驱动 LED 小灯执行“呼吸灯”动作。

结合前面几节介绍的内容,上面的设计C语言代码应如下实现,请看:

sbit P20 = P2^0;
void delay(unsigned int n)
{
 unsigned int x;
 while(n--){
 x = 50;
 while(x--);
 }
}
void twinkle_once(unsigned char darkTime)
{
 P20 = 0;
 delay(100-darkTime);
 P20 = 1;
 delay(darkTime);
}
void led_breath_1s()
{
 static int cnt = 0;
 static char dark_time = 0, dir = 1 ;
 while(1){
 twinkle_once(dark_time);
 if( 0==((cnt++)%4) ){
 if(dir)
 dark_time += 1;
 else
 dark_time -= 1;
 if(dark_time >= 100)
 dir = 0;
 if(dark_time <= 60)
 dir = 1;
 }
 if(cnt > 200){
 cnt = 0;
 break;
 }
 }
}
void led_twinkle_1s()
{
 char cnt = 5;
 while(cnt--){
 P20 = 1;
 delay(2000);
 P20 = 0;
 delay(2000);
 }
}
void main()
{
 float vol;
 adc_init();
 while(1){
 vol = 5.0*((float)get_adc_res(0))/1024.0;
 if(vol > 3.88)
 led_twinkle_1s();
 else
 led_breath_1s();
 }
}

单片机实现温度检测需要些什么,51单片机温度报警器设计

与驱动 DHT11 相比,上面的C语言程序简单了许多。编译并烧写到单片机,发现因为温度正常,LED 小灯执行的是“呼吸灯”动作。用手捏住热敏电阻,温度升高超出 15 摄氏度阈值后,LED 小灯执行了“闪烁”的报警动作:

单片机实现温度检测需要些什么,51单片机温度报警器设计

至此,我们就使用价格只有几毛钱的热敏电阻完成了“温度警报器”的设计,而第 7 节完成这样的设计使用的 DHT11 至少需要几块钱。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。