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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20無線多點測溫單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:110653 發表于 2016-3-29 01:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

DS18B20是一種很常用的數字溫度傳感器,溫度檢測范圍是-55~+125度,手冊 說明在-10~+85度范圍內檢測誤差為±0.5度,作者在自己的產品中隨機抽樣驗證 了幾只傳感器,在-25度誤差0.1度,+25度與+50度誤差小于0.1度,可見這種傳感 器實際精度是很高的,傳感器引腳如圖19-1所示,工作電壓范圍是3.0~5.5V,通 常使用+5V,電源接反或接錯一般是不會損壞傳感器的,對于單只DS18B20的使用,我們按圖19-2連接即可。




電路和介紹詳見:http://www.zg4o1577.cn/bbs/dpj-47286-1.html(在這貼附件中可下載ds18b20無線多點測溫的完整源碼壓縮包)
單片機下位機主程序如下(部分預覽):

  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. //18B20多點測溫程序,11.0592M晶振
  11. #include "STC15W4K.H"
  12. #include "usart.h"
  13. #include "ds18b20.h"
  14. #define CONVERT 0x44        // 收主機轉換溫度命令
  15. #define GETTEMP 0xaa        // 收主機讀溫度命令
  16. #define GETHOUSE 0xcc       // 收主機讀倉庫濕度命令
  17. #define GETAREA 0xd6        // 收主機讀庫區濕度命令
  18. #define GETSTATE 0x11       // 收主機通信檢測命令
  19. #define SENDAREA 0xdd       // 向主機發庫區濕度
  20. #define SENDHOUSE 0xce      // 向主機發倉庫濕度
  21. #define CVTOK 0x88          // 向主機發轉換溫度完畢命令
  22. #define CPUOK 0x22                        // 向主機發通信正常命令
  23. #define TEMPDATA 0xbb       // 向主機發溫度命令         
  24. unsigned char Port,Pin,count=0;         //單片機端口P0、P1、P2、P3,端口具體引腳(1-8),接收計數器

  25. unsigned char send_buff[14];          // 發送緩沖區14字節,加幀頭幀尾共16字節每幀
  26. unsigned char ReceivdID_buff[8];  // 存儲主機發來的rom ID為8字節
  27. unsigned char receivedcmd[16];    // 存放接收到的命令 1:幀頭,2發送機號,3本機ID,4命令,5port,6pin,7-14ID,15CRC,16幀尾
  28. unsigned char temp_buff[9];       // 存儲讀取的溫度字節,讀溫度為9字節,讀rom ID為8字節

  29. unsigned char code CrcTable [256]={
  30. 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
  31. 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
  32. 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
  33. 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
  34. 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
  35. 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
  36. 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
  37. 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
  38. 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
  39. 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
  40. 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
  41. 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
  42. 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
  43. 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
  44. 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
  45. 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};       

  46. //反序CRC查表校驗
  47. unsigned char crc8_f_table (unsigned char *ptr, unsigned char len)
  48. {
  49.         unsigned char i;
  50.         unsigned char crc =0;
  51.         for(i=0;i<len;i++)               // 查表校驗
  52.         {
  53.                 crc= CrcTable[crc^ptr[i]];   // ^是按位異或運算符
  54.         }
  55.         return(crc);
  56. }
  57. void port_mode()            // 端口模式
  58. {
  59.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  60.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  61. }
  62. void main()         
  63. {
  64.         unsigned char i;
  65.         unsigned char crccount;          // crc校驗次數       
  66.         unsigned char crc_data;          // crc校驗結果
  67.         port_mode();                  // 所有IO口設為準雙向弱上拉方式。
  68.         com_init();                              // 串口初始化        
  69.         while(1)
  70.         {                       
  71.                 if(count==16)    //count是全局變量,表示串口已收到的字節數
  72.                 {         
  73.                         count=0;
  74.                                         
  75.                         for(i=0;i<14;i++)
  76.                         {
  77.                                 send_buff[i]=receivedcmd[i+1];          //取出接收幀2——15字節(舍棄幀頭幀尾),準備CRC校驗
  78.                         }               
  79.                         crc_data=crc8_f_table(send_buff,14);  //發送緩沖區14字節全部參與CRC校驗               
  80.                         if(crc_data==0&&receivedcmd[15]==FMEND)//如果CRC正確且幀尾有效
  81.                         {         
  82.                                 switch(send_buff[2])
  83.                                 {
  84.                                         case CONVERT:                           // 溫度轉換命令 0x44
  85.                                         {
  86.                                                 REN=0;                 // 禁止串口接收
  87.                                                 ES=0;                  // 關串口中斷
  88.                                                 TempConvertAll();
  89.                                                 ES=1;                  //開串口中斷
  90.                                                 REN=1;
  91.                                                 send_buff[0]=MYID;           // 本分機ID
  92.                                                 send_buff[1]=MAINID;   // 主機ID=0x00
  93.                                                 send_buff[2]=CVTOK;           // 溫度轉換完畢命令0x88
  94.                                                 crc_data=crc8_f_table(send_buff,13);
  95.                                                 send_buff[13]=crc_data;
  96.                                                 sendcombytes();                   // 發送一幀完整數據
  97.                                                 break;
  98.                             }
  99.                                         case GETTEMP:                           // 讀取溫度命令 0xaa
  100.                                         {                                                
  101.                                                 Port=send_buff[3];          // 確定端口(P0、P1、P2、P3)
  102.                                                 Pin=send_buff[4];          // 確定端口具體引腳(數據0x80、0x40、0x20、0x010、0x08、0x04、0x02、0x01)
  103.                                                 for(i=0;i<8;i++)
  104.                                                 {
  105.                                                         ReceivdID_buff[i]=send_buff[i+5];        // 匹配ROM命令必須用ReceivdID_buff[i]
  106.                                                 }
  107.                                                 REN=0;                // 禁止串口接收
  108.                                                 ES=0;                 // 關串口中斷
  109.                                                 crccount=0;
  110.                                                 do                                          //同一ID傳感器允許讀4次溫度,4次失敗則退出。
  111.                                                 {
  112.                                                         GetTemp();
  113.                                                         crc_data=crc8_f_table(temp_buff,9);         //要使用校驗碼,讀溫度必然是連續9字節
  114.                                                         crccount++;
  115.                                                 }while(!(crccount>4||crc_data==0));             //校驗次數>4或校驗正確立即退出循環
  116.                                                 ES=1;                 // 開串口中斷
  117.                                                 REN=1;                // 允許串口接收                                                                                                
  118.                                                 send_buff[0]=MYID;
  119.                                                 send_buff[1]=MAINID;
  120.                                                 send_buff[2]=TEMPDATA;        // 向主機發溫度命令        0xbb
  121.                                                 if(crc_data==0)
  122.                                                 {
  123.                                                         send_buff[3]=temp_buff[0];        // 原始溫度低字節
  124.                                                         send_buff[4]=temp_buff[1];        // 原始溫度高字節
  125.                                                 }
  126.                                                 else
  127.                                                 {
  128.                                                         send_buff[3]=0xff;
  129.                                                         send_buff[4]=0xff;
  130.                                                 }
  131.                                                 for(i=0;i<8;i++)
  132.                                                 {
  133.                                                         send_buff[i+5]=ReceivdID_buff[i];       
  134.                                                 }                                                       
  135.                                                 crc_data=crc8_f_table(send_buff,13);
  136.                                                 send_buff[13]=crc_data;
  137.                                                 sendcombytes();
  138.                                                 break;
  139.                                         }
  140.                                         case GETSTATE:                           // 主機通信檢測命令0x11,確認主機與分機通信是否正常  
  141.                                         {
  142.                                                 send_buff[0]=MYID;
  143.                                                 send_buff[1]=MAINID;
  144.                                                 send_buff[2]=CPUOK;           // CPUOK 0x22
  145.                                                 for(i=0;i<10;i++)
  146.                                                 {
  147.                                                         send_buff[i+3]=0x55;
  148.                                                 }
  149.                                                 crc_data=crc8_f_table(send_buff,13);
  150.                                                 send_buff[13]=crc_data;
  151.                                                 sendcombytes();
  152.                                                 break;
  153.                                         }
  154.                                         case GETHOUSE:                                  //倉庫濕度命令 0xce
  155.                                         {
  156.                                                 ;       
  157.                                         }
  158.                                         case GETAREA:                              // 庫區濕度命令 0xd6
  159.                                         {
  160.                                                 ;
  161.                                         }
  162.                                         default:break;
  163.                                 }                                
  164.                         }                        
  165.                 }
  166.         }
  167. }
