找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的DS18B20溫度采集(數(shù)碼管顯示高低溫報(bào)警)仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于51單片機(jī)的DS18B20溫度采集(數(shù)碼管顯示高低溫報(bào)警)
可以通過(guò)按鍵調(diào)節(jié)溫度上下限
帶有報(bào)警功能
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  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;          //數(shù)碼管4
  8. sbit w1=P2^1;          //數(shù)碼管3
  9. sbit w2=P2^2;          //數(shù)碼管2
  10. sbit w3=P2^3;          //數(shù)碼管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};          //小數(shù)斷碼表
  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};        //個(gè)位帶小數(shù)點(diǎn)的斷碼表
  31. uchar data temp_data[2]={0x00,0x00};//讀出溫度暫放
  32. uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數(shù)據(jù),共四個(gè)數(shù)據(jù)和一個(gè)運(yùn)算暫用
  33. /***************11us延時(shí)函數(shù)***************/
  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;                                                //小數(shù)點(diǎn)
  50.                         case 1:
  51.                         dm=table_dm1[display[1]];
  52.                         w1=0;
  53.                         delay(300);
  54.                         w1=1;                                                //個(gè)位
  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. /****************寫命令函數(shù)*****************/
  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. /****************讀一個(gè)字節(jié)函數(shù)*******************/
  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. /***************讀取溫度函數(shù)***************/
  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. /***************溫度數(shù)據(jù)處理函數(shù)***************/
  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. /***************報(bào)警提示電路***************/
  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. /***************溫度顯示轉(zhuǎn)換**************/
  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. /**************按鍵設(shè)置*************/
  226. void keyscan()
  227. {
  228.         int temp1;    //最高溫度和最低溫度標(biāo)志位
  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. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

Keil代碼與Proteus8.8仿真下載:
仿真代碼.7z (618.21 KB, 下載次數(shù): 165)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:11048 發(fā)表于 2022-11-18 22:14 | 只看該作者
程序存在一個(gè)問(wèn)題,小于負(fù)25度,不閃!
回復(fù)

使用道具 舉報(bào)

板凳
ID:1048397 發(fā)表于 2022-11-21 09:18 | 只看該作者
多謝樓主分享!  有時(shí)間好好學(xué)一下。

我調(diào)過(guò)同樣功能的程序,報(bào)警部分的沒(méi)有調(diào)通,刪除了,現(xiàn)在機(jī)器還在用著,只是能顯示測(cè)點(diǎn)的溫度
回復(fù)

使用道具 舉報(bào)

地板
ID:981552 發(fā)表于 2023-9-3 17:25 | 只看該作者

多謝樓主分享!  有時(shí)間好好學(xué)一下。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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