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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

溫度檢測系統設計報告(單片機+DS18B20)

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


    • 實訓報告
匯編程序如下所示:(C程序請參考教材)

  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;       // 取整數部分
  26.                 if(temp_data<0&&temp_data>=(-10)) //如果讀取到的值大于負10小于 0,顯示負號且將值轉換為正數
  27.                 {
  28.      disp[0]= 16;
  29.                  temp_data=0-temp_data;         //將負數轉換為正數
  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))) //如果讀取到的數值的范圍在-10~85之間,就顯示出來
  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寫一個字節(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寫一個字節(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讀取一位數據
  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讀取一個字節(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讀取一個字節(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轉換的溫度值
  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ā)送轉換指令
  167. {
  168.   Init_Ds18b20();
  169.         delay_ms(1);
  170.         write18b20(0xcc); //跳過ROM
  171.         write18b20(0x44); //啟動溫度轉換
  172. }

  173. void display()      //顯示函數
  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;   //第三位顯示小數點
  183.         delay_ms(1);
  184.         P3=wei[3];
  185.         P0=duan[disp[3]];
  186.         delay_ms(1);
  187. ……………………

  188. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
溫度檢測系統設計(DS18B20)(10).rar (132.01 KB, 下載次數: 134)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發(fā)
ID:562084 發(fā)表于 2019-6-13 20:31 | 只看該作者
感謝大佬
回復

使用道具 舉報

板凳
ID:607288 發(fā)表于 2020-3-23 15:12 | 只看該作者
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区在线 | 综合一区二区三区 | 欧美亚洲视频 | 亚洲国产欧美在线人成 | 性高湖久久久久久久久3小时 | av天天操| 一级毛片在线播放 | 亚洲精品v日韩精品 | 婷婷91 | a免费视频| 亚洲免费在线 | 中文字幕亚洲精品 | 久久国产秒 | 亚洲精品色 | 久久精品免费观看 | 欧美福利久久 | 极品粉嫩国产48尤物在线播放 | 91中文| 自拍偷拍精品 | 91精品国产一区二区三区 | 精品综合网| 亚洲激情在线 | 日韩在线 | 91不卡 | 亚洲va欧美va天堂v国产综合 | 99精品久久久久 | 精品视频一区在线 | 久草在线青青草 | 亚洲欧美另类在线 | 精品国产欧美 | 欧美一级片 | 国产精品入口麻豆www | 日韩三级| 国产一区二区精华 | 国产情品 | 欧美大片在线观看 | 欧美888| 日韩在线免费视频 | 精品免费国产一区二区三区 | 日韩国产中文字幕 | 精品自拍视频 |