微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第49节:利用DS18B20做一个温控器

第49节:利用DS18B20做一个温控器

时间:11-22 来源:互联网 点击:
开场白:
DS18B20是一款常用的温度传感器芯片,它只占用单片机一根IO口,使用起来也特别方便。需要特别注意的是,正因为它只用一根IO口跟单片机通讯,因此读取一次温度值的通讯时间比较长,而且时序要求严格,在通讯期间不允许被单片机其它的中断干扰,因此在实际项目中,系统一旦选用了这款传感器芯片,就千万不要选用动态扫描数码管的显示方式。否则在关闭中断读取温度的时候,数码管的显示会有略微的“闪烁”现象。
DS18B20的测温范围是-55度至125度。在-10度至85度的温度范围内误差是+-0.5度,能满足大部分常用的测温要求。
这一节要教会大家三个知识点:
第一个:大概了解一下DS18B20的驱动程序。
第二个:做温控设备的时候,为了避免继电器在临界温度附近频繁跳动切换,应该设置一个缓冲温差。本程序的缓冲温差是2度。
第三个:继续加深了解按键,显示,传感器它们三者是如何紧密关联起来的程序框架。

具体内容,请看源代码讲解。

(1) 硬件平台.
基于朱兆祺51单片机学习板

(2)实现功能:
本程序只有1个窗口。这个窗口有2个局部显示。
第1个局部是第7,6,5位数码管,显示设定的温度。
第2个局部是第4,3,2,1位数码管,显示实际环境温度。其中第4位数码管显示正负符号位。
S1按键是加键,S5按键是减键。通过它们可以直接设置“设定温度”。
一个LED灯用来模拟工控的继电器。
当实际温度低于或者等于设定温度2度以下时,模拟继电器的LED灯亮。
当实际温度等于或者大于设定温度时,模拟继电器的LED灯灭。
当实际温度处于设定温度和设定温度减去2度的范围内,模拟继电器的LED维持现状,这个2度范围用来做缓冲温差,避免继电器在临界温度附近频繁跳动切换。

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_voice_short40 //蜂鸣器短叫的持续时间
  3. #define const_key_time120 //按键去抖动延时的时间
  4. #define const_key_time220 //按键去抖动延时的时间
  5. #define const_ds18b20_sampling_time 180 //累计主循环次数的时间,每次刷新采样时钟芯片的时间
  6. void initial_myself(void);
  7. void initial_peripheral(void);
  8. void delay_short(unsigned int uiDelayShort);
  9. void delay_long(unsigned int uiDelaylong);
  10. //驱动数码管的74HC595
  11. void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
  12. void display_drive(void); //显示数码管字模的驱动函数
  13. void display_service(void); //显示的窗口菜单服务程序
  14. //驱动LED的74HC595
  15. void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
  16. void T0_time(void);//定时中断函数
  17. void key_service(void); //按键服务的应用程序
  18. void key_scan(void);//按键扫描函数 放在定时中断里
  19. void temper_control_service(void); //温控程序
  20. void ds18b20_sampling(void); //ds18b20采样程序
  21. void ds18b20_reset(); //复位ds18b20的时序
  22. unsigned char ds_read_byte(void ); //读一字节
  23. void ds_write_byte(unsigned char dat); //写一个字节
  24. unsigned int get_temper();//读取一次没有经过换算的温度数值
  25. sbit dq_dr_sr=P2^6; //ds18b20的数据驱动线
  26. sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
  27. sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
  28. sbit led_dr=P3^5;//LED灯,模拟工控中的继电器
  29. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
  30. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  31. sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序
  32. sbit dig_hc595_st_dr=P2^1;
  33. sbit dig_hc595_ds_dr=P2^2;
  34. sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
  35. sbit hc595_st_dr=P2^4;
  36. sbit hc595_ds_dr=P2^5;
  37. unsigned int uiSampingCnt=0; //采集Ds1302的计时器,每秒钟更新采集一次
  38. unsigned char ucSignFlag=0; //正负符号。0代表正数,1代表负数,表示零下多少度。
  39. unsigned long ulCurrentTemper=33; //实际温度
  40. unsigned long ulSetTemper=26; //设定温度
  41. unsigned int uiTemperTemp=0; //中间变量
  42. unsigned char ucKeySec=0; //被触发的按键编号
  43. unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器
  44. unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
  45. unsigned intuiKeyTimeCnt2=0; //按键去抖动延时计数器
  46. unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
  47. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  48. unsigned charucVoiceLock=0;//蜂

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top