復制代碼

usart.c文件:
  1. /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
  4.   作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
  5.   仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         驗證信息:STC15單片機
  8.   郵箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. #include "usart.h"
  11. extern unsigned char send_buff[14];            // 發送緩沖區14字節,加幀頭幀尾共16字節每幀
  12. extern unsigned char ReceivdID_buff[8]; // 存儲主機發來的rom ID為8字節
  13. extern unsigned char receivedcmd[16];   // 存放接收到的命令 1:幀頭,2發送ID,3本機ID,4命令,5port,6pin,7-14ID,15CRC,16幀尾
  14. extern unsigned char count;                                // 主程序中的全局變量

  15. //初始串口(晶振頻率 11.0592M)
  16. void com_init()
  17. {
  18.   SCON = 0x50; //01010 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接受)
  19.   TMOD = 0x20; //0010 0000 定時器1工作于方式2(8位自動重裝方式)
  20.   TR1=1;                  // 定時器1開始運行
  21.   PCON=PCON&0x7f;              // SMOD=0,波特率不倍增。
  22.   switch(BAUDRATE)        //波特率設置
  23.   {
  24.     case 1200:TL1=0xe8;
  25.               TH1=0Xe8;
  26.               break;
  27.     case 2400:TL1=0xf3;   
  28.               TH1=0xf3;   
  29.               break;
  30.     case 4800:TL1=0xfa;
  31.               TH1=0Xfa;
  32.               break;
  33.     case 9600:TL1=0xfd;
  34.               TH1=0Xfd;
  35.               break;
  36.     case 19200:PCON=PCON|0x80;
  37.               TL1=0xfd;
  38.               TH1=0Xfd;
  39.               break;
  40.     case 38400:PCON=PCON|0x80;
  41.               TL1=0xfe;
  42.               TH1=0Xfe;
  43.               break;
  44.     default:  TL1=0xfd;
  45.               TH1=0Xfd;
  46.               break;
  47.   }
  48.   AUXR = 0x00;             // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0
  49.   EA=1;
  50.   ES=1;
  51. }
  52. /**************************************/
  53. //發送一個字節數據
  54. void sendcombyte(unsigned char dat)
  55. {
  56.         SBUF=dat;
  57.         while(TI==0);
  58.         TI=0;
  59. }
  60. /*********************************************/
  61. //發送一幀完整數據
  62. void sendcombytes()
  63. {  
  64.         unsigned char i;
  65.         sendcombyte(FMBEGIN);
  66.         for(i=0;i<14;i++)
  67.         {
  68.                 sendcombyte(send_buff[i]);
  69.         }
  70.         sendcombyte(FMEND);
  71. }
  72. /***********************************************/
  73. //串口中斷服務程序
  74. void serial_init () interrupt 4
  75. {
  76.         if(RI)                              // 只處理接收中斷
  77.         {
  78.                 if(count==16)count=0; //如果已經接收了16個字符,主程序還沒來得及處理又發來下一幀數據
  79.                                       //,則count清零,覆蓋上一幀數據,保證數據接收不錯位
  80.                 receivedcmd[count]=SBUF;
  81.                 RI=0;
  82.                
  83.                 switch(count)
  84.                 {
  85.                         case 0:                            // 判斷幀頭是否正確
  86.                         {
  87.                                 if(receivedcmd[count]==FMBEGIN)count++;
  88.                                 else count=0;
  89.                                 break;
  90.                         }
  91.                         case 1:                                // 判斷是否是主機信息
  92.                         {
  93.                        
  94.                                 if(receivedcmd[count]==MAINID)count++;
  95.                                 else
  96.                                 {
  97.                                         count=0;
  98.                                 }       
  99.                                 break;
  100.                         }       
  101.                         case 2:
  102.                         {                       // 判斷是否是本機信息
  103.                                 if(receivedcmd[count]==MYID)count++;                                
  104.                                 else count=0;
  105.                                 break;
  106.                         }
  107.                         default:count++;       
  108.                 }
  109.         }
  110. }
