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

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

QQ登錄

只需一步,快速開始

搜索
查看: 6276|回復(fù): 2
收起左側(cè)

溫度檢測(cè)系統(tǒng)設(shè)計(jì)報(bào)告(單片機(jī)+DS18B20)

[復(fù)制鏈接]
ID:328014 發(fā)表于 2018-7-1 03:13 | 顯示全部樓層 |閱讀模式
實(shí)驗(yàn)任務(wù)溫度檢測(cè)系統(tǒng)設(shè)計(jì)DS18B20
  •          實(shí)訓(xùn)目的
熟悉用KeilC51、PROTEUS軟件進(jìn)行電路及控制系統(tǒng)的仿真。學(xué)會(huì)利用溫度傳感器DS18B20檢測(cè)溫度,利用單片機(jī)顯示溫度。
二、實(shí)訓(xùn)內(nèi)容:
  1、實(shí)訓(xùn)任務(wù):
1)任務(wù)描述:
設(shè)計(jì)一個(gè)數(shù)字式溫度計(jì),要求使用溫度傳感器(可以采用DS18B20測(cè)量溫度,再經(jīng)單片機(jī)處理后,LED數(shù)碼管顯示測(cè)量的溫度值。測(cè)溫范圍為-10~85℃,精度誤差在0.5℃以內(nèi)。
2)任務(wù)分析:
如上圖所示,系統(tǒng)以51單片機(jī)為控制核心,加上溫度檢測(cè)傳感器DS18B20。利用DS18B20集成溫度傳感器檢測(cè)溫度,然后通過(guò)串口送到單片機(jī)中進(jìn)行數(shù)據(jù)處理變換,最后將溫度值顯示在LED顯示器上。
3)任務(wù)實(shí)施:
1PROTEUS軟件中按圖搭接好電路;
2)Keil軟件中編輯程序,進(jìn)行編譯,得到.HEX格式文件;
3將所得的HEX格式文件在PROTEUS中指定到MCU芯片中;
4運(yùn)行仿真,觀察仿真結(jié)果;
5PROTEUS中結(jié)果正常后,用實(shí)際硬件搭接并調(diào)試電路,通過(guò)編程器將.HEX式文件下載到AT89C51中,通電驗(yàn)證實(shí)驗(yàn)結(jié)果。


    • 實(shí)訓(xùn)報(bào)告
