找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19072|回复: 19
收起左侧

单片机数字温度计的 课程设计

  [复制链接]
ID:125453 发表于 2016-6-6 15:57 | 显示全部楼层 |阅读模式
很简单,很基础的,共享给大家
完整的课程设计下载:
数字温度计的设计.doc (525 KB, 下载次数: 190)



随着“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握传感器的基本结构、工作原理及特性是非常重要的。在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持, 其缺点如下:1. 硬件电路复杂;2. 软件调试复杂;3. 制作成本高。为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合传感器技术开发设计,文中把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

关键词: 信息时代 温度传感器 51单片机


目 录


摘 要

目 录

第一章              绪论

1.1   背景
1.2  设计目的
1.2.1掌握温度计,报警系统的设计、组装与调试方法。
1.2.2熟悉仿真软件(proteus)的使用。
1.2.3重点掌握单片机的使用及其各引脚的功能。

第二章 原理分析

2.1原理框图
2.2 原理分析

第三章 实现过程

3.1显示电路
3.2数码管驱动电路
3.3报警电路
3.4数字温度传感器
3.5单片机最小系统电路
3.6 按键电路
3.7数字温度计的实物图
3.8系统板上硬件连钱
3.9 系统调试与分析
3.10 元件清单及程序代码

心得体会




  •      绪论

1.1   背景

在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持, 其缺点如下:1. 硬件电路复杂;2. 软件调试复杂;3. 制作成本高。为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。

1.2 设计目的

1.2.1掌握温度计,报警系统的设计、组装与调试方法。

1.2.2熟悉仿真软件(proteus)的使用。

1.2.3重点掌握单片机的使用及其各引脚的功能。

第二章 原理分析

2.1原理框图

protues仿真图

1.001.jpg

Protues仿真图显示当前温度30℃

2.2 原理分析

整个系统由单片机控制,温度传感器采用18B20。18b20采用单总线方式与单片机相连.把采集到得温度信息传给单片机。单片机采集到的温度输出到四个数码管上进行显示。当四位数码管显示的温度超过上限值时可以实现报警功能。

DS18B20原理与分析

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

