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

標(biāo)題: 使用單片機(jī)+DS18B20設(shè)計(jì)溫控系統(tǒng) 附文檔+源程序 [打印本頁(yè)]

作者: 15532839284    時(shí)間: 2019-12-25 15:17
標(biāo)題: 使用單片機(jī)+DS18B20設(shè)計(jì)溫控系統(tǒng) 附文檔+源程序

(1)主程序設(shè)計(jì):主程序里只包含對(duì)溫度對(duì)串口返回上位機(jī)的控制,整個(gè)采用模塊化設(shè)計(jì)該實(shí)驗(yàn)。

(2)子程序設(shè)計(jì):

該程序的子程序中包含DS18B20以及串口初始化函數(shù),根據(jù)其時(shí)序圖編寫(xiě)代碼,其中包括DS18B20讀一位數(shù)據(jù)函數(shù)和讀一字節(jié)數(shù)據(jù)函數(shù)以及寫(xiě)一字節(jié)數(shù)據(jù)函數(shù)。DS18B20獲取溫度并轉(zhuǎn)換子程序具有將當(dāng)前溫度轉(zhuǎn)換為實(shí)際溫度的作用,數(shù)據(jù)顯示程序,報(bào)警程序,以及溫度處理程序共同組成溫控系統(tǒng)的邏輯部分。

過(guò)程:

1.DS18B20復(fù)位,初始化函數(shù)

2.DS18B20讀一位數(shù)據(jù)函數(shù),一字節(jié)數(shù)據(jù)函數(shù)以及寫(xiě)一字節(jié)數(shù)據(jù)函數(shù)

3.DS18B20開(kāi)始獲取溫度并轉(zhuǎn)換,將讀到的溫度數(shù)據(jù)*0.0625轉(zhuǎn)換成實(shí)際溫度數(shù)據(jù)

4.數(shù)據(jù)顯示程序,將定義好的uchar型編碼賦給P0口,將得到的溫度數(shù)據(jù)顯示在數(shù)碼管上。其中,顯示個(gè)位數(shù)碼管時(shí),需要得到帶小數(shù)點(diǎn)的編碼

5.蜂鳴器與led燈,用音調(diào)高低來(lái)控制蜂鳴器滴聲的快慢,音調(diào)越長(zhǎng),滴聲越慢,并且led燈根據(jù)所需實(shí)驗(yàn)現(xiàn)象閃爍

6.串口發(fā)送數(shù)據(jù),并將實(shí)時(shí)溫度返回給上位機(jī)

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


圖8.主程序流程圖

DS18B20讀數(shù)據(jù)流程如圖9所示,讀程序?yàn)樽x一字節(jié)數(shù)據(jù)。

               圖9.DS18B20讀數(shù)據(jù)時(shí)序圖


5.調(diào)試結(jié)

調(diào)試結(jié)果如圖10所示,該圖為溫度在31.9度時(shí),處于30到32度之間,現(xiàn)象為P1.2口發(fā)光二極管閃爍,蜂鳴器響。


圖10.調(diào)試現(xiàn)象

最終調(diào)試出了正確的結(jié)果,理論上DS18B20的測(cè)量范圍在-55度~+125度,由于環(huán)境溫度,并沒(méi)有達(dá)到峰值,并且,該芯片在-10度~+85度之間存在±5度的誤差,因此在溫度顯示并返回上位機(jī)時(shí)會(huì)有時(shí)間差以及溫度差。并且該芯片自身存在延時(shí),不同分辨率時(shí),會(huì)有不同的時(shí)間將溫度轉(zhuǎn)換為數(shù)字顯示,分辨率越高,顯示越快。并且在實(shí)驗(yàn)時(shí),存在芯片插反的錯(cuò)誤,此時(shí)芯片不會(huì)因?yàn)榘l(fā)燙而燒毀,但是不可以正常工作。

*溫度控制系統(tǒng)被廣泛地應(yīng)用于生活中,本設(shè)計(jì)也還可以做一些拓展,例如在溫室大棚里可以加一個(gè)溫度控制器,蜂鳴器用來(lái)報(bào)警,來(lái)控制監(jiān)測(cè)大棚內(nèi)溫度。