復制代碼



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

使用道具 舉報

沙發
ID:190731 發表于 2017-4-29 17:29 | 只看該作者
請問這個是無線的嗎
回復

使用道具 舉報

板凳
ID:190731 發表于 2017-4-29 17:37 | 只看該作者
感謝樓主分享
回復

使用道具 舉報

地板
ID:190731 發表于 2017-4-29 17:38 | 只看該作者
這些是不是完整的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久星辰影院 | 久久久成人精品 | 亚洲最大看片网站 | 天堂在线免费视频 | 国产成人一区二区三区 | 日韩中字幕 | 伊人青青久久 | 深夜爽视频 | 亚洲性视频在线 | caoporon| 成人av播放 | 亚洲国产成人精品女人久久久 | 日韩在线中文字幕 | 在线国产一区二区三区 | 亚洲精品2 | 国产精品福利久久久 | 亚洲在线视频 | 偷拍自拍网 | 国产99视频精品免视看9 | 精品视频一区二区三区在线观看 | 美女三区| 亚洲视频手机在线 | 亚洲精品91| 国产在线一| 免费看一级毛片 | 亚洲精品久久久一区二区三区 | 精品国产伦一区二区三区观看方式 | 狠狠色综合久久婷婷 | 午夜天堂 | 国产精品1区 | 欧美三级视频 | 99这里只有精品视频 | 久久久新视频 | 久久久精品一区二区三区 | 中文字幕第一页在线 | 午夜视频在线免费观看 | 男人的天堂在线视频 | 国产一区二区三区在线看 | 91免费入口 | 亚洲精品乱 | 日韩不卡在线 |