1.DS18B20简介

    (1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

    (2)在使用中不需要任何外围元件。

    (3)可用数据线供电,电压范围:+3.0~ +5.5 V。

    (4)测温范围:-55 ~+125 ℃。固有测温分辨率为0.5 ℃。

    (5)通过编程可实现9~12位的数字读数方式。

    (6)用户可自设定非易失性的报警上下限值。

    (7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。

    (8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

DS18B20的测温原理

    DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。

第三章 实现过程

3.1显示电路

四位共阳LED数码管:用来显示温度的大小,可直接读取,温度精确到0.1℃。四位数码管如图所示,从左到右依次是百位,十位,个位,十分位。

1.002.jpg
图 1 数码管

3.2数码管驱动电路

三极管8050:来驱动四位数码管,如下图所示三极管Q1 、Q2 、Q3、Q4。
1.003.jpg
图 2 三极管8050

3.3报警电路

三极管8550驱动蜂鸣器:如下图所示三极管Q6来驱动蜂鸣器BUZ1。
1.004.jpg
图 3 三极管8550、蜂鸣器BUZ1

3.4数字温度传感器

数字温度传感器DS18B20:如下图所示
1.005.jpg
图 4  DS18B20

3.5单片机最小系统电路

单片机最小化系统:如下图所示系统工作时,最小化系统运行。

1.006.jpg
图 5 最小化系统

3.6 按键电路

按键:如图所示按键K1为进入/退出设置键;K2为增加键;K3为减少键。

1.007.jpg

图 6  按键

   3.7数字温度计的实物图

数字温度计显示当前温度25.7℃

I 1.008.jpg

图7 数字温度计实物图

3.8系统板上硬件连钱

1). 把“单片机系统“区域中的P0.0-P0.7端口用8芯排线依次连接到数码管A-DP端口上;

(2). 把“单片机系统”区域中的P3.0-P3.2端口用线连接到按键K1-K3的一端上,如图表7所示,其他所有连线按图表7连接即可。

(3)把单片机的P2.0端口接数码管的位选3,P2.1端口接数码管的位选2,P2.2端口接数码管的位选1,P2.3端口接数码管的位选4。

(4).电源可用外接电源(用手机充电器可做电源),但必须申明电源小于+5V当然也不能太小

3.9 系统调试与分析

在系统制作和调试过程中遇到了不少问题,下面是具体问题与解决方法。
  • 4个数码管显示一样
检查之后发现原来是4个8550三极管管脚接错,改正之后该问题即解决了。
②4个数码管亮度不一样
8550管脚改正过后,显示不一样了,但4个数码管亮度不一样。当某一个数码管显示的字段较少,比如“1”时,亮度较强,但是当显示的字段较多比如“8”时,亮度较暗。分析其原因是:共阴数码管限流电阻用在控制位选的共阴极的输入端,这样当显示“1”时,电流相对集中,显示“8”字段较多,电流分配后较小,因此“1”显示时比显示“8”时亮。
解决方法:减小这里的限流电阻,使其流入数码管的电流变的很大,这样在较大电流时,即使字段多的电流较小,也比原来大了。这样就减小了差距,虽然还是有差距但已不太明显。

3.10 元件清单及程序代码

元件清单:

单片机AT89C52:1个

     40引脚底座:1个

     DS18B20:1个

     蜂鸣器:1个
     三极管:8050  5个;8550  1个
     电阻:1k  6个;10K   1个
    电容:极性电容10uf   1个;瓷片电容10pf  2个
    按键:3个
晶振:1个
四位共阳数码管:1个
程序代码:
  1. #include

  2. #define uchar unsigned char

  3. #define uint unsigned int

  4. sbit d1=P2^2;

  5. sbit d2=P2^1;

  6. sbit d3=P2^0;

  7. sbit d4=P2^3;

  8. sbit key1=P3^0;

  9. sbit key2=P3^1;

  10. sbit key3=P3^2;

  11. sbit beep=P3^3;

  12. sbit DS=P1^2;

  13. sbit ACC_7=ACC^7;

  14. uint count=1000,alarm=300;

  15. uchar shu;

  16. uchar shi,fen,ri,yue,nian,xq,miao,ss;      

  17. uint temp;             // 温度变量

  18. uchar flag;

  19. uchar code tab[]=

  20. {0xc0,0xf9,0xa4,0xb0,

  21. 0x99,0x92,0x82,0xf8,

  22. 0x80,0x90

  23. };

  24. uchar code tab1[]=//小数点点亮

  25. {0x40,0x79,0x24,0x30,

  26. 0x19,0x12,0x02,0x78,0x00,0x10

  27. };

  28. void delay(uint z)

  29. {

  30.               uint x,y;

  31.               for(x=z;x>0;x--)

  32.                             for(y=120;y>0;y--);

  33. }

  34. void dsreset()//发复位

  35. {     

  36.               uint i;

  37.               DS=0;

  38.               i=103;

  39.               while(i>0)i--;

  40.               DS=1;

  41.               i=4;

  42.               while(i>0)i--;

  43. }

  44. uchar tmpread()   //读取一字节

  45. {

  46.               uchar j,k,dat;

  47.               uint i;

  48.     for(j=1;j<=8;j++)

  49.     {

  50.                   DS=0;i++;          //延时

  51.                   DS=1;i++;i++;

  52.                             k=DS;

  53.                   i=8;while(i>0)i--;

  54.                             dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里

  55.     }

  56.     return(dat);

  57. }

  58. void tmpwritebyte(uchar dat)   //写一个字节

  59. {

  60.     uint i;

  61.     uchar j;

  62.     bit testb;

  63.     for(j=1;j<=8;j++)

  64.     {

  65.                   testb=dat&0x01;

  66.                   dat=dat>>1;

  67.                   if(testb)     //写 1

  68.                                 {

  69.                                   DS=0;

  70.                                   i++;i++;

  71.                                   DS=1;

  72.                                   i=8;while(i>0)i--;

  73.                                 }

  74.     else

  75.     {

  76.               DS=0;       //写 0

  77.               i=8;while(i>0)i--;

  78.               DS=1;

  79.               i++;i++;

  80.     }

  81.   }

  82. }

  83. void tmpchange()  //DS18B20温度变换

  84. {

  85.               dsreset();

  86.               delay(1);

  87.               tmpwritebyte(0xcc);  //跳过读取内存rom

  88.               tmpwritebyte(0x44);  //开始转换

  89. }

  90. uint tmp()               //读取温度

  91. {

  92.               float tt;

  93.               uchar a,b;

  94.               dsreset();

  95.               delay(1);

  96.               tmpwritebyte(0xcc);

  97.               tmpwritebyte(0xbe);

  98.               a=tmpread(); //a为低字节8位

  99.               b=tmpread(); //b为高字节8位

  100.               temp=b;     //temp为温度值UINT 16bit

  101.               temp<<=8;             //两个字节组合到一起

  102.               temp=temp|a;   

  103.               if(b>127)

  104.               {

  105.               flag=1;

  106.               ss=flag;

  107.               temp=~temp+1;

  108.               }

  109.               tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数

  110.               temp=tt*10+0.5; // 扩大十倍取出了第一位小数

  111.               return(temp);

  112. }

  113. void displayTemp(uint temp)   //显示温度程序

  114. {

  115.               uchar ge,shi,bai,qian,ser;

  116.               d1=0;

  117.               d1=0;

  118.               d3=0;

  119.               d4=0;

  120.               dsreset();

  121.               ser=temp/10;     //分离出三位要显示的数字

  122.               SBUF=ser;

  123.               qian=temp/1000;

  124.               bai=temp/100%10; // 百位数字

  125.               shi=temp/10%10;   // 十位数字

  126.               ge=temp%10;   // 个位数字

  127.               if(flag==1)

  128.               {

  129.                             flag=0;

  130.                             P0=0xbf;

  131.                             d1=1;

  132.                             delay(2);

  133.                             d1=0;

  134.               }

  135.               if(qian!=0)

  136.               {

  137.                             P0=tab[qian];

  138.                             d1=1;

  139.                             delay(2);

  140.                             d1=0;            

  141.               }

  142.               else

  143.               {

  144.                             P0=0xff;

  145.                             d1=1;

  146.                             delay(2);

  147.                             d1=0;            

  148.               }

  149.               if(temp>99)

  150.               {

  151.                             P0=tab[bai];

  152.                             d2=1;

  153.                             delay(2);

  154.                             d2=0;

  155.               }

  156.                             P0=tab1[shi];

  157.                             d3=1;

  158.                             delay(2);

  159.                             d3=0;

  160.                             P0=tab[ge];

  161.                             d4=1;

  162.                             delay(2);

  163.                             d4=0;

  164. }

  165. uint keyscan()

  166. {

  167.               if(key1==0)

  168.               {

  169.                             delay(5);

  170.                             if(key1==0)

  171.                             {

  172.                                           while(!key1);

  173.                                           shu++;

  174.                             }

  175.             



  176.               }

  177.                                           if(key2==0)

  178.                                           {

  179.                                                         delay(5);

  180.                                                         if(key2==0)

  181.                                                         {

  182.                                                                       while(!key2);

  183.                                                                       count=count+10;

  184.                                                                       if(shu==2)

  185.                                                                       {

  186.                                                                                     alarm+=10;

  187.                                                                       }

  188.                                                                      

  189.                                                         }

  190.                                           }

  191.                                           if(key3==0)

  192.                                           {

  193.                                                         delay(5);

  194.                                                         if(key3==0)

  195.                                                         {

  196.                                                                       while(!key3);

  197.                                                                       count=count-10;

  198.                                                                                     if(shu==2)

  199.                                                                       {

  200.                                                                                     alarm-=10;

  201.                                                                       }

  202.                                                         }

  203.                                           }

  204.               return(count);



  205. }



  206. void main()

  207. {

  208.               beep=0;

  209.               delay(10);

  210.               while( 1 )

  211.               {

  212.               tmpchange();

  213.               if(shu==0)

  214.               {

  215.                             displayTemp(tmp( ));

  216.               }

  217.               keyscan();

  218.               if(shu==1)

  219.                             {

  220.                                           displayTemp(count);

  221.                             }

  222.               if(shu==2)

  223.               {

  224.                                           displayTemp(alarm);

  225.                             }

  226.               if(shu==3)

  227.               {

  228.                             shu=0;            

  229.                             }

  230.               if(temp>count||(temp<alarm))

  231.               {

  232.               beep=0;



  233.               }

  234.               else

  235.               beep=1;



  236.               }

  237. }



复制代码


评分

参与人数 6黑币 +75 收起 理由
junmoxiao + 5 共享资料的黑币奖励!
去瞧瞧去去去 + 5 绝世好帖!
hellsing + 5 很不错
Maiyan + 5 赞一个!
348652560 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:210644 发表于 2017-6-12 23:37 来自手机 | 显示全部楼层
为什么元件清单上有七个电阻仿真图上却只有六个?
回复

使用道具 举报

ID:211258 发表于 2017-6-15 17:43 | 显示全部楼层
非常好
回复

使用道具 举报

ID:251885 发表于 2017-11-21 14:54 | 显示全部楼层
很棒的论文
回复

使用道具 举报

ID:254845 发表于 2017-11-29 13:22 来自手机 | 显示全部楼层
为什么控制的不是温度计显示的温度
回复

使用道具 举报

ID:261181 发表于 2017-12-13 18:29 | 显示全部楼层
好的不错行啊
回复

使用道具 举报

ID:287721 发表于 2018-3-5 13:55 | 显示全部楼层
楼主啊  这个数字温度计的doc能否发一个给我啊   没黑币  邮箱836764562@qq.com多谢
回复

使用道具 举报

ID:297514 发表于 2018-3-26 21:03 | 显示全部楼层
836764562 发表于 2018-3-5 13:55
楼主啊  这个数字温度计的doc能否发一个给我啊   没黑币  邮箱多谢

发了吗
回复

使用道具 举报

ID:296265 发表于 2018-4-14 10:37 | 显示全部楼层
感觉不错
回复

使用道具 举报

ID:323854 发表于 2018-5-8 15:13 | 显示全部楼层
写得非常好,都列出来了
回复

使用道具 举报

ID:349206 发表于 2018-6-11 12:06 来自手机 | 显示全部楼层
还好能看懂  要做毕业设计的
回复

使用道具 举报

ID:367788 发表于 2018-7-11 15:03 | 显示全部楼层
棒棒棒
回复

使用道具 举报

ID:372443 发表于 2018-7-16 16:41 | 显示全部楼层
大图看不清啊,哪位大佬给发一个啊
回复

使用道具 举报

ID:373768 发表于 2018-7-18 11:00 | 显示全部楼层
很有用的分享
回复

使用道具 举报

ID:399005 发表于 2018-9-17 21:23 | 显示全部楼层
我的数码管怎么不显示
回复

使用道具 举报

ID:576282 发表于 2019-7-2 19:01 | 显示全部楼层
非常不错
回复

使用道具 举报

ID:672212 发表于 2019-12-24 11:26 | 显示全部楼层
很棒!!!!!
回复

使用道具 举报

ID:773523 发表于 2020-6-9 11:07 | 显示全部楼层
为什么我的数码管不亮
回复

使用道具 举报

ID:773419 发表于 2020-6-10 11:12 来自手机 | 显示全部楼层
怎么实现报警哦!
回复

使用道具 举报

ID:775255 发表于 2020-6-10 20:21 | 显示全部楼层
第一句函数reg51.h还是需要写全呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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