久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3335|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人看人人搞 | 中文字幕精品一区二区三区精品 | 91视频网址 | 蜜臀网| 日韩美女在线看免费观看 | 欧美视频在线播放 | 亚洲精品免费观看 | 国产乱码精品一品二品 | 国产美女精品视频 | 国产综合久久 | 男女一区二区三区 | 亚洲一区二区三区在线 | 国产女人第一次做爰毛片 | 综合九九| 亚洲国产aⅴ成人精品无吗 综合国产在线 | 中文字幕av在线播放 | 99亚洲 | 精品96久久久久久中文字幕无 | 一区二区三区日韩 | 亚州精品天堂中文字幕 | 亚洲一区二区视频 | 精品一区av| 日韩一级电影免费观看 | 国产乱码高清区二区三区在线 | 久久影院一区 | avtt国产| 一区二区三区四区电影视频在线观看 | 99久久婷婷国产综合精品电影 | 青青草一区 | 黄网站在线观看 | 在线视频91| 色视频在线观看 | 欧美在线观看一区 | 日本精品一区二区三区在线观看视频 | 亚洲一区二区三区四区在线观看 | 一区二区三区四区五区在线视频 | 国产精品一区在线观看 | 黄色电影在线免费观看 | 色在线免费视频 | a在线视频 | 国产一区二区在线播放 |