|
通過互聯(lián)網(wǎng)絡(luò)TCP(pc機(jī)),遠(yuǎn)程控制四路繼電器開關(guān),和查詢四路溫度DS18B20傳感器的溫度
下位機(jī)使用的是51單片機(jī)
淘寶上淘的TCP轉(zhuǎn)串口模塊,和四路繼電器模塊(底電平觸發(fā))
電路上有5個(gè)指示燈
分別為:電源指示(通電亮) 運(yùn)行指示燈(約1秒閃爍一次,表示單片機(jī)在工作) 聯(lián)網(wǎng)指示(收到心跳表示聯(lián)網(wǎng),燈亮) 數(shù)據(jù)收發(fā)指示(有數(shù)據(jù)接收發(fā)送,閃爍)
下位機(jī)可以有同樣的很多個(gè)(理論上65535個(gè)),為每個(gè)下位機(jī)編一個(gè)ID號來區(qū)分。
上位機(jī)使用C#語言編寫,附件提供源碼下載
下位機(jī)通電后自動使用TCP Socket連接上位機(jī),指示燈可以觀看狀態(tài)
上位機(jī)上可以看到所有連接的下位機(jī)
以下位機(jī)ID,選擇連接的下位機(jī),控制下位機(jī)
因?yàn)闆]有那么多的下位機(jī),所以又編了一個(gè)下位機(jī)的仿真,模仿很多下位機(jī)連接上位機(jī)
試驗(yàn)己成功!
代碼有不合理的地方,謝謝大家糾正
上圖
1.jpg (75.42 KB, 下載次數(shù): 84)
下載附件
上位機(jī)運(yùn)行窗口
2018-4-9 20:36 上傳
2.jpg (76.71 KB, 下載次數(shù): 83)
下載附件
打開繼電器,顯示狀態(tài)
2018-4-9 20:36 上傳
3.jpg (56.62 KB, 下載次數(shù): 88)
下載附件
下位機(jī)仿真
2018-4-9 20:36 上傳
5.jpg (223.91 KB, 下載次數(shù): 83)
下載附件
電路圖,軟件用的不熟,只能畫成這樣了
2018-4-9 20:36 上傳
6.jpg (1.98 MB, 下載次數(shù): 95)
下載附件
焊拉的下位機(jī)實(shí)驗(yàn)電路,己成功運(yùn)行
2018-4-9 20:36 上傳
定義數(shù)據(jù)幀格式
0.png (9.4 KB, 下載次數(shù): 105)
下載附件
2018-4-10 00:08 上傳
數(shù)據(jù)幀:一個(gè)幀由固定16個(gè)字節(jié)組成
字節(jié):一個(gè)字節(jié)由8位二進(jìn)制組成,取值范圍0-255
1、規(guī)定:幀頭1個(gè)字節(jié),定值,二進(jìn)制11111110,十進(jìn)制 254,十六進(jìn)制FE
2、規(guī)定:幀尾1個(gè)字節(jié),定值,二進(jìn)制11111111,十進(jìn)制 255,十六進(jìn)制FF
3、規(guī)定:設(shè)備ID_1,1個(gè)字節(jié),取值范圍0-255
4、規(guī)定:設(shè)備ID_2,1個(gè)字節(jié),取值范圍0-255
5、規(guī)定:控制位固定4個(gè)字節(jié)
6、規(guī)定:數(shù)據(jù)位固定8個(gè)字節(jié)
|
服務(wù)端程序框圖 停止服務(wù)
一、定義設(shè)備ID
名稱 | ID | 密鑰 | 備注 | 服務(wù)器端
| { 0,0 }
| 無
| 服務(wù)器占用的ID
| 1號終端
| { 0,1 }
| {255,255,255,255,255,1}
|
| 2號終端
| { 0,2 }
| {255,255,255,255,255,2}
|
| 3號終端
| { 0,3 }
| {255,255,255,255,255,3}
|
| 4號終端
| { 0,4 }
| {255,255,255,255,255,4}
|
| 5號終端
| { 0,5 }
| {255,255,255,255,255,5}
|
| 6號終端
| { 0,6 }
| {255,255,255,255,255,6}
|
|
二、定義控制位
名稱 | 控制位 | 名稱 | 控制位 | 心跳
| {0,0,0,1}
|
|
| 查詢設(shè)備ID和密鑰
| {0,0,0,2}
| 返回設(shè)備ID和密鑰
| {1,0,0,2}
| 登錄成功
| {0,0,0,3}
| 登錄失敗
| {0,0,0,4}
| 更新用戶信息時(shí)間
| {0,0,0,9}
| 返回更新用戶信息時(shí)間
| {1,0,0,9}
| 查詢溫度1
| {0,0,1,1}
| 返回溫度 1
| {1,0,1,1}
| 查詢溫度2
| {0,0,1,2}
| 返回溫度 2
| {1,0,1,2}
| 查詢溫度3
| {0,0,1,3}
| 返回溫度 3
| {1,0,1,3}
| 查詢溫度4
| {0,0,1,4}
| 返回溫度 4
| {1,0,1,4}
| 查詢開關(guān)1
| {0,0,2,1}
| 返回開關(guān)1狀態(tài)
| {1,0,2,1}
| 查詢開關(guān)2
| {0,0,2,2}
| 返回開關(guān)2狀態(tài)
| {1,0,2,2}
| 查詢開關(guān)3
| {0,0,2,3}
| 返回開關(guān)3狀態(tài)
| {1,0,2,3}
| 查詢開關(guān)4
| {0,0,2,4}
| 返回開關(guān)4狀態(tài)
| {1,0,2,4}
| 設(shè)置開關(guān)1
| {2,0,2,1}
|
|
| 設(shè)置開關(guān)2
| {2,0,2,2}
|
|
| 設(shè)置開關(guān)3
| {2,0,2,3}
|
|
| 設(shè)置開關(guān)4
| {2,0,2,4}
|
|
|
三、定義數(shù)據(jù)位
名稱 | 數(shù)據(jù)位 | 說明 | 設(shè)備ID和密鑰
| {0-255,0-255,0-255,0-255,0-255,0-255,0-255,0-255}
| 前2位是設(shè)備ID,后6位是密鑰
| 打開開關(guān)
| {1,0,0,0,0,0,0,0}
| 1是打開
| 關(guān)閉開關(guān)
| {2,0,0,0,0,0,0,0}
| 2是關(guān)閉
| 返回溫度
| {0-255,0-255,0,0,0,0,0,0}
| 前兩位分別是DS18B20溫度傳感器高位和底位
|
單片機(jī)源程序如下:
- #include "config.h"
- #include<ds1.h>
- #include<ds2.h>
- #include<ds3.h>
- #include<ds4.h>
- void UART_init();
- void PutFrame(uchar *TXStr);
- void DataFrame_Put_init();
- void TEMP_init_var();
- uchar dataFrame[16]; //定義數(shù)據(jù)幀長度為16個(gè)字節(jié)
- uchar dataFrame_RI; //數(shù)據(jù)幀是否己讀取標(biāo)記
- uchar dataFrame_temp[16]; //數(shù)據(jù)幀臨時(shí)緩沖區(qū)16個(gè)字節(jié)
- uchar dataFrame_temp_count; //定義數(shù)據(jù)幀己接收的字節(jié)數(shù)
- //定義發(fā)送數(shù)據(jù)緩沖區(qū)
- uchar DataFrame_Put[16]={DATAFRAME_HEAD,DEVICEID_1,DEVICEID_2,0,0,0,0,0,0,0,0,0,0,0,0,DATAFRAME_TAIL};
- INT32U led1_count; //運(yùn)行指示燈倒計(jì)時(shí)變量
- uchar led1_count2; //運(yùn)行指示燈倒計(jì)時(shí)變量2
- INT32U led2_count; //收到心跳倒計(jì)時(shí)變量
- INT32U led3_count; //有數(shù)據(jù)接收倒計(jì)時(shí)變量
- INT32U led4_count; //有數(shù)據(jù)發(fā)送倒計(jì)時(shí)變量
- #define LED1_COUNT 15000
- #define LED2_COUNT 125000
- #define LED3_COUNT 100
- #define LED4_COUNT 100
- //存儲溫度的高8位和底8位
- uchar ds_M;
- uchar ds_L;
- //溫度變量
- uchar symbol; //符號位
- uchar hundreds; //百位
- uchar decade; //十位
- uchar unit; //個(gè)位
- uchar decimal; //小數(shù)1位
- void main()
- {
- //串口初始化
- UART_init();
- while(1)
- {
- //調(diào)試使用
- //uchar dataFrame[16] = {DATAFRAME_HEAD,DEVICEID_1,DEVICEID_2,0,0,1,1,0,0,0,0,0,0,0,0,DATAFRAME_TAIL};
- //dataFrame_RI = 1; //執(zhí)行時(shí)間2.17微妙
- //如果己接收到一幀數(shù)據(jù)
- if(dataFrame_RI == 1) // 執(zhí)行時(shí)間5.42微秒
- {
- //收到心跳
- if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 1){
- //收到心跳
- DataFrame_Put[3] = 0;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 0;
- DataFrame_Put[6] = 1;
- PutFrame(&DataFrame_Put);
- led2_count = LED2_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 2){
- //收到查詢設(shè)備id
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 0;
- DataFrame_Put[6] = 2;
- DataFrame_Put[7] = DEVICEID_1;
- DataFrame_Put[8] = DEVICEID_2;
- DataFrame_Put[9] = 255;
- DataFrame_Put[10] = 255;
- DataFrame_Put[11] = 255;
- DataFrame_Put[12] = 255;
- DataFrame_Put[13] = 002;
- DataFrame_Put[14] = 001;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 9){
- //收到更新用戶信息時(shí)間,返回
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 0;
- DataFrame_Put[6] = 9;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 1){ // 執(zhí)行時(shí)間15.19 微秒
- //查詢溫度1:0 0 1 1
- TEMP_init_var();
- DS1_ReadWeather(&ds_M,&ds_L);
- Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 1;
- DataFrame_Put[6] = 1;
- DataFrame_Put[7] = symbol;
- DataFrame_Put[8] = hundreds;
- DataFrame_Put[9] = decade;
- DataFrame_Put[10] = unit;
- DataFrame_Put[11] = decimal;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 2){
- //查詢溫度2:0 0 1 2
- TEMP_init_var();
- DS2_ReadWeather(&ds_M,&ds_L);
- Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 1;
- DataFrame_Put[6] = 2;
- DataFrame_Put[7] = symbol;
- DataFrame_Put[8] = hundreds;
- DataFrame_Put[9] = decade;
- DataFrame_Put[10] = unit;
- DataFrame_Put[11] = decimal;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 3){ // 執(zhí)行時(shí)間15.19 微秒
- //查詢溫度3:0 0 1 3
- TEMP_init_var();
- DS3_ReadWeather(&ds_M,&ds_L);
- Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 1;
- DataFrame_Put[6] = 3;
- DataFrame_Put[7] = symbol;
- DataFrame_Put[8] = hundreds;
- DataFrame_Put[9] = decade;
- DataFrame_Put[10] = unit;
- DataFrame_Put[11] = decimal;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 4){
- //查詢溫度4:0 0 1 4
- TEMP_init_var();
- DS4_ReadWeather(&ds_M,&ds_L);
- Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 1;
- DataFrame_Put[6] = 4;
- DataFrame_Put[7] = symbol;
- DataFrame_Put[8] = hundreds;
- DataFrame_Put[9] = decade;
- DataFrame_Put[10] = unit;
- DataFrame_Put[11] = decimal;
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 1){
- //查詢開關(guān)1
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 2;
- DataFrame_Put[6] = 1;
- if(SW1 == 0){
- DataFrame_Put[7] = 1;
- }else{
- DataFrame_Put[7] = 2;
- }
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 2){
- //查詢開關(guān)2
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 2;
- DataFrame_Put[6] = 2;
- if(SW2 == 0){
- DataFrame_Put[7] = 1;
- }else{
- DataFrame_Put[7] = 2;
- }
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 3){
- //查詢開關(guān)3
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 2;
- DataFrame_Put[6] = 3;
- if(SW3 == 0){
- DataFrame_Put[7] = 1;
- }else{
- DataFrame_Put[7] = 2;
- }
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 4){
- //查詢開關(guān)3
- DataFrame_Put[3] = 1;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 2;
- DataFrame_Put[6] = 4;
- if(SW4 == 0){
- DataFrame_Put[7] = 1;
- }else{
- DataFrame_Put[7] = 2;
- }
- PutFrame(&DataFrame_Put);
- led3_count = LED3_COUNT;
- led4_count = LED4_COUNT;
- }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 1){
- //設(shè)置開關(guān)1
- if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW1 = 0;
- }
- else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW1 = 1;
- }
- led3_count = LED3_COUNT;
- }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 2){
- //設(shè)置開關(guān)2
- if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW2 = 0;
- }
- else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW2 = 1;
- }
- led3_count = LED3_COUNT;
- }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 3){
- //設(shè)置開關(guān)3
- if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW3 = 0;
- }
- else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW3 = 1;
- }
- led3_count = LED3_COUNT;
- }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 4){
- //設(shè)置開關(guān)4
- if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW4 = 0;
- }
- else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
- SW4 = 1;
- }
- led3_count = LED3_COUNT;
- }
- dataFrame_RI = 0; //置數(shù)據(jù)幀己讀取
- DataFrame_Put_init(); //初始化發(fā)送幀,為下一次發(fā)送數(shù)據(jù)做準(zhǔn)備
- }
- //LED1運(yùn)行指示燈閃爍,整個(gè)循環(huán)在沒有接收數(shù)據(jù)時(shí),執(zhí)行一次約40us
- if(led1_count > 0){
- led1_count--;
- }else{
- if(led1_count2 == 0){
- led1_count2 = 1;
- }else{
- led1_count2 = 0;
- }
- led1_count = LED1_COUNT;
- }
- if(led1_count > 0){
- if(led1_count2 == 0){
- LED1 = 0;
- }else{
- LED1 = 1;
- }
- led1_count--;
- }
- //收到心跳燈亮20秒
- if(led2_count > 0){
- LED2 = 0;
- led2_count--;
- }else{
- LED2 = 1;
- }
- //有數(shù)據(jù)接收閃一下
- if(led3_count > 0){
- LED3 = 0;
- led3_count--;
- }else{
- LED3 = 1;
- }
- //有數(shù)據(jù)發(fā)送閃一下
- if(led4_count > 0){
- LED4 = 0;
- led4_count--;
- }else{
- LED4 = 1;
- }
- }
- while(1);
- }
- //初始化輸出幀
- void DataFrame_Put_init(){
- DataFrame_Put[3] = 0;
- DataFrame_Put[4] = 0;
- DataFrame_Put[5] = 0;
- DataFrame_Put[6] = 0;
- DataFrame_Put[7] = 0;
- DataFrame_Put[8] = 0;
- DataFrame_Put[9] = 0;
- DataFrame_Put[10] = 0;
- DataFrame_Put[11] = 0;
- DataFrame_Put[12] = 0;
- DataFrame_Put[13] = 0;
- DataFrame_Put[14] = 0;
- }
- //初始化溫度值
- void TEMP_init_var(){
- ds_M = 0;
- ds_L = 0;
- symbol = 0; //符號位
- hundreds = 0; //百位
- decade = 0; //十位
- unit = 0; //個(gè)位
- decimal = 0; //小數(shù)1位
- }
- //初始化
- void UART_init()
- {
- TMOD = 0x20; //T1工作模式2 8位自動重裝
- TH1 = 0xfd;
- TL1 = 0xfd; //比特率9600
- TR1 = 1; //啟動T1定時(shí)器
- SM0 = 0;
- SM1 = 1; //串口工作方式1 10位異步
- REN = 1; //串口允許接收
- EA = 1; //開總中斷
- ES = 1; //串口中斷打開
- }
- //串口發(fā)送一幀數(shù)據(jù)函數(shù),一幀16個(gè)字節(jié)
- void PutFrame(uchar *TXStr)
- {
- uchar i = 0;
- while(1){
- SBUF=*TXStr;
- while(TI == 0); //對方接收后TI置1,停止等待
- TI = 0;
- i++;
- if(i > 15){break;}
- TXStr++;
- }
- }
- void UART() interrupt 4
- {
- if(RI) //檢測是否接收完成
- {
- uchar temp = SBUF;
- RI = 0;
- // 如果接收的一幀,第一個(gè)字節(jié)不是包頭標(biāo)志,則拋棄這個(gè)字節(jié)
- if(dataFrame_temp_count == 0)
- {
- if(temp != DATAFRAME_HEAD)
- return;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 C#上位機(jī)源碼資料包:
0.jpg (12.23 KB, 下載次數(shù): 85)
下載附件
2018-4-10 00:11 上傳
0.png (54.96 KB, 下載次數(shù): 89)
下載附件
2018-4-10 00:11 上傳
所有資料51hei提供下載:
溫度檢查.rar
(851 KB, 下載次數(shù): 142)
2018-4-9 20:40 上傳
點(diǎn)擊文件名下載附件
所有源代碼 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|