找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4699|回复: 2
收起左侧

单片机的温度测量与上限和下限控制系统proteus仿真和源码

[复制链接]
ID:200062 发表于 2017-5-12 20:20 | 显示全部楼层 |阅读模式
显示上限温度:
0.png
0.png


显示实时温度:
0.png
显示下限温度:
0.png

原理图:
psb.png
0.png

单片机源程序如下:
  1. #include "reg51.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit DQ=P1^4;                //温度数据口
  5. sbit wx1=P2^4;                //位选1
  6. sbit wx2=P2^5;                //位选2
  7. sbit wx3=P2^6;                //位选3
  8. sbit wx4=P2^7;                //位选4
  9. sbit sd=P1^2;                //范围与显示开关        =1        范围
  10. sbit sj=P2^1;                //上下界切换                =1        上限
  11. sbit ss=P2^2;                //加1
  12. sbit xj=P2^3;                //减1
  13. sbit bjs=P1^0;                //上限报警
  14. sbit bjx=P1^1;                //下限报警

  15. unsigned int temp, temp1, temp2, xs;
  16. unsigned int sx = 30;
  17. unsigned int xx = 20;

  18. uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,                //共阳极数码管
  19.         0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6};

  20. /*******延时程序*******/
  21. void delay1( unsigned int m )
  22. {        //1ms
  23.         unsigned int i, j;
  24.         for(i = m; i > 0; i--)
  25.                 for(j = 110; j > 0; j--);
  26. }

  27. void delay( unsigned int m )
  28. {        //1us
  29.         while(m--);
  30. }

  31. void Init_DS18B20()
  32. {
  33.         unsigned char x = 0;
  34.         DQ = 1;                        //DQ复位DS18B20通信端口
  35.         delay(8);                //稍作延时
  36.         DQ = 0;                        //单片机将DQ拉低
  37.         delay(80);                //精确延时 大于480us
  38.         DQ = 1;                        //拉高总线
  39.         delay(4);
  40.         x = DQ;                        //稍作延时后,如果x=0则初始化成功,x=1则初始化失败
  41.         delay(20);
  42. }

  43. /*********DS18B20读一个字节*********/
  44. uchar ReadOneChar()
  45. {
  46.         unsigned char i = 0;
  47.         unsigned char dat = 0;
  48.         for(i = 8; i > 0; i--)
  49.         {
  50.                 DQ = 0;                //高电平拉成低电平时读周期开始
  51.                 dat >>= 1;
  52.                 DQ = 1;                //给脉冲信号
  53.                 if(DQ)
  54.                         dat |= 0x80;
  55.                 delay(4);
  56.         }
  57.         return dat;
  58. }

  59. /*********DS18B20写一个字节*********/
  60. void WriteOneChar( unsigned char dat )
  61. {
  62.         unsigned char i = 0;
  63.         for(i = 8; i > 0; i--)
  64.         {
  65.                 DQ = 0;                                //从高电平拉低至低电平,写周期开始
  66.                 DQ = dat & 0x01;        //数据的最低位先写入
  67.                 delay(5);                        //60us到120us延时
  68.                 DQ = 1;
  69.                 dat >>= 1;                        //从最低位到最高位传入
  70.         }
  71. }

  72. /*********读取DS18B20当前温度*********/
  73. void ReadTemperature()
  74. {
  75.         unsigned char a = 0;
  76.         unsigned b = 0;
  77.         unsigned t = 0;
  78.         Init_DS18B20();
  79.         WriteOneChar( 0xCC );                //跳过读序号列号的操作
  80.         WriteOneChar( 0x44 );                //启动温度转换
  81.         delay(5);                                        //
  82.         Init_DS18B20();
  83.         WriteOneChar( 0xCC );                //跳过读序号列号的操作
  84.         WriteOneChar( 0xBE );                //读取温度寄存器等(共可读9个寄存器)前两个就是温度
  85.         delay(5);
  86.         a = ReadOneChar();                        //读取温度值低位
  87.         b = ReadOneChar();                        //读取温度值高位
  88.         temp1 = b << 4;                                //高8位中后三位数的值
  89.         temp1 += ((a & 0xf0) >> 4);        //低8位中的高4位值加上搞8位中后三位数的值 temp1室温整数值
  90.         temp2 = a & 0xf0;                        //小数的值
  91.         temp = ((b*256 + a) >> 4);        //当前采集温度值除16得实际温度值
  92.         xs = temp2*0.0625*10;                //小数位,若为0.5则算5来显示
  93. }

  94. void wenduxianshi()
  95. {
  96.         wx1 = 1;
  97.         P0 = table[temp/10];                //显示十位
  98.         delay1(1);
  99.         wx1 = 0;

  100.         wx2 = 1;
  101.         P0 = table[temp%10] + 0x80;                //显示个位 加上0x80就显示小数点了
  102.         delay1(1);
  103.         wx2 = 0;

  104.         wx3 = 1;
  105.         P0 = table[xs%10];                        //显示小位
  106.         delay1(1);
  107.         wx3 = 0;

  108.         wx4 = 1;
  109.         P0 = table[12];                                //显示C字符
  110.         delay1(1);
  111.         wx4 = 0;
  112. }

  113. void sxxianshi()
  114. {
  115.         wx1 = 1;
  116.         P0 = table[sx/10];                        //显示十位
  117.         delay1(1);
  118.         wx1 = 0;

  119.         wx2 = 1;
  120.         P0 = table[sx%10]+0x80;                //显示个位
  121.         delay1(1);
  122.         wx2 = 0;

  123.         wx3 = 1;
  124.         P0 = table[12];                                //显示小位
  125.         delay1(1);
  126.         wx3 = 0;

  127.         wx4 = 1;
  128.         P0 = table[5];                                //显示C字符
  129.         delay1(1);
  130.         wx4 = 0;
  131. }

  132. void xxxianshi()
  133. {
  134.         wx1 = 1;
  135.         P0 = table[xx/10];                        //显示十位
  136.         delay1(1);
  137.         wx1 = 0;

  138.         wx2 = 1;
  139.         P0 = table[xx%10]+0x80;                //显示个位
  140.         delay1(1);
  141.         wx2 = 0;

  142.         wx3 = 1;
  143.         P0 = table[12];                                //显示小位
  144.         delay1(1);
  145.         wx3 = 0;

  146.         wx4 = 1;
  147.         P0 = table[12];                                //显示C字符
  148.         delay1(1);
  149.         wx4 = 0;
  150. }

  151. void dsx()
  152. {
  153.         if(ss == 0){ delay1(5); if(ss == 1) sx = sx + 1; }
  154.         if(xj == 0){ delay1(5); if(xj == 1) sx = sx - 1; }
  155. }

  156. void dxx()
  157. {
  158.         if(ss == 0){ delay1(5); if(ss == 1) xx = xx + 1; }
  159.         if(xj == 0){ delay1(5); if(xj == 1) xx = xx - 1; }
  160. }

  161. void alarm()
  162. {
  163.         delay1(5);
  164.         if( temp > sx )
  165.                 bjs = 1;
  166.         if( temp < xx )
  167.                 bjx = 1;
  168. }

  169. void normal()
  170. {
  171.         if( temp > xx )
  172.                 bjx = 0;
  173.         if( temp < sx )
  174.                 bjs = 0;
  175. }

  176. void main()
  177. ……………………

  178. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
温度测量与控制系统设计.rar (2.27 MB, 下载次数: 55)
回复

使用道具 举报

ID:82765 发表于 2017-5-14 22:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:717308 发表于 2020-6-6 09:34 来自手机 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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