欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3256|回復: 0
打印 上一主題 下一主題
收起左側

使用單片機+DS18B20設計溫控系統 附文檔+源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:620336 發表于 2019-12-25 15:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

(1)主程序設計:主程序里只包含對溫度對串口返回上位機的控制,整個采用模塊化設計該實驗。

(2)子程序設計:

該程序的子程序中包含DS18B20以及串口初始化函數,根據其時序圖編寫代碼,其中包括DS18B20讀一位數據函數和讀一字節數據函數以及寫一字節數據函數。DS18B20獲取溫度并轉換子程序具有將當前溫度轉換為實際溫度的作用,數據顯示程序,報警程序,以及溫度處理程序共同組成溫控系統的邏輯部分。

過程:

1.DS18B20復位,初始化函數

2.DS18B20讀一位數據函數,一字節數據函數以及寫一字節數據函數

3.DS18B20開始獲取溫度并轉換,將讀到的溫度數據*0.0625轉換成實際溫度數據

4.數據顯示程序,將定義好的uchar型編碼賦給P0口,將得到的溫度數據顯示在數碼管上。其中,顯示個位數碼管時,需要得到帶小數點的編碼

5.蜂鳴器與led燈,用音調高低來控制蜂鳴器滴聲的快慢,音調越長,滴聲越慢,并且led燈根據所需實驗現象閃爍

6.串口發送數據,并將實時溫度返回給上位機

主程序的流程圖如圖8所示。


圖8.主程序流程圖

DS18B20讀數據流程如圖9所示,讀程序為讀一字節數據。

               圖9.DS18B20讀數據時序圖


5.調試結

調試結果如圖10所示,該圖為溫度在31.9度時,處于30到32度之間,現象為P1.2口發光二極管閃爍,蜂鳴器響。


圖10.調試現象

最終調試出了正確的結果,理論上DS18B20的測量范圍在-55度~+125度,由于環境溫度,并沒有達到峰值,并且,該芯片在-10度~+85度之間存在±5度的誤差,因此在溫度顯示并返回上位機時會有時間差以及溫度差。并且該芯片自身存在延時,不同分辨率時,會有不同的時間將溫度轉換為數字顯示,分辨率越高,顯示越快。并且在實驗時,存在芯片插反的錯誤,此時芯片不會因為發燙而燒毀,但是不可以正常工作。

*溫度控制系統被廣泛地應用于生活中,本設計也還可以做一些拓展,例如在溫室大棚里可以加一個溫度控制器,蜂鳴器用來報警,來控制監測大棚內溫度。


