找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DS18B20温度上下限报警源代码和Proteus仿真原理图

[复制链接]
ID:175881 发表于 2017-4-5 04:04 | 显示全部楼层 |阅读模式
51单片机DS18B20温度上下限报警的仿真原理图,用74ls245驱动数码管显示(proteus仿真工程文件可到本帖附件下载):

0.png

51单片机DS18B20温度上下限报警源代码:

  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. sbit DIO=P1^7;

  6. uchar data dis_buf[6];   //显示缓冲区           
  7. uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //显示的代码表
  8.            0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};



  9. void dl_1ms( )                  //延时1ms
  10. {  data unsigned int d;
  11.    for(d=0;d<120;d++);
  12. }

  13. void display( )                 //显示函数
  14. {  data uchar bitcode, i;
  15.    bitcode=0xfe;
  16.    for(i=0;i<6;i++)
  17.    {  P2=table[dis_buf[i]];
  18.       P3=bitcode;
  19.       dl_1ms( );
  20.       P3=0xff;
  21.       bitcode=bitcode<<1;
  22.       bitcode=bitcode|0x01;
  23.    }
  24. }

  25. void delay_5us(uchar y)             //(2.17*y+5)微妙延时
  26. {  while(--y);
  27. }

  28. void delay()                        //延时1000ms              
  29. {  uchar i;
  30.    for(i=0;i<140;i++)
  31.    {  display();
  32.    }
  33. }


  34. void OneWireWByte(uchar x)          //向总线写一个字节x
  35. {  uchar i;
  36.    for(i=0;i<8;i++)
  37.    { DIO=0;                         //拉低总线
  38.      _nop_();                       //要求大于1微妙,但不超过15微妙
  39.      _nop_();
  40.     if(0x01&x)
  41.     { DIO=1;                        //如果最低位为1,则将总线拉高
  42.     }
  43.     delay_5us(30);                  //延时60--120微妙
  44.     DIO=1;                          //释放总线
  45.     _nop_();                        //要求大于1微妙
  46.     x=x>>1;                         //移位,准备发送下一位
  47.   }
  48. }

  49. uchar OneWireRByte(void)            //从一总线上读一个字节,返回读到的内容
  50. {  uchar i,j;
  51.    j=0;
  52.    for(i=0;i<8;i++)
  53.    {  j=j>>1;
  54.       DIO=0;                        //拉低总线
  55.       _nop_();                      //要求大于1微妙,但不超过15微妙
  56.       _nop_();
  57.       DIO=1;                        //释放总线
  58.       _nop_();
  59.       _nop_();
  60.      if(DIO==1)                     //如果搞电平
  61.      {  j=j|0X80;
  62.      }
  63.      delay_5us(30);                 //延时60--120微妙
  64.      DIO=1;                         //释放总线
  65.      _nop_();                       //要求大于1微妙
  66.    }
  67.    return j;
  68. }

  69. void DS18B20_int(void)              //初始化DS18B20
  70. {  DIO=0;
  71.    delay_5us(255);                  // 延时480--960微妙
  72.    DIO=1;                            //释放总线
  73.    delay_5us(30);                   //延时60--120微妙
  74.    if(DIO==0)
  75.    {  delay_5us(200);               //要求释放总线后480微妙内结束复位
  76.       DIO=1;                        //释放总线
  77.       OneWireWByte(0xcc);           //发送Skip ROM命令
  78.       OneWireWByte(0x4e);           //发送写暂存RAM命令
  79.       OneWireWByte(0x00);           //温度报警上限设为0
  80.       OneWireWByte(0x00);           //温度报警下限设为0
  81.       OneWireWByte(0x7f);           //将DS18B20设为12位,精度为0.25
  82.       DIO=0;
  83.       delay_5us(255);               // 延时480--960微妙
  84.       DIO=1;                         //释放总线
  85.       delay_5us(240);               //要求释放总线后480微妙内结束复位
  86.       DIO=1;                         //释放总线
  87.    }
  88. }


  89. uint DS18B20_readtemp()             //读DS18B20的温度值
  90. {  uint temp;
  91.    uchar DS18B20_temp[2];           //温度数据
  92.    DIO=0;
  93.    delay_5us(255);                  // 延时480--960微妙
  94.    DIO=1;                            //释放总线
  95.    delay_5us(30);                    //延时60--120微妙
  96.    if(DIO==0)
  97.    {  delay_5us(200);               //要求释放总线后480微妙内结束复位
  98.       DIO=1;
  99.       OneWireWByte(0xcc);           //发送Skip ROM命令
  100.       OneWireWByte(0x44);           //发送温度转换命令
  101.       DIO=1;
  102.       delay( );                     //延时1000ms
  103.       DIO=0;
  104.       delay_5us(255);               // 延时480--960微妙
  105.       DIO=1;
  106.       delay_5us(30);                 //延时60--120微妙
  107.       if(DIO==0)
  108.       {  delay_5us(200);            //要求释放总线后480微妙内结束复位
  109.          DIO=1;
  110.          OneWireWByte(0xcc);        //发送Skip ROM命令
  111.          OneWireWByte(0xbe);        //发送读暂存RAM命令
  112.          DS18B20_temp[0]=OneWireRByte();  //读温度的低字节
  113.          DS18B20_temp[1]=OneWireRByte();  //读温度的高字节
  114.          temp=256*DS18B20_temp[1]+DS18B20_temp[0];
  115.          temp=temp/16;
  116.          DIO=0;
  117.          delay_5us(255);            //// 延时480--960微妙
  118.          DIO=1;
  119.          delay_5us(240);            //要求释放总线后480微妙内结束复位
  120.          DIO=1;
  121.       }
  122.       return temp;
  123.     }
  124. }


  125. void  main( )                   //主函数
  126. {  uint temp;
  127.    DS18B20_int();
  128.    dis_buf[0]=16; dis_buf[1]=16;
  129.    dis_buf[2]=0;  dis_buf[3]=0;
  130.    dis_buf[4]=0;  dis_buf[5]=0;
  131.    display( );

  132.    while(1)
  133.    {  temp=DS18B20_readtemp();
  134.       dis_buf[2]=temp/1000;
  135.       dis_buf[3]=(temp%1000)/100;

复制代码


0.png
该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共几十个项目):http://www.51hei.com/bbs/dpj-80575-1.html

本例程下载(含proteus仿真工程文件与源码):
单片机DS18B20温度上下限报警.rar (54.79 KB, 下载次数: 62)
回复

使用道具 举报

ID:170906 发表于 2017-4-10 13:08 | 显示全部楼层
程序无法仿真。
回复

使用道具 举报

ID:194103 发表于 2017-4-27 10:48 | 显示全部楼层
怎么下载?
回复

使用道具 举报

ID:77498 发表于 2017-5-3 19:26 | 显示全部楼层
没有黑色钱下载
回复

使用道具 举报

ID:594086 发表于 2021-5-2 11:49 | 显示全部楼层
程序没有上下限报警功能
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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