單片機(jī)源程序如下:


  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit ds=P2^2;//溫度傳感器信號(hào)線(xiàn)
  6. sbit dula=P2^6;//數(shù)碼管段選管
  7. sbit wela=P2^7;//數(shù)碼管位選線(xiàn)
  8. sbit beep=P2^3;//蜂鳴器
  9. uint temp,templa;定義整型溫度數(shù)據(jù)
  10. float f_temp;//定義浮點(diǎn)型溫度數(shù)據(jù)
  11. uint warn_11=270;定義溫度下限值,是溫度*10的結(jié)果
  12. uint warn_12=250; 定義溫度下限值
  13. uint warn_h1=300; 定義溫度上限值
  14. uint warn_h2=320; 定義溫度上限值
  15. sbit led0=P1^0;//控制發(fā)光二極管
  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復(fù)位,初始化函數(shù)
  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)//讀一位數(shù)據(jù)函數(shù)
  37. {
  38.               uint i;
  39.               bit dat;
  40.               ds=0;i++;//i++起延時(shí)作用
  41.               ds=1;i++;i++;
  42.               dat=ds;
  43.               i=8;while(i>0)i--;
  44.               return(dat);
  45. }
  46. uchar tempread(void)//讀1個(gè)字節(jié)數(shù)據(jù)
  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);//讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在dat里
  54.               }
  55.               return(dat);
  56. }
  57. void tempwritebyte(uchar dat)//向DS18B20寫(xiě)一個(gè)字節(jié)數(shù)據(jù)函數(shù)
  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)//寫(xiě)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;//寫(xiě)0
  76.         i=8;while(i>0)i--;
  77.         ds=1;
  78.         i++;i++;
  79.       }
  80.    }
  81. }
  82. void tempchange(void)//DS18B20開(kāi)始獲取溫度并轉(zhuǎn)換
  83. {
  84.    dsreset();
  85.    delay(1);
  86.    tempwritebyte(0xcc);//寫(xiě)跳過(guò)ROM指令
  87.               tempwritebyte(0x44);//寫(xiě)溫度轉(zhuǎn)換指令
  88. }
  89. uint get_temp()//讀取寄存器中存儲(chǔ)的溫度數(shù)據(jù)
  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;//兩個(gè)字節(jié)組合為1個(gè)字
  100.    temp=temp|a;
  101.    f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨率為0.0625°
  102.    temp=f_temp*10+0.5;//*10表示小數(shù)點(diǎn)后面只取1位,加0.5是四舍五入
  103.    f_temp=f_temp+0.05;
  104.    return temp;//temp是整型
  105. }
  106. void display(uchar num,uchar dat)//num第幾個(gè)數(shù)碼管,dat要顯示的數(shù)字
  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來(lái)存儲(chǔ)位選數(shù)據(jù),只有一位為0
  116.    P0=i;
  117.    wela=1;
  118.    wela=0;
  119.    delay(1);
  120. }
  121. void dis_temp(uint t)//顯示溫度數(shù)值函數(shù)t傳遞的是整型的溫度值
  122. {
  123.    uchar i;
  124.    i=t/100;//除以100得到商,為溫度的十位
  125.    display(0,i);//在數(shù)碼管第一個(gè)顯示
  126.    i=t%100/10;//100取余在除以10得到商,為溫度的個(gè)位
  127.    display(1,i+10); //在數(shù)碼管第二個(gè)顯示
  128.    i=t%100%10; //100取余在用10取余,為溫度的小數(shù)位
  129.    display(2,i);//在數(shù)碼管第三個(gè)顯示
  130. }
  131. void warn(uint s,uchar led)//蜂鳴器報(bào)警,燈閃爍,s控制音調(diào),led控制燈
  132. {
  133.    uchar i;i=s;
  134.    beep=0;//蜂鳴器響
  135.    P1=~(led);//控制相應(yīng)的燈滅
  136.    while(i--)
  137.    {
  138.     dis_temp(get_temp());//用溫度顯示函數(shù)起到延時(shí)作用
  139.    }
  140.    beep=1;//蜂鳴器不響
  141.    P1=0XFF;
  142.    i=s;
  143.    while(i--)
  144.    {
  145.     dis_temp(get_temp());//控制相應(yīng)的燈滅
  146.    }
  147. }
  148. void deal(uint t)//溫度處理函數(shù)
  149. {
  150.    uchar i;
  151.    if((t>warn_12)&&(t<=warn_11))//t:溫度
  152.    {
  153.      warn(40,0x01);//第一個(gè)燈亮,蜂鳴器發(fā)聲
  154.    }
  155.    else if(t<=warn_12)
  156.    {
  157.      warn(10,0x03);// 第一個(gè)的第二個(gè)燈亮,蜂鳴器發(fā)聲
  158.    }
  159.    else if((t<warn_h2)&&(t>=warn_h1))
  160.    {
  161.      warn(40,0x04); //第三個(gè)燈亮,蜂鳴器發(fā)聲
  162.    }
  163.    else if(t>=warn_h2)
  164.    {
  165.      warn(10,0x0c); //第三個(gè)和第四個(gè)燈亮,蜂鳴器發(fā)聲
  166.    }
  167.    else//在27度和30度之間時(shí)只是調(diào)用顯示函數(shù)延時(shí)
  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)//串口數(shù)據(jù)發(fā)送函數(shù)
  186. {
  187.               do
  188.               {
  189.                 SBUF=*parr++;//發(fā)送數(shù)據(jù)
  190.                 while(!TI);//等待發(fā)送完標(biāo)志為1
  191.                 TI=0;//標(biāo)志清0
  192.    }while(*parr);//保持循環(huán)知道字符為‘、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();//溫度轉(zhuǎn)換函數(shù)
  203.                             for(i=10;i>0;i--)
  204.                             {
  205.                                           dis_temp(get_temp());//獲取溫度并顯示
  206.       }
  207.                                deal(temp);//進(jìn)行溫度處理
  208.                                           sprintf(buff,"%f",f_temp);//將浮點(diǎn)型溫度格式化為字符型
  209.                             for(i=10;i>0;i--)
  210.                             {
  211.                                           dis_temp(get_temp());//溫度顯示
  212.        }
  213.                                comm(buff);//串口發(fā)送數(shù)據(jù)
  214.                             for(i=10;i>0;i--)
  215.                             {
  216.                                           dis_temp(get_temp());溫度顯示
  217.                             }
  218.    }
  219. }
復(fù)制代碼

全部資料51hei下載地址:

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







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1