匯編程序如下所示:(C程序請(qǐng)參考教材)

  1. #include <reg52.h>
  2. //#include <intrins.h>
  3. sbit IO_18B20 =P2^0;
  4. unsigned char wei[]={0x1,0x2,0x4,0x8};
  5. char temp_data,temp_data1;
  6. unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
  7. unsigned char disp[]={5,0,0,0};
  8. //void delayx10us(unsigned char t);
  9. void delay_ms( int x);
  10. void write18b20(unsigned char dat);
  11. void tempchange(void);
  12. void display();
  13. void display1();
  14. bit read_bit();
  15. bit Init_Ds18b20();
  16. unsigned char read18b20();
  17. int get18b20temp();

  18. void main()
  19. {
  20.         P0=0Xff;
  21.         P3=0Xff;
  22.         while(1)
  23.         {
  24.    tempchange();
  25.          temp_data=get18b20temp()/16;       // 取整數(shù)部分
  26.                 if(temp_data<0&&temp_data>=(-10)) //如果讀取到的值大于負(fù)10小于 0,顯示負(fù)號(hào)且將值轉(zhuǎn)換為正數(shù)
  27.                 {
  28.      disp[0]= 16;
  29.                  temp_data=0-temp_data;         //將負(fù)數(shù)轉(zhuǎn)換為正數(shù)
  30.                 }
  31.           else
  32.                 {disp[0]=temp_data/100;}
  33.                 temp_data1=temp_data%100;
  34.                 disp[1]=temp_data1/10;
  35.                 disp[2]=temp_data1%10;
  36.                 disp[3]=12;                                //顯示溫度單位C
  37.                 if((temp_data>=(-10))&&(temp_data<=(85))) //如果讀取到的數(shù)值的范圍在-10~85之間,就顯示出來(lái)
  38.                 {
  39.                   display();
  40.                 }
  41.         }
  42. }

  43. bit Init_Ds18b20() //初始化DS18B20
  44. {
  45.         unsigned int i;
  46.          bit ack;
  47.          IO_18B20=0;
  48.          for(i=0;i<100;i++);
  49.          IO_18B20=1;
  50.          for(i=0;i<4;i++);
  51.          for(i=0;i<20;i++)
  52.          {ack=IO_18B20;if(ack==1)break;}
  53.    for(i=0;i<80;i++);
  54.          return (ack);
  55. }

  56. //bit Init_Ds18b20()
  57. //{
  58. //                bit ack;
  59. //                IO_18B20 = 0;
  60. //                delayx10us(50);
  61. //                IO_18B20 = 1;
  62. //                delayx10us(6);
  63. //                ack = IO_18B20;
  64. //                while(!IO_18B20);
  65. //                return ack;
  66. //}


  67. void write18b20(unsigned char dat)  //向DS18B20寫一個(gè)字節(jié),dat為待寫入字節(jié)
  68. {
  69.         unsigned int i;
  70.         unsigned char j;
  71.         bit test;
  72.          for(j=0;j<8;j++)
  73.         {
  74.                 test=dat&0x01;
  75.                 dat=dat>>1;
  76.                 if(test)
  77.                 {
  78.                 IO_18B20=0;
  79.                 i++;i++;
  80.                 IO_18B20=1;
  81.                 for(i=0;i<8;i++);        
  82.                 }
  83.           else
  84.           {
  85.           IO_18B20=0;
  86.           for(i=0;i<8;i++);        
  87.                  IO_18B20=1;
  88.                 i++;i++;        
  89.           }
  90.         }   
  91. }
  92. //void write18b20(unsigned char dat)  //向DS18B20寫一個(gè)字節(jié),dat為待寫入字節(jié)
  93. //{
  94. //    unsigned char i;
  95. //    for(i=0;i<8;i++)
  96. //    {
  97. //        IO_18B20 = 0;           
  98. //        _nop_();
  99. //        _nop_();         
  100. //        IO_18B20 = 1;           
  101. //        _nop_();
  102. //        _nop_();        
  103. //        IO_18B20 = dat & 0x01;
  104. //        delayx10us(6);     
  105. //        IO_18B20 = 1;         
  106. //        dat >>= 1;      
  107. //    }
  108. //}

  109. bit read_bit() //從DS18B20讀取一位數(shù)據(jù)
  110. {
  111.   unsigned int i;
  112.         bit dat;
  113.         IO_18B20=0;
  114.         i++;
  115.         IO_18B20=1;
  116.         i++;i++;
  117.         dat=IO_18B20;
  118.         for(i=0;i<8;i++);
  119.         return (dat);
  120. }

  121. unsigned char read18b20() //從DS18B20讀取一個(gè)字節(jié),dat為讀到的字節(jié)
  122. {
  123.          unsigned char j,h,dat;
  124.          dat=0;        
  125.          for(h=0;h<8;h++)
  126.          {
  127.                 j=read_bit();
  128.                 dat=(j<<7)|(dat>>1);        
  129.          }
  130.          return (dat);
  131. }
  132. //unsigned char read18b20() //從DS18B20讀取一個(gè)字節(jié),dat為讀到的字節(jié)
  133. //{
  134. //    unsigned char i;
  135. //    unsigned char dat=0;        
  136. //    for(i=0 ; i<8 ; i++)
  137. //    {
  138. //        IO_18B20 = 0;        
  139. //        _nop_();
  140. //        _nop_();      
  141. //        IO_18B20 = 1;      
  142. //        dat >>= 1;   
  143. //        if(!IO_18B20)         
  144. //        dat |= 0x80;  
  145. //        delayx10us(6);  
  146. //        IO_18B20 = 1;        
  147. //        _nop_();
  148. //                }
  149. //                return dat;
  150. //}

  151. int get18b20temp() //讀取DS18B20轉(zhuǎn)換的溫度值
  152. {
  153.   int temp;
  154.         unsigned char a,b;
  155.         Init_Ds18b20();
  156.         delay_ms(1);
  157.         write18b20(0xcc);
  158.         write18b20(0xbe);  //寫讀溫度命令
  159.   a=read18b20();
  160.   b=read18b20();        
  161.         temp=b;
  162.         temp<<=8;
  163.         temp=temp|a;
  164.         return temp;
  165. }

  166. void tempchange(void) //向DS18B20發(fā)送轉(zhuǎn)換指令
  167. {
  168.   Init_Ds18b20();
  169.         delay_ms(1);
  170.         write18b20(0xcc); //跳過(guò)ROM
  171.         write18b20(0x44); //啟動(dòng)溫度轉(zhuǎn)換
  172. }

  173. void display()      //顯示函數(shù)
  174. {

  175.         P3=wei[0];
  176.         P0=duan[disp[0]];
  177.         delay_ms(1);
  178.         P3=wei[1];
  179.         P0=duan[disp[1]];
  180.         delay_ms(1);         
  181.         P3=wei[2];
  182.         P0=duan[disp[2]]&0X7F;   //第三位顯示小數(shù)點(diǎn)
  183.         delay_ms(1);
  184.         P3=wei[3];
  185.         P0=duan[disp[3]];
  186.         delay_ms(1);
  187. ……………………

  188. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

全部資料51hei下載地址:
溫度檢測(cè)系統(tǒng)設(shè)計(jì)(DS18B20)(10).rar (132.01 KB, 下載次數(shù): 134)
回復(fù)

使用道具 舉報(bào)

ID:562084 發(fā)表于 2019-6-13 20:31 | 顯示全部樓層
感謝大佬
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
ID:607288 發(fā)表于 2020-3-23 15:12 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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