找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2765|回复: 3
打印 上一主题 下一主题
收起左侧

基于51单片机的DS18B20温度采集(数码管显示高低温报警)仿真程序

  [复制链接]
跳转到指定楼层
楼主
基于51单片机的DS18B20温度采集(数码管显示高低温报警)
可以通过按键调节温度上下限
带有报警功能
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>   
  3. #define dm P0          //段码输出口
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit DQ=P2^7;          //温度输入口
  7. sbit w0=P2^0;          //数码管4
  8. sbit w1=P2^1;          //数码管3
  9. sbit w2=P2^2;          //数码管2
  10. sbit w3=P2^3;          //数码管1
  11. sbit beep=P3^7;   //蜂鸣器
  12. sbit yellow=P1^0;          //低温指示灯
  13. sbit led=P1^1;                  //高温指示灯
  14. sbit set=P3^0;          
  15. sbit add=P3^1;
  16. sbit dec=P3^2;
  17. int temp1=0;          
  18. uint h;
  19. uint temp;
  20. uchar r;
  21. uchar high=100,low=25;
  22. uchar sign;
  23. uchar q=0;
  24. uchar tt=0;
  25. uchar scale;
  26. uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  27.                         0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};          //小数断码表
  28. uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  29.                             0x7d,0x07,0x7f,0x6f,0x00,0x40};          //共阴LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"
  30. uchar code table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};        //个位带小数点的断码表
  31. uchar data temp_data[2]={0x00,0x00};//读出温度暂放
  32. uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共四个数据和一个运算暂用
  33. /***************11us延时函数***************/
  34. void delay(uint t)
  35. {
  36.         for(;t>0;t--);
  37. }
  38. void scan()
  39. {
  40.         int j;
  41.         for(j=0;j<4;j++)
  42.         {
  43.                 switch(j)
  44.                 {
  45.                         case 0:
  46.                         dm=table_dm[display[0]];;
  47.                         w0=0;
  48.                         delay(300);
  49.                         w0=1;                                                //小数点
  50.                         case 1:
  51.                         dm=table_dm1[display[1]];
  52.                         w1=0;
  53.                         delay(300);
  54.                         w1=1;                                                //个位
  55.                         case 2:
  56.                         dm=table_dm[display[2]];
  57.                         w2=0;
  58.                         delay(300);
  59.                         w2=1;                                            //十位
  60.                         case 3:
  61.                         dm=table_dm[display[3]];
  62.                         w3=0;
  63.                         delay(300);
  64.                         w3=1;                                                //百位
  65.                 }
  66.         }
  67. }
  68. /**************DS18B20初始化**************/
  69. ow_reset(void)
  70. {
  71.         char presence=1;
  72.         while(presence)
  73.         {
  74.                 while(presence)
  75.                 {
  76.                         DQ=1;_nop_();_nop_();
  77.                         DQ=0;
  78.                         delay(50);
  79.                         DQ=1;
  80.                         delay(6);
  81.                         presence=DQ;
  82.                 }
  83.                 delay(45);
  84.                 presence=~DQ;
  85.         }
  86.         DQ=1;       
  87.         return presence;
  88. }
  89. /****************写命令函数*****************/
  90. void write_byte(uchar val)
  91. {
  92.         uchar i;
  93.         for(i=8;i>0;i--)
  94.         {
  95.                 DQ=1;_nop_();_nop_();
  96.                 DQ=0;_nop_();_nop_();_nop_();_nop_();
  97.                 DQ=val&0x01;
  98.                 delay(6);
  99.                 val=val>>1;               
  100.         }
  101.         DQ=1;
  102.         delay(1);
  103. }       
  104. /****************读一个字节函数*******************/
  105. uchar read_byte(void)
  106. {
  107.         uchar i;
  108.         uchar value=0;
  109.         for(i=8;i>0;i--)
  110.         {
  111.                 DQ=1;_nop_();_nop_();
  112.                 value>>=1;
  113.                 DQ=0;_nop_();_nop_();_nop_();_nop_();
  114.                 DQ=1;_nop_();_nop_();_nop_();_nop_();
  115.                 if(DQ)value|=0x80;
  116.                 delay(6);
  117.         }
  118.         DQ=1;       
  119.         return value;
  120. }
  121. /***************读取温度函数***************/
  122. read_temp()
  123. {
  124.         ow_reset();
  125.         delay(200);
  126.         write_byte(0xcc);
  127.         write_byte(0x44);
  128.         ow_reset();
  129.         delay(1);
  130.         write_byte(0xcc);
  131.         write_byte(0xbe);
  132.         temp_data[0]=read_byte();
  133.         temp_data[1]=read_byte();
  134.         temp=temp_data[1];
  135.         temp<<=8;
  136.         temp=temp|temp_data[0];
  137.         return temp;
  138. }
  139. /***************温度数据处理函数***************/
  140. work_temp(uint tem)
  141. {
  142.         uchar n=0;
  143.         if(tem>6348)
  144.         {
  145.                 tem=65536-tem;
  146.                 n=1;
  147.         }
  148.         display[4]=tem&0x0f;
  149.         display[0]=ditab[display[4]];
  150.         display[4]=tem>>4;
  151.         display[3]=display[4]/100;
  152.         display[1]=display[4]%100;
  153.         display[2]=display[1]/10;
  154.         display[1]=display[1]%10;
  155.         r=display[1]+display[2]*10+display[3]*100;
  156.         if(!display[3])
  157.         {
  158.                 display[3]=0x0a;
  159.                 if(!display[2])       
  160.                 {
  161.                         display[2]=0x0a;
  162.                 }
  163.         }
  164.         if(n)
  165.         {
  166.                 display[3]=0x0b;
  167.         }
  168.         return n;
  169. }
  170. /***************报警提示电路***************/
  171. void BEEP()
  172. {

  173.         if(r>=high&&r<129)
  174.         {
  175.                 led=0;//灯亮
  176.         }
  177.         else
  178.         {
  179.                 led=1;//灯灭
  180.         }
  181.         if(r<low)
  182.         {
  183.                 yellow=~yellow;//闪烁
  184.         }
  185.         else
  186.         {
  187.                 yellow=1;//灭
  188.         }
  189.         if((r>=high&&r<129)||(r<low))
  190.         {
  191.                 beep=!beep;//蜂鸣器响
  192.         }
  193.         else
  194.         {
  195.                 beep=1;
  196.         }
  197. }
  198. /***************温度显示转换**************/
  199. void xianshi(int horl)
  200. {
  201.         int n=0;
  202.         if(horl>128)
  203.         {
  204.                 horl=256-horl;
  205.                 n=1;
  206.         }
  207.         display[3]=horl/100;
  208.         display[3]=display[3]&0x0f;
  209.         display[2]=horl%100/10;
  210.         display[1]=horl%10;
  211.         display[0]=0;
  212.         if(!display[3])
  213.         {
  214.                 display[3]=0x0a;
  215.                 if(!display[2])       
  216.                 {
  217.                         display[2]=0x0a;
  218.                 }
  219.         }
  220.         if(n)
  221.         {
  222.                 display[3]=0x0b;
  223.         }                                                                               
  224. }
  225. /**************按键设置*************/
  226. void keyscan()
  227. {
  228.         int temp1;    //最高温度和最低温度标志位
  229.         if(set==0)
  230.         {
  231.                 while(1)
  232.                 {
  233.                         delay(500);//消抖
  234.                         if(set==0)
  235.                         {
  236.                                 temp1++;
  237.                                 while(!set)
  238.                                 scan();
  239.                         }
  240.                         if(temp1==1)
  241.                         {
  242.                                 xianshi(high);
  243.                                 scan();
  244.                                 if(add==0)
  245.                                 {
  246.                                         while(!add)
  247.                                         scan();
  248.                                         high+=1;
  249.                                 }
  250.                                 if(dec==0)
  251.                                 {
  252.                                         while(!dec)
  253.                                         scan();
  254.                                         high-=1;
  255.                                 }
  256.                         }
  257.                         if(temp1==2)
  258.                         {
  259.                                 xianshi(low);
  260.                                 if(add==0)
  261.                                 {
  262.                                         while(!add)
  263.                                         scan();
  264.                                         low+=1;
  265.                                 }
  266.                                 if(dec==0)
  267.                                 {
  268.                                         while(!dec)
  269.                                         scan();
  270.                                         low-=1;
  271.                                 }
  272.                                 scan();
  273.                         }
  274.                         if(temp1>=3)
  275.                         {
  276.                                 temp1=0;
  277.                                 break;
  278.                         }
  279.                 }
  280.         }
  281. }
  282. ……………………

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

Keil代码与Proteus8.8仿真下载:
仿真代码.7z (618.21 KB, 下载次数: 165)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:11048 发表于 2022-11-18 22:14 | 只看该作者
程序存在一个问题,小于负25度,不闪!
回复

使用道具 举报

板凳
ID:1048397 发表于 2022-11-21 09:18 | 只看该作者
多谢楼主分享!  有时间好好学一下。

我调过同样功能的程序,报警部分的没有调通,删除了,现在机器还在用着,只是能显示测点的温度
回复

使用道具 举报

地板
ID:981552 发表于 2023-9-3 17:25 | 只看该作者

多谢楼主分享!  有时间好好学一下。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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