找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DS18B20温度上下限控制原理图和源程序

[复制链接]
ID:210077 发表于 2017-6-11 13:27 | 显示全部楼层 |阅读模式
这是DS18B20温度上下限控制的原理图和源程序

原理图:
0.png
单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <DS18B20.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define SMGIO P0

  7. sbit SET=P1^0;                   //定义设定上下限键
  8. sbit ADD=P1^1;                   //定义增加键
  9. sbit DEC=P1^2;                   //定义减小限键           
  10. sbit SMG1=P2^0;                   //定义数码管第一位
  11. sbit SMG2=P2^1;                   //定义数码管第二位
  12. sbit SMG3=P2^2;                   //定义数码管第三位
  13. sbit SMG4=P2^3;                   //定义数码管第四位
  14. sbit BEEP=P2^5;                   //定义蜂鸣器报警
  15. uint tempValue;                   //变量 存储当前温度值
  16. uint HI_Alarm=30;           //初始上限
  17. uint LO_Alarm=10;           //初始下限
  18. uchar SMG_CC[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7};                  //共阴极数码管0-9编码
  19. uchar SMG_CC_DOT[]={0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x65,0xff,0xf7};          //共阴极数码管0-9编码 带小数点
  20. /********************************************************************/
  21. /*                                                1ms延时                                                                                */
  22. /********************************************************************/
  23. void delayms(uint x)
  24. {
  25. uchar i;
  26. while(x--)
  27. {
  28.   for(i=150;i>0;i--);
  29. }
  30. }

  31. void Display_Temperature()                   //显示温度
  32. {
  33.         char smg1,smg2,smg3,smg4;
  34.         smg1=tempValue/1000;                         //以下表示将温度值拆分开
  35.         smg2=(tempValue-smg1*1000)/100;
  36.         smg3=(tempValue%100)/10;
  37.         smg4=tempValue%10;
  38.         if(tflag==1)                                         //负数显示
  39.                 {
  40.                         SMGIO=SMG_CC[smg4];                //显示小数位
  41.                         SMG4=0;
  42.                         delayms(1);
  43.                         SMG4=1;
  44.                         SMGIO=SMG_CC_DOT[smg3];         //显示个数位
  45.                         SMG3=0;
  46.                         delayms(1);
  47.                         SMG3=1;
  48.                         if(smg2==0)
  49.                         {
  50.                                 SMGIO=0x40;                         //显示十数位
  51.                                 SMG2=0;
  52.                                 delayms(1);
  53.                                 SMG2=1;
  54.                                 SMGIO=0x00;                         //显示百数位
  55.                                 SMG1=0;
  56.                                 delayms(1);
  57.                                 SMG1=1;
  58.                         }
  59.                         else
  60.                         {
  61.                                 SMGIO=SMG_CC[smg2];         //显示十数位
  62.                                 SMG2=0;
  63.                                 delayms(1);
  64.                                 SMG2=1;
  65.                                 SMGIO=0x40;                         //显示十数位
  66.                                 SMG1=0;
  67.                                 delayms(1);
  68.                                 SMG1=1;                                       
  69.                         }
  70.                 }
  71.         else                                //正数显示
  72.                 {
  73.                         SMGIO=SMG_CC[smg4];         //显示小数位
  74.                         SMG4=0;
  75.                         delayms(1);
  76.                         SMG4=1;
  77.                         SMGIO=SMG_CC_DOT[smg3];         //显示个数位
  78.                         SMG3=0;
  79.                         delayms(1);
  80.                         SMG3=1;
  81.                         if(smg1==0)                                 
  82.                         {
  83.                                 SMGIO=0x00;         
  84.                                 SMG1=0;
  85.                                 delayms(1);
  86.                                 SMG1=1;
  87.                                 if(smg2==0)
  88.                                 {
  89.                                         SMGIO=0x00;         
  90.                                         SMG1=0;
  91.                                         delayms(1);
  92.                                         SMG1=1;         
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         SMGIO=SMG_CC[smg2];         
  97.                                         SMG2=0;
  98.                                         delayms(1);
  99.                                         SMG2=1;               
  100.                                 }
  101.                         }
  102.                         else
  103.                         {
  104.                                 SMGIO=SMG_CC[smg1];
  105.                                 SMG1=0;
  106.                                 delayms(1);
  107.                                 SMG1=1;
  108.                                 SMGIO=SMG_CC[smg2];
  109.                                 SMG2=0;
  110.                                 delayms(1);
  111.                                 SMG2=1;
  112.                         }
  113.                         
  114.                 }
  115. }
  116. void Display_HI_Alarm()
  117. {
  118.         SMGIO=0xce;                //显示H
  119.         SMG1=0;
  120.         delayms(1);
  121.         SMG1=1;
  122.         SMGIO=0x80;                //显示-
  123.         SMG2=0;
  124.         delayms(1);
  125.         SMG2=1;

  126.         SMGIO=SMG_CC[HI_Alarm/10];        //显示报警高值十位
  127.         SMG3=0;
  128.         delayms(1);
  129.         SMG3=1;
  130.         SMGIO=SMG_CC[HI_Alarm%10];        //显示报警高值个数位
  131.         SMG4=0;
  132.         delayms(1);
  133.         SMG4=1;        
  134. }
  135. void Display_LO_Alarm()
  136. {
  137.         SMGIO=0x1a;                //显示L
  138.         SMG1=0;
  139.         delayms(1);
  140.         SMG1=1;
  141.         SMGIO=0x80;                //显示-
  142.         SMG2=0;
  143.         delayms(1);
  144.         SMG2=1;

  145.         SMGIO=SMG_CC[LO_Alarm/10];        //显示报警高值十位
  146.         SMG3=0;
  147.         delayms(1);
  148.         SMG3=1;
  149.         SMGIO=SMG_CC[LO_Alarm%10];        //显示报警高值个数位
  150.         SMG4=0;
  151.         delayms(1);
  152.         SMG4=1;        
  153. }
  154. void SET_KEY()
  155. {          bit SET_FLAG=1;
  156.         if(SET==0)                                         //设定按键按下
  157.                 {
  158.                 delayms(40);
  159.                 if(SET==1)                                 //延时去除抖动再次判断是否按下按键
  160.                  {
  161.                         while(SET_FLAG==1)
  162.                         {
  163.                                 Display_HI_Alarm();           //设定上限温度值
  164.                                 if(ADD==0)                                //增加按键
  165.                                         {
  166.                                                 delayms(40);          //延时去除抖动再次判断是否按下按键
  167.                                                 if(ADD==1)
  168.                                                         HI_Alarm++;         //温度值加一
  169.                                         }
  170.                                 if(DEC==0)                                  //减小按键
  171.                                         {
  172.                                                 delayms(40);
  173.                                                 if(DEC==1)                   //延时去除抖动再次判断是否按下按键
  174.                                                         HI_Alarm--;           //温度值减一
  175.                                         }
  176.                                 if(SET==0)                                 //以下表示 再次按下设定按键 进入设定下限程序        
  177.                                         {
  178.                                                 delayms(40);               
  179.                                                 if(SET==1)                                                            //延时去除抖动再次判断是否按下按键
  180.                                                         {
  181.                                                                 while(1)
  182.                                                                 {
  183.                                                                         Display_LO_Alarm();                   //设定下限温度值
  184.                                                                         if(ADD==0)                                   //增加按键
  185.                                                                                 {
  186.                                                                                         delayms(40);
  187.                                                                                         if(ADD==1)                    //延时去除抖动再次判断是否按下按键
  188.                                                                                                 LO_Alarm++;                //温度值加一
  189.                                                                                 }
  190.                                                                         if(DEC==0)                                        //减小按键
  191.                                                                                 {
  192.                                                                                         delayms(40);
  193.                                                                                         if(DEC==1)                    //延时去除抖动再次判断是否按下按键
  194.                                                                                                 LO_Alarm--;                //温度值减一
  195.                                                                                 }
  196.                                                                         if(SET==0)                                        //设定按键按下
  197.                                                                                 {
  198.                                                                                         delayms(40);
  199.                                                                                         if(SET==1)
  200.                                                                                                 {                                 //延时去除抖动再次判断是否按下按键
  201.                                                                                                         SET_FLAG=0;         
  202.                                                                                                         break;                 //上下限设定完成 退出
  203.                                                                                                 }
  204.                                                                                 }                                       
  205.                                                                 }                                                               
  206.                                                         }
  207.                                         }                                                
  208.                         }
  209.                  }
  210. }        
  211. }
  212. void BJ_LED()
  213. ……………………

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

所有资料51hei提供下载:
程序.doc (37.5 KB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:59151 发表于 2017-6-16 21:25 | 显示全部楼层
好东西,前段时间自己做了一个,但总觉得代码有些混乱,正好来参考和学习,谢谢分享!
回复

使用道具 举报

ID:211726 发表于 2017-6-17 23:19 | 显示全部楼层
WORD可以画原理图吗?
回复

使用道具 举报

ID:121836 发表于 2017-7-16 10:07 | 显示全部楼层
DS1820部分的程序呢
回复

使用道具 举报

ID:92231 发表于 2017-7-18 05:07 来自手机 | 显示全部楼层
下载来学习一下,主要是参考程序怎么写
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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