找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5891|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DS18B20溫度上下限報(bào)警源代碼和Proteus仿真原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)DS18B20溫度上下限報(bào)警的仿真原理圖,用74ls245驅(qū)動(dòng)數(shù)碼管顯示(proteus仿真工程文件可到本帖附件下載):



51單片機(jī)DS18B20溫度上下限報(bào)警源代碼:

  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];   //顯示緩沖區(qū)           
  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( )                  //延時(shí)1ms
  10. {  data unsigned int d;
  11.    for(d=0;d<120;d++);
  12. }

  13. void display( )                 //顯示函數(shù)
  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)微妙延時(shí)
  26. {  while(--y);
  27. }

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


  34. void OneWireWByte(uchar x)          //向總線寫一個(gè)字節(jié)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);                  //延時(shí)60--120微妙
  44.     DIO=1;                          //釋放總線
  45.     _nop_();                        //要求大于1微妙
  46.     x=x>>1;                         //移位,準(zhǔn)備發(fā)送下一位
  47.   }
  48. }

  49. uchar OneWireRByte(void)            //從一總線上讀一個(gè)字節(jié),返回讀到的內(nèi)容
  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);                 //延時(shí)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);                  // 延時(shí)480--960微妙
  72.    DIO=1;                            //釋放總線
  73.    delay_5us(30);                   //延時(shí)60--120微妙
  74.    if(DIO==0)
  75.    {  delay_5us(200);               //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
  76.       DIO=1;                        //釋放總線
  77.       OneWireWByte(0xcc);           //發(fā)送Skip ROM命令
  78.       OneWireWByte(0x4e);           //發(fā)送寫暫存RAM命令
  79.       OneWireWByte(0x00);           //溫度報(bào)警上限設(shè)為0
  80.       OneWireWByte(0x00);           //溫度報(bào)警下限設(shè)為0
  81.       OneWireWByte(0x7f);           //將DS18B20設(shè)為12位,精度為0.25
  82.       DIO=0;
  83.       delay_5us(255);               // 延時(shí)480--960微妙
  84.       DIO=1;                         //釋放總線
  85.       delay_5us(240);               //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
  86.       DIO=1;                         //釋放總線
  87.    }
  88. }


  89. uint DS18B20_readtemp()             //讀DS18B20的溫度值
  90. {  uint temp;
  91.    uchar DS18B20_temp[2];           //溫度數(shù)據(jù)
  92.    DIO=0;
  93.    delay_5us(255);                  // 延時(shí)480--960微妙
  94.    DIO=1;                            //釋放總線
  95.    delay_5us(30);                    //延時(shí)60--120微妙
  96.    if(DIO==0)
  97.    {  delay_5us(200);               //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
  98.       DIO=1;
  99.       OneWireWByte(0xcc);           //發(fā)送Skip ROM命令
  100.       OneWireWByte(0x44);           //發(fā)送溫度轉(zhuǎn)換命令
  101.       DIO=1;
  102.       delay( );                     //延時(shí)1000ms
  103.       DIO=0;
  104.       delay_5us(255);               // 延時(shí)480--960微妙
  105.       DIO=1;
  106.       delay_5us(30);                 //延時(shí)60--120微妙
  107.       if(DIO==0)
  108.       {  delay_5us(200);            //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
  109.          DIO=1;
  110.          OneWireWByte(0xcc);        //發(fā)送Skip ROM命令
  111.          OneWireWByte(0xbe);        //發(fā)送讀暫存RAM命令
  112.          DS18B20_temp[0]=OneWireRByte();  //讀溫度的低字節(jié)
  113.          DS18B20_temp[1]=OneWireRByte();  //讀溫度的高字節(jié)
  114.          temp=256*DS18B20_temp[1]+DS18B20_temp[0];
  115.          temp=temp/16;
  116.          DIO=0;
  117.          delay_5us(255);            //// 延時(shí)480--960微妙
  118.          DIO=1;
  119.          delay_5us(240);            //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
  120.          DIO=1;
  121.       }
  122.       return temp;
  123.     }
  124. }


  125. void  main( )                   //主函數(shù)
  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;

復(fù)制代碼



該系列源碼包含有很多非常經(jīng)典,代碼風(fēng)格十分規(guī)范,而且注釋詳細(xì)的單片機(jī)例程,還帶仿真,對于MCU學(xué)習(xí)特別是初學(xué)者是很有幫助的,全部源碼下載(共幾十個(gè)項(xiàng)目):http://www.torrancerestoration.com/bbs/dpj-80575-1.html

本例程下載(含proteus仿真工程文件與源碼):
單片機(jī)DS18B20溫度上下限報(bào)警.rar (54.79 KB, 下載次數(shù): 63)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:170906 發(fā)表于 2017-4-10 13:08 | 只看該作者
程序無法仿真。
回復(fù)

使用道具 舉報(bào)

板凳
ID:194103 發(fā)表于 2017-4-27 10:48 | 只看該作者
怎么下載?
回復(fù)

使用道具 舉報(bào)

地板
ID:77498 發(fā)表于 2017-5-3 19:26 | 只看該作者
沒有黑色錢下載
回復(fù)

使用道具 舉報(bào)

5#
ID:594086 發(fā)表于 2021-5-2 11:49 | 只看該作者
程序沒有上下限報(bào)警功能
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表