51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著 詳見:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
3.jpg (19.1 KB, 下載次數: 225)
下載附件
2016-3-28 23:56 上傳
第19章 單總線DS18B20通信(無線通信) 1 電路圖 2 程序移植 3 多點測溫
0.png (215.13 KB, 下載次數: 218)
下載附件
2016-3-28 23:37 上傳
DS18B20是一種常用的高精度數字溫度傳感器,長距離(1KM以上)無線通信 在實際工程中也經常用到。 1 電 路 圖 DS18B20是一種很常用的數字溫度傳感器,溫度檢測范圍是-55~+125度,手冊 說明在-10~+85度范圍內檢測誤差為±0.5度,作者在自己的產品中隨機抽樣驗證 了幾只傳感器,在-25度誤差0.1度,+25度與+50度誤差小于0.1度,可見這種傳感 器實際精度是很高的,傳感器引腳如圖19-1所示,工作電壓范圍是3.0~5.5V,通 常使用+5V,電源接反或接錯一般是不會損壞傳感器的,對于單只DS18B20的使 用,我們按圖19-2連接即可。
1.png (86.83 KB, 下載次數: 203)
下載附件
2016-3-28 23:37 上傳
2.png (89.24 KB, 下載次數: 209)
下載附件
2016-3-28 23:37 上傳
9.jpg (21.17 KB, 下載次數: 197)
下載附件
2016-3-28 23:56 上傳
2 程序移植
例 19.1 單 只 DS18B20 的 溫 度 檢 測 , 測 溫 范 圍 -55 ~ +125 度 , 1602 液 晶 顯 示 。 R/C 時 鐘 頻 率 : 22.1184MHz。程序移植時只需要修改DS18B20.H中的18B20信號引腳定義(sbit DQ=P1^5;)與myfun.c 中的延時函數參數保證延時時間基本準確即可,主要程序代碼與運行結果如圖所示。 while(1) { gettemp(); if(flag) // 負溫度 { WriteChar(0,1,'-'); } if(!flag) // 正溫度 { WriteChar(0,1,'+'); } WriteChar(1,1,baiw); WriteChar(2,1,shiw); WriteChar(3,1,gew); WriteChar(4,1,'.'); WriteChar(5,1,point_1); WriteChar(6,1,point_2); WriteChar(7,1,point_3); WriteChar(8,1,point_4); SetCur(NoCur); // 有顯示無光標 }
11.jpg (32.75 KB, 下載次數: 208)
下載附件
2016-3-28 23:56 上傳
3 多點測溫 當一個系統只使用幾只18B20進行溫度檢測時,可將它們的信號端分別接到單片機的幾個IO 口上,然后使用前面介紹的單點溫度檢測程序即可分別讀出傳感器溫度,當一個系統使用幾 百只甚至更多的18B20進行溫度檢測時,需要將多只18B20信號端與電源端分別并接到一起, 多點測溫首先必須取得各個傳感器代碼,類似每個人的身份證號碼一樣是沒有重復的。 例19-4 讀取18B20內部代碼。程序說明:此程序讀取P1口(P1.0、P1.1、P1.2、P1.3)4只 DS18B20代碼并發送給計算機,計算機只接收顯示數據,不向單片機發送任何信息,效果如圖 所示,前面的數據01、02、03、04分別表示單片機P1.0、P1.1、P1.2、P1.3引腳,后面的8 字節才是18B20的內部代碼,代碼這里就不寫出來了,需要的讀者請查看配套資源。
14.jpg (6.8 KB, 下載次數: 205)
下載附件
2016-3-28 23:56 上傳
15.jpg (14.62 KB, 下載次數: 204)
下載附件
2016-3-28 23:56 上傳
13.jpg (50.61 KB, 下載次數: 222)
下載附件
2016-3-28 23:56 上傳
下圖是通過計算機操作,運用無線電波傳送數據的完整結構圖,整個系統使 用一臺計算機作主機對數據進行顯示與存儲,使用多個單片機作分機對18B20 進行溫度采集。 單片機系統電路圖,只畫了1組IO口,可同時使用多組IO口
0.png (269.39 KB, 下載次數: 216)
下載附件
2016-3-28 23:39 上傳
多點測溫程序(部分文件預覽,如需下載全部源碼請下載本帖附件):ds18b20.h文件:
主程序:
- /****************《51單片機輕松入門-基于STC15W4K系列》配套例程 *************
- ★★★★★★★★★★★★★★★★★★★★★★★★
- 《51單片機輕松入門-基于STC15W4K系列》 一書已經由北航出版社正式出版發行。
- 作者親手創作的與教材配套的51雙核實驗板(2個MCU)對程序下載、調試、仿真方便,不需要外部
- 仿真器與編程器,這種設計方式徹底解決了系統中多個最高優先級誰也不能讓誰的中斷競爭問題。
- QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
- 驗證信息:STC15單片機
- 郵箱:[email]xgliyouquan@126.com[/email]
- ★★★★★★★★★★★★★★★★★★★★★★★★*/
- //18B20多點測溫程序,11.0592M晶振
- #include "STC15W4K.H"
- #include "usart.h"
- #include "ds18b20.h"
- #define CONVERT 0x44 // 收主機轉換溫度命令
- #define GETTEMP 0xaa // 收主機讀溫度命令
- #define GETHOUSE 0xcc // 收主機讀倉庫濕度命令
- #define GETAREA 0xd6 // 收主機讀庫區濕度命令
- #define GETSTATE 0x11 // 收主機通信檢測命令
- #define SENDAREA 0xdd // 向主機發庫區濕度
- #define SENDHOUSE 0xce // 向主機發倉庫濕度
- #define CVTOK 0x88 // 向主機發轉換溫度完畢命令
- #define CPUOK 0x22 // 向主機發通信正常命令
- #define TEMPDATA 0xbb // 向主機發溫度命令
- unsigned char Port,Pin,count=0; //單片機端口P0、P1、P2、P3,端口具體引腳(1-8),接收計數器
-
- unsigned char send_buff[14]; // 發送緩沖區14字節,加幀頭幀尾共16字節每幀
- unsigned char ReceivdID_buff[8]; // 存儲主機發來的rom ID為8字節
- unsigned char receivedcmd[16]; // 存放接收到的命令 1:幀頭,2發送機號,3本機ID,4命令,5port,6pin,7-14ID,15CRC,16幀尾
- unsigned char temp_buff[9]; // 存儲讀取的溫度字節,讀溫度為9字節,讀rom ID為8字節
- unsigned char code CrcTable [256]={
- 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
- 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
- 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
- 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
- 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
- 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
- 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
- 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
- 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
- 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
- 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
- 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
- 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
- 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
- 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
- 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
- //反序CRC查表校驗
- unsigned char crc8_f_table (unsigned char *ptr, unsigned char len)
- {
- unsigned char i;
- unsigned char crc =0;
- for(i=0;i<len;i++) 查表校驗
- {
- crc= CrcTable[crc^ptr[i]]; // ^是按位異或運算符
- }
- return(crc);
- }
- void port_mode() // 端口模式
- {
- P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
- P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
- }
- void main()
- {
- unsigned char i;
- unsigned char crccount; // crc校驗次數
- unsigned char crc_data; // crc校驗結果
- port_mode(); // 所有IO口設為準雙向弱上拉方式。
- com_init(); // 串口初始化
- while(1)
- {
- if(count==16) //count是全局變量,表示串口已收到的字節數
- {
- count=0;
-
- for(i=0;i<14;i++)
- {
- send_buff[i]=receivedcmd[i+1]; //取出接收幀2——15字節(舍棄幀頭幀尾),準備CRC校驗
- }
- crc_data=crc8_f_table(send_buff,14); //發送緩沖區14字節全部參與CRC校驗
- if(crc_data==0&&receivedcmd[15]==FMEND)//如果CRC正確且幀尾有效
- {
- switch(send_buff[2])
- {
- case CONVERT: // 溫度轉換命令 0x44
- {
- REN=0; // 禁止串口接收
- ES=0; // 關串口中斷
- TempConvertAll();
- ES=1; //開串口中斷
- REN=1;
- send_buff[0]=MYID; // 本分機ID
- send_buff[1]=MAINID; // 主機ID=0x00
- send_buff[2]=CVTOK; // 溫度轉換完畢命令0x88
- crc_data=crc8_f_table(send_buff,13);
- send_buff[13]=crc_data;
- sendcombytes(); // 發送一幀完整數據
- break;
- }
- case GETTEMP: // 讀取溫度命令 0xaa
- {
- Port=send_buff[3]; // 確定端口(P0、P1、P2、P3)
- Pin=send_buff[4]; // 確定端口具體引腳(數據0x80、0x40、0x20、0x010、0x08、0x04、0x02、0x01)
- for(i=0;i<8;i++)
- {
- ReceivdID_buff[i]=send_buff[i+5]; // 匹配ROM命令必須用ReceivdID_buff[i]
- }
- REN=0; // 禁止串口接收
- ES=0; // 關串口中斷
- crccount=0;
- do //同一ID傳感器允許讀4次溫度,4次失敗則退出。
- {
- GetTemp();
- crc_data=crc8_f_table(temp_buff,9); //要使用校驗碼,讀溫度必然是連續9字節
- crccount++;
- }while(!(crccount>4||crc_data==0)); //校驗次數>4或校驗正確立即退出循環
- ES=1; // 開串口中斷
- REN=1; // 允許串口接收
- send_buff[0]=MYID;
- send_buff[1]=MAINID;
- send_buff[2]=TEMPDATA; // 向主機發溫度命令 0xbb
- if(crc_data==0)
- {
- send_buff[3]=temp_buff[0]; // 原始溫度低字節
- send_buff[4]=temp_buff[1]; // 原始溫度高字節
- }
- else
- {
- send_buff[3]=0xff;
- send_buff[4]=0xff;
- }
- for(i=0;i<8;i++)
- {
- send_buff[i+5]=ReceivdID_buff[i];
- }
- crc_data=crc8_f_table(send_buff,13);
- send_buff[13]=crc_data;
- sendcombytes();
- break;
- }
- case GETSTATE: // 主機通信檢測命令0x11,確認主機與分機通信是否正常
- {
- send_buff[0]=MYID;
- send_buff[1]=MAINID;
- send_buff[2]=CPUOK; // CPUOK 0x22
- for(i=0;i<10;i++)
- {
- send_buff[i+3]=0x55;
- }
- crc_data=crc8_f_table(send_buff,13);
- send_buff[13]=crc_data;
- sendcombytes();
- break;
- }
- case GETHOUSE: //倉庫濕度命令 0xce
- {
- ;
- }
- case GETAREA: // 庫區濕度命令 0xd6
- {
- ;
- }
- default:break;
- }
- }
- }
- }
- }
復制代碼
0.png (33.31 KB, 下載次數: 223)
下載附件
2016-3-28 23:52 上傳
單片機單只18B20測溫程序(使用Float處理數據):http://www.zg4o1577.cn/bbs/dpj-47289-1.html
單只18B20測溫程序(1602寫字符串方式) :http://www.zg4o1577.cn/bbs/dpj-47288-1.html
單只DS18B20測溫程序(1602寫單字符方式):http://www.zg4o1577.cn/bbs/dpj-47287-1.html
IR中斷方式的單片機紅外解碼程序http://www.zg4o1577.cn/bbs/dpj-47283-1.html
DS18B20無線多點測溫單片機程序:http://www.zg4o1577.cn/bbs/dpj-47291-1.html
單片機讀取DS18B20內部溫度上傳到上位機(電腦) :http://www.zg4o1577.cn/bbs/dpj-47290-1.html
5個完整源碼下載:
第19章 單總線18B20.rar
(6.95 MB, 下載次數: 169)
2016-3-28 23:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|