單片機源程序如下:


  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit ds=P2^2;//溫度傳感器信號線
  6. sbit dula=P2^6;//數碼管段選管
  7. sbit wela=P2^7;//數碼管位選線
  8. sbit beep=P2^3;//蜂鳴器
  9. uint temp,templa;定義整型溫度數據
  10. float f_temp;//定義浮點型溫度數據
  11. uint warn_11=270;定義溫度下限值,是溫度*10的結果
  12. uint warn_12=250; 定義溫度下限值
  13. uint warn_h1=300; 定義溫度上限值
  14. uint warn_h2=320; 定義溫度上限值
  15. sbit led0=P1^0;//控制發光二極管
  16. sbit led1=P1^1;
  17. sbit led2=P1^2;
  18. sbit led3=P1^3;
  19. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
  20. void delay(uint z)
  21. {
  22.               uint x,y;
  23.               for(x=z;x>0;x--)
  24.                  for(y=110;y>0;y--);
  25. }
  26. void dsreset(void)//DS18B20復位,初始化函數
  27. {
  28.               uint i;
  29.               ds=0;
  30.               i=103;
  31.               while(i>0)i--;
  32.               ds=1;
  33.               i=4;
  34.               while(i>0)i--;
  35. }
  36. bit tempreadbit(void)//讀一位數據函數
  37. {
  38.               uint i;
  39.               bit dat;
  40.               ds=0;i++;//i++起延時作用
  41.               ds=1;i++;i++;
  42.               dat=ds;
  43.               i=8;while(i>0)i--;
  44.               return(dat);
  45. }
  46. uchar tempread(void)//讀1個字節數據
  47. {
  48.               uchar i,j,dat;
  49.               dat=0;
  50.               for(i=1;i<=8;i++)
  51.               {
  52.                             j=tempreadbit();
  53.                             dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在dat里
  54.               }
  55.               return(dat);
  56. }
  57. void tempwritebyte(uchar dat)//向DS18B20寫一個字節數據函數
  58. {
  59.    uint i;
  60.    uchar j;
  61.    bit testb;
  62.    for(j=1;j<=8;j++)
  63.    {
  64.       testb=dat&0x01;
  65.       dat=dat>>1;
  66.       if(testb)//寫1
  67.       {
  68.         ds=0;
  69.         i++;i++;
  70.         ds=1;
  71.         i=8;while(i>0)i--;
  72.       }
  73.       else
  74.       {
  75.         ds=0;//寫0
  76.         i=8;while(i>0)i--;
  77.         ds=1;
  78.         i++;i++;
  79.       }
  80.    }
  81. }
  82. void tempchange(void)//DS18B20開始獲取溫度并轉換
  83. {
  84.    dsreset();
  85.    delay(1);
  86.    tempwritebyte(0xcc);//寫跳過ROM指令
  87.               tempwritebyte(0x44);//寫溫度轉換指令
  88. }
  89. uint get_temp()//讀取寄存器中存儲的溫度數據
  90. {
  91.    uchar a,b;
  92.    dsreset();
  93.    delay(1);
  94.    tempwritebyte(0xcc);
  95.    tempwritebyte(0xbe);
  96.    a=tempread();//讀低8位
  97.    b=tempread();//讀高8位
  98.    temp=b;
  99.    temp<<=8;//兩個字節組合為1個字
  100.    temp=temp|a;
  101.    f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨率為0.0625°
  102.    temp=f_temp*10+0.5;//*10表示小數點后面只取1位,加0.5是四舍五入
  103.    f_temp=f_temp+0.05;
  104.    return temp;//temp是整型
  105. }
  106. void display(uchar num,uchar dat)//num第幾個數碼管,dat要顯示的數字
  107. {
  108.    uchar i;
  109.    dula=0;
  110.    P0=table[dat];
  111.    dula=1;
  112.    dula=0;
  113.    wela=0;
  114.    i=0XFF;
  115.    i=i&(~((0X01)<<(num)));//用i來存儲位選數據,只有一位為0
  116.    P0=i;
  117.    wela=1;
  118.    wela=0;
  119.    delay(1);
  120. }
  121. void dis_temp(uint t)//顯示溫度數值函數t傳遞的是整型的溫度值
  122. {
  123.    uchar i;
  124.    i=t/100;//除以100得到商,為溫度的十位
  125.    display(0,i);//在數碼管第一個顯示
  126.    i=t%100/10;//100取余在除以10得到商,為溫度的個位
  127.    display(1,i+10); //在數碼管第二個顯示
  128.    i=t%100%10; //100取余在用10取余,為溫度的小數位
  129.    display(2,i);//在數碼管第三個顯示
  130. }
  131. void warn(uint s,uchar led)//蜂鳴器報警,燈閃爍,s控制音調,led控制燈
  132. {
  133.    uchar i;i=s;
  134.    beep=0;//蜂鳴器響
  135.    P1=~(led);//控制相應的燈滅
  136.    while(i--)
  137.    {
  138.     dis_temp(get_temp());//用溫度顯示函數起到延時作用
  139.    }
  140.    beep=1;//蜂鳴器不響
  141.    P1=0XFF;
  142.    i=s;
  143.    while(i--)
  144.    {
  145.     dis_temp(get_temp());//控制相應的燈滅
  146.    }
  147. }
  148. void deal(uint t)//溫度處理函數
  149. {
  150.    uchar i;
  151.    if((t>warn_12)&&(t<=warn_11))//t:溫度
  152.    {
  153.      warn(40,0x01);//第一個燈亮,蜂鳴器發聲
  154.    }
  155.    else if(t<=warn_12)
  156.    {
  157.      warn(10,0x03);// 第一個的第二個燈亮,蜂鳴器發聲
  158.    }
  159.    else if((t<warn_h2)&&(t>=warn_h1))
  160.    {
  161.      warn(40,0x04); //第三個燈亮,蜂鳴器發聲
  162.    }
  163.    else if(t>=warn_h2)
  164.    {
  165.      warn(10,0x0c); //第三個和第四個燈亮,蜂鳴器發聲
  166.    }
  167.    else//在27度和30度之間時只是調用顯示函數延時
  168.    {
  169.      i=40;
  170.      while(i--)
  171.       {
  172.         dis_temp(get_temp());
  173.       }
  174.    }
  175. }
  176. void init_com(void)//串口初始化
  177. {
  178.    TMOD=0x20;
  179.    PCON=0x00;
  180.    SCON=0x50;
  181.    TH1=0xFd;//波特率9600
  182.    TL1=0xFd;
  183.    TR1=1;
  184. }
  185. void comm(char*parr)//串口數據發送函數
  186. {
  187.               do
  188.               {
  189.                 SBUF=*parr++;//發送數據
  190.                 while(!TI);//等待發送完標志為1
  191.                 TI=0;//標志清0
  192.    }while(*parr);//保持循環知道字符為‘、0’
  193. }
  194. void main()
  195. {
  196.               uchar buff[4],i;
  197.               dula=0;
  198.               wela=0;
  199.               init_com();
  200.               while(1)
  201.               {
  202.                             tempchange();//溫度轉換函數
  203.                             for(i=10;i>0;i--)
  204.                             {
  205.                                           dis_temp(get_temp());//獲取溫度并顯示
  206.       }
  207.                                deal(temp);//進行溫度處理
  208.                                           sprintf(buff,"%f",f_temp);//將浮點型溫度格式化為字符型
  209.                             for(i=10;i>0;i--)
  210.                             {
  211.                                           dis_temp(get_temp());//溫度顯示
  212.        }
  213.                                comm(buff);//串口發送數據
  214.                             for(i=10;i>0;i--)
  215.                             {
  216.                                           dis_temp(get_temp());溫度顯示
  217.                             }
  218.    }
  219. }
復制代碼

全部資料51hei下載地址:

代碼+文檔.7z (729.86 KB, 下載次數: 32)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表