找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7232|回复: 4
收起左侧

51单片机简易温度控制器设计与制作

[复制链接]
ID:573686 发表于 2019-6-27 20:07 | 显示全部楼层 |阅读模式
1.基于AT89C52单片机和DS18B02温度测量接口的温度控制调节完整电路;
2.采用4位共阳极数码管显示设定温度值与实际温度值(℃);
3.利用蜂鸣器实现达到预设温度的报警

2 总体方案设计

2.1 硬件方案

图1.1系统结构框图


图1.1为简易温度控制器的系统结构框图,由键盘,DS18B20温度采集接口,数码管,蜂鸣器,继电器连接加热设备组成。。

2.1.1.温度检测部分

采用美国DALLAS半导体公司的DS18B20智能型温度传感器,使用方便、接口简单,与CPU通信采用并口通信方式。

  • 测量范围:-55~125℃(在-10~85℃范围内测量误差为±0.5℃;12位分辨率时,最多750ms完成温度值的数字转换,温度分辨率为0.0625

结构:该器件有3个引脚:输入/输出引脚及电源和地;内部有三个主要器件:64位ROM、温度传感器和报警触发器。

  • 电源连接:该器件可由外部5V电源VDD供电,也可以从单总线上取得电源。

图1.2 DS18B20内部结构

图1.3 DS18B20封装图

2.1.2.显示部分

显示模块电路采用4个共阳极八位数码管显示。位选口为单片机 P1.0~P1.3 I/O口,四个数码管共用一组段选口为单片机 P0~P7 I/O口。采用动态显示方法。电路如图1.4所示:

图1.4 数码管电路图


2.1.3.键盘部分

键盘部分采用单一按键形式,设置两个键:加1键、减1键用来调节温度显示。

图1.5 键盘电路图

2.1.4.温度控制部分

继电器

2.2 软件方案

2.2.1.主程序

主要功能是完成DS18的初始化工作,并进行读温度,将温度转化为压缩BCD码并在显示器上显示传感器实际温度。


2.2.2.读出温度子程序

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写,其程序框图如下图所示:

图2.1系统程序框图


3 硬件设计与实践
3.1 测量电路

本系统由主控模块、信号显示模块、温度检测模块、报警模块、设定报警温度和自动调温6个模块。


3.2 硬件连接

图3.2硬件连接



3.2.1温度检测

                    

模数转换器ADC0808引脚图

  电压信号模拟温度信号,通过ADC0808的转换,将模拟信号变成数字信号传输给AT89C52单片机.单片机根据程序做出反应,控制各个引脚输出相应高低电平信号使外围模块做出相应的反应,从而达到当温度超出或低于温度上限时蜂鸣器报警,且指示灯点亮,继电器闭合。


4 软件设计与实践

4.1 主程序
  1. void main(void)
  2. {
  3.               unsigned char c=0;
  4.               unsigned char c0=0;
  5.               unsigned long ldata=2500;                            //作为显示的数据            
  6.               while(1)
  7.               {                                                                      //循环扫描按键及显示
  8.                             c0=c;
  9.                             c=ReadTemperature();
  10.                             c=(c/7);
  11.                             ldata=(ldata-c0+c);
  12.                             switch(ReadKey())
  13.                             {                                                                                                                //读取键值做以下相应处理
  14.                             case 1:ldata=ldata+100;                                          //1键显示内容加1
  15.                                           break;
  16.                             case 2:ldata=ldata-100;                                          //2键显示内容减1
  17.                                           break;
  18.                             case 3:ldata=c;                            //3键显示内容清0
  19.                                           break;
  20.                             }                           

  21.                             display(ldata);                            //显示相应的数值,这里用函数的形式调用显示
  22.                             delay(10);
  23.                             if(c>30)
  24.                                           Warning();
  25.                             else if(c<(ldata/100))
  26.                             {
  27.                                           JDQ=0;
  28.                                           EJG=1;
  29.                                           FMQ=1;
  30.                             }
  31.                             else
  32.                             {            
  33.                                           JDQ=1;
  34.                                           EJG=1;
  35.                                           FMQ=1;
  36.                             }

  37.               }
  38. }
复制代码

4.2 子程序

1.键盘部分

  1. unsigned char ReadKey(void)            
  2. {
  3.               unsigned char lkey=0;
  4.               if((P3&0xe0)!=0xe0){              //检测所有按键是否有按键按下
  5.                             FMQ=0;                                                        //按键按下则蜂鸣器发声
  6.                             delay(10);                                          //有按键按下则延时一段时间,以消除按键拌动
  7.                             if(oldkey!=(P3&0xe0)){//检测按键未松开而且不是之前按下的按健就进入读键值,否则不作处理
  8.                                           oldkey=P3&0xe0;                            //保存当前状态,为下一次扫描做判断,请看上一行                           
  9.                                           if(key1==0)
  10.                                                         lkey=1;                            //第一个键按下复值1
  11.                                           else if(key2==0)
  12.                                                         lkey=2;                            //第二个键按下复值2
  13.                                           else if(key3==0)
  14.                                                         lkey=3;                            //第三个键按下复值3
  15.                             }
  16.               }
  17.               else{
  18.                             oldkey=0xe0;                            //如果都没有按键按下,将复值初始状态
  19.                             FMQ=1;                                                        //无按键按下则退出蜂鸣
  20.               }
  21.               return lkey;
  22. }
  23. 2. 显示部分
  24. void display(unsigned int da)
  25. {
  26.               P0=0XFF;                                          //
  27.               da=da%10000;            
  28.               switch(l_posit){
  29.               case 0:                            //选择千位数码管,关闭其它位
  30.                             SMG_q=1;
  31.                             SMG_b=0;            
  32.                             SMG_s=0;                           
  33.                             SMG_g=0;
  34.                             P0=table[da/1000];              //输出显示内容
  35.                             break;
  36.               case 1:                            //选择百位数码管,关闭其它位
  37.                             SMG_q=0;
  38.                             SMG_b=1;            
  39.                             SMG_s=0;                           
  40.                             SMG_g=0;
  41.                             P0=table[da%1000/100];
  42.                             break;
  43.               case 2:                            //选择十位数码管,关闭其它位
  44.                             SMG_q=0;
  45.                             SMG_b=0;            
  46.                             SMG_s=1;                           
  47.                             SMG_g=0;
  48.                             P0=table[da%100/10];
  49.                             break;
  50.               case 3:                            //选择个位数码管,关闭其它位
  51.                             SMG_q=0;
  52.                             SMG_b=0;            
  53.                             SMG_s=0;                           
  54.                             SMG_g=1;
  55.                             P0=table[da%10];
  56.                             break;
  57.               }
  58.               l_posit++;                            //每调用一次将轮流显示一位
  59.               if(l_posit>3)
  60.                             l_posit=0;              }
复制代码


5 调试及性能分析
5.1调试分析

  本次设计温度控制器根据温度传感器测得的温度值,由软件查询判断是否达到编程设定的值,如果超过温度上限,即预置温度小于当前温度,蜂鸣器响报警,启动风扇以温度值返回到阈值以下;如果温度达到下线阈值,则同样使温度返回。

5.2性能分析

1、对于设计采用89C52单片机作为温度控制的主CPU芯片,系统硬件设备结构简单合理,成本低,实时性好。

2、采用DS18B20作为温度测量接口,它是具有单总线接口的数字温度传感器。该器件具有接线简单,功耗低,体积小等特点。

3、针对采用数码管显示温度值,直观、稳定,易于实现。

4、温度控制器的功能还有待进一步扩充,如高温断电;电路布局、和抗干扰方面。

结    论

本文给出了一种单片机实现简易温度控制系统,克服了传统方法的不足,可以达到低温加热,高温报警的效果。该温度控制系统具有测量温度准,调节温度快的优点。主要通过学习了DS18B02温度测量接口、89C52单片机、数码管显示等知识,查阅了相关资料,简易温度控制器的基本要求,低温上电,高温报警,对温度上下限进行合理地设置,实时显示温度。所设计的系统具有以下功能:

1、对于设计采用89C52单片机作为温度控制的主CPU芯片,系统硬件设备结构简单合理,成本低,实时性好。

2、采用DS18B20作为温度测量接口,它是具有单总线接口的数字温度传感器。该器件具有接线简单,功耗低,体积小等特点。

3、针对采用数码管显示温度值,直观、稳定,易于实现。

4、温度控制器的功能还有待进一步扩充,如高温断电;电路布局、和抗干扰方面。

还有很大的提升空间。


调试系统照片


附录3 程序全文

完整的Word格式文档51黑下载地址:
好莱坞的单片机课程设计报告.doc (2.44 MB, 下载次数: 54)
回复

使用道具 举报

ID:650914 发表于 2019-11-28 09:02 | 显示全部楼层
有没有清晰一点的原理图
回复

使用道具 举报

ID:658226 发表于 2019-12-7 15:19 | 显示全部楼层
有原理图和源程序吗
回复

使用道具 举报

ID:632209 发表于 2020-9-16 11:15 | 显示全部楼层
这里有仿真文件吗
回复

使用道具 举报

ID:869966 发表于 2020-12-29 09:44 | 显示全部楼层
显示第19行有误,怎么改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表