|
采用51單片機主控的整個遠程溫度監控系統設計出來的實物圖如下:
QQ圖片20170421162843.jpg (46.22 KB, 下載次數: 143)
下載附件
實物(上位機在電腦搭建)
2017-4-21 16:28 上傳
左上角是gprs模塊,需要插入手機卡才能遠程通訊。具有串口接口,顯示部分采用的是lcd12864液晶.
QQ圖片20170421161124.png (4.28 KB, 下載次數: 121)
下載附件
原創全套資料
2017-4-21 16:11 上傳
QQ圖片20170421161018.png (7.65 KB, 下載次數: 115)
下載附件
原創全套資料
2017-4-21 16:11 上傳
任務書1.png (29.54 KB, 下載次數: 141)
下載附件
2017-4-21 17:07 上傳
任務書2.png (15.9 KB, 下載次數: 112)
下載附件
2017-4-21 17:07 上傳
任務書3.png (14.88 KB, 下載次數: 105)
下載附件
2017-4-21 17:07 上傳
原理圖,pcb文件(是用ad畫的附件中可下載工程文件):
0.png (52.82 KB, 下載次數: 122)
下載附件
2017-4-21 17:08 上傳
0.png (67.58 KB, 下載次數: 133)
下載附件
2017-4-21 17:09 上傳
詳盡資料在附件中,因網站上傳限制,需要其他相關資料可留言。這個設計花了大概三個星期時間,gprs實時通訊方面難度相對大。望多多指教!
部分源程序預覽:
- /*******************************************************************************
- * 實驗名 :溫度顯示實驗
- * 使用的IO :
- * 實驗效果 :1602顯示溫度
- * 注意 :
- *******************************************************************************/
- #include<reg51.h>
- #include"LCD12864_SPI.h"
- #include"temp.h"
- #include<math.h>
- #include<string.h>
- #include <all.h>
- sbit K1 = P1^3;
- sbit K2 = P1^4;
- sbit K3 = P1^5;
- sbit K4 = P1^6;
- sbit K5 = P1^7;
- sbit Buzzer1 = P0^2;
- sbit LED1 = P0^0;
- sbit Buzzer2 = P0^5;
- sbit LED2 = P0^6;
- int Temperature = 0; //用于存儲溫度值
- int Deviation = 0; //1存儲偏差
- int Report = 5000; //1高溫報警值
- int Temperature1 = 0; //用于存儲溫度值
- int Deviation1 = 0; //2存儲偏差
- int Report1 = 5000; //2高溫報警值
- char Set = 0;
- unsigned char xdata TCP[] = {"AT+CIPSTART=TCP,103.44.145.245,33601\x0D\x0A"}; //映射的域名對應IP及端口在這里修改
- unsigned char dat[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //定義數組
- unsigned int count=0;
- unsigned char Flag=0;
- unsigned char Num=0;
- #define LenRxBuf 50
- char AT_SK[]="\x0D\x0A> "; // 0D 0A 3E 20 \x0D\x0A
- char AT_Code[]="\x0D\x0AOK"; // 0D 0A 4F 4B 0D 0A
- char CONNECT_OK[]="\x0D\x0ACONNECT OK"; //CONNECT OK // 0D 0A 43 4F 4E 4E 45 43 54 20 4F 4B 0D 0A 0D 0A 4F 4B 0D 0A
- char RsPoint=0; //發送 數組指針
- char xdata RsBuf[LenRxBuf]; //接收緩存
- void REPORT(int temperature, int report, uchar es);
- void UsartConfiguration();
- void TX_Char(unsigned char TXData);
- void Send_Str(unsigned char *str);
- void SendnStr(char *str, char n);//發送字符串
- void Int_Char(int temp);
- void ClrRsBuf(char *p, int len);
- char WaitOK(char *th, char time);
- char Connect_GPRS();
- void KeyScan();
- int TempDeal(int temp);
- void LcdDisplay(int temp);
- void LcdDisplay1(int temp); //lcd顯示
- /*******************************************************************************
- * 函數名 : main
- * 函數功能 : 主函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void main()
- {
- unsigned char i;
- P0=0XFF;
- Buzzer1 = 1; //熄滅LED及關閉蜂鳴器
- LED1 = 1;
- Buzzer2 = 1;
- LED2 = 1;
-
- Lcd_Init(); //初始化LCD12864
- UsartConfiguration(); //初始化串口,波特率9600
- while(1)
- {
-
- KeyScan();
-
- if(Set==0)
- {
- LcdWriteStr(0x80, "Temp1:", 6);
- LcdWriteStr(0x90, "Temp2:", 6);
-
- Temperature = TempDeal(Ds18b20ReadTemp()) + Deviation;
- Temperature1 = TempDeal(Ds18b20ReadTemp1()) + Deviation1;
-
- LcdDisplay(Temperature); //顯示溫度
- LcdDisplay1(Temperature1); //顯示溫度
-
- REPORT(Temperature, Report, 1); //報警
- REPORT(Temperature1, Report1, 2); //報警
-
- }
- // delay_1ms(1000);//1s鐘刷一次
-
-
- if((count>=200) && (Flag==1)) //10s
- {
- count=0;
-
- // ClrRsBuf(RsBuf,50); //清空接收緩沖區
- // RsPoint=0;
- //
- // ES=0; //關閉接收中斷
- // Send_Str("AT+CIPSTATUS\x0D\x0A"); //查詢tcp連接狀態 0D 0A 0D 0A 2B 43 49 50 53 54 41 54 55 53 3A 30 2C 43 4F 4E 4E 45 43 54 20 4F 4B 20 20 0D 0A
- // ES=1; //打開接收中斷
- // if(WaitOK(AT_Code, 10)==1)
- // {
- // LcdWriteCom(0x98); //清空lcd后1行
- // for(i=0;i<16;i++)
- // LcdWriteData(' ');
- // Flag=1;
- // LcdWriteStr(0x98, "CONNECT OK", 10);
- //
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區
- RsPoint=0;
-
- ES=0; //關閉接收中斷
- Send_Str("AT+CIPSEND\x0D\x0A"); //tcp發送
- ES=1; ////打開接收中斷
- if(WaitOK(AT_SK, 2)==1) // '>' 0D 0A 3E 20
- {
- ES=0; //關閉接收中斷
- Int_Char(Temperature);
- Send_Str("節點1溫度值為:");
- SendnStr(dat,8);
- Send_Str(";\x0A");
-
- Int_Char(Temperature1);
- Send_Str("節點2溫度值為:");
- SendnStr(dat,8);
- Send_Str(";\x0A\x1A");
- ES=1; ////打開接收中斷
-
- switch(WaitOK(AT_Code, 3))
- {
- case 0:
- {
- LcdWriteCom(0x98); //清空lcd后1行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteStr(0x98, "SEND FAIL", 9);
- Num++;
- if(Num==10)
- {
- Num=0;
- Flag=0;
- LcdWriteCom(0x88); //清空lcd后2行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteCom(0x98);
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- }
- }
- break;
-
- case 1:
- {
- LcdWriteCom(0x98); //清空lcd后1行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteStr(0x98, "SEND SUCCESS", 12);
- Flag=1;
- }
- break;
-
- default:
- break;
- }
- }
-
- }
-
- }
-
- }
- /*******************************************************************************
- * 函數名 : Int_Char
- * 函數功能 : 整形數據轉換為字符型
- * 輸入 : temp
- * 輸出 : 無
- *******************************************************************************/
- void Int_Char(int temp)
- {
-
- dat[0] = (temp % 10000 / 1000)+0x30;
- dat[1] = (temp % 1000 / 100)+0x30;
- dat[2] = '.';
- dat[3] = (temp % 100 / 10)+0x30;
- dat[4] = (temp % 10)+0x30;
- dat[5] = '\xA1';
- dat[6] = '\xE3';
- dat[7] = 'C';
- }
- /*******************************************************************************
- * 函數名 : REPORT(int temperature, int report, uchar es)
- * 函數功能 : 報警處理,
- * 輸入 : 采集的溫度:temperature;報警溫度:report; 節點選擇:es
- * 輸出 : 無
- *******************************************************************************/
- void REPORT(int temperature, int report, uchar es)
- {
- switch(es)
- {
- case 1:
- {
- if(temperature>=report) //報警temperature
- {
- Buzzer1 = 0;
- LED1 = 0;
-
- }
- else
- {
- Buzzer1 = 1;
- LED1 = 1;
- }
- }
- break;
-
- case 2:
- {
- if(temperature>=report) //報警
- {
- Buzzer2 = 0;
- LED2 = 0;
- }
- else
- {
- Buzzer2 = 1;
- LED2 = 1;
- }
- }
- break;
-
- default:
- break;
- }
- }
- /*******************************************************************************
- * 函數名 :UsartConfiguration()
- * 函數功能 :設置串口
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void UsartConfiguration()
- {
- SCON=0X50; //設置為工作方式1
- TMOD=0X21; //設置計數器1工作方式2;定時器 0工作方式1
- PCON=0X80; //波特率加倍
- TH1=0XFA; //計數器初始值設置,注意波特率是9600;4800的f3
- TL1=0XFA;
-
- TH0=0X3C; //定時50ms
- TL0=0XB0;
-
- ES=0; //bu打開接收中斷
- ET0=1; //打開定時器0中斷
- EA=1; //打開總中斷
-
- TR1=1; //打開計數器1
- TR0=0; //關閉定時器0
- }
- /*******************************************************************************
- * 函數名 : TX_Char(unsigned char TXData)
- * 函數功能 : 串口發送字符
- * 輸入 : TXData
- * 輸出 : 無
- *******************************************************************************/
- void TX_Char(unsigned char TXData)
- {
- SBUF=TXData; //發送數據
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- }
- /*******************************************************************************
- * 函數名 : TX_Char(unsigned char TXData)
- * 函數功能 : 串口發送字符串
- * 輸入 : TXData
- * 輸出 : 無
- *******************************************************************************/
- void Send_Str(unsigned char *str)//發送字符串
- {
- while(*str!='\0')
- {
- TX_Char(*str);
- str++;
- }
- }
- /*******************************************************************************
- * 函數名 : SendnStr(char *str, char n)
- * 函數功能 : 串口發送n字節字符串
- * 輸入 : TXData
- * 輸出 : 無
- *******************************************************************************/
- void SendnStr(char *str, char n)//發送字符串
- {
- while((n--) && (*str!='\0'))
- {
- TX_Char(*str);
- str++;
- }
- }
- /*******************************************************************************
- * 函數名 : ClrRsBuf(char *p,int len)
- * 函數功能 : 清空p指針里len字節長度的內存
- * 輸入 : 指針:p ; 清空長度:len
- * 輸出 : 無
- *******************************************************************************/
- void ClrRsBuf(char *p,int len) //清空
- {
- while(len--)
- {
- *p='\0';
- p++;
- }
- }
- /*******************************************************************************
- * 函數名 : strncmp ( char * s1, char * s2, size_t n)
- * 函數功能 :比較str1與str2的前n個字符,相同返回0;不同返回( *s1 - *s2 )
- * 輸入 : 指針:str1 ; 指針:str2 ;長度:n
- * 輸出 : 比較結果相同返回0;不同返回( *s1 - *s2 )
- *******************************************************************************/
- char strncmp ( char * s1, char * s2, size_t n)
- {
- if ( !n ) //n為0,則返回0
- return(0);
- //在接下來的while循環中
- //第一個循環條件:--n,如果比較到前n個字符,則退出循環
- //第二個循環條件:*s1,如果s1指向字符串末尾,則退出循環
- //第三個循環條件:*s1 == *s2,如果兩字符不等,則退出循環
- while (--n && *s1 && *s1 == *s2)
- {
- s1++;
- s2++;
- }
- return( *s1 - *s2 );
- }
- /*******************************************************************************
- * 函數名 : strlen(const char *str)
- * 函數功能 : 求指針的長度
- * 輸入 : 指針:str
- * 輸出 : 指針的長度
- *******************************************************************************/
- size_t strlen(const char *str)
- {
- size_t length = 0;
- while (*str++)
- ++length;
- return length;
- }
- /*******************************************************************************
- * 函數名 : *strstr( const char *s1, const char *s2 )
- * 函數功能 : 找出s2字符串在s1字符串中第一次出現的位置
- * 輸入 : 指針:s1 ; 指針:s2
- * 輸出 : 返回該位置的指針,如找不到則返回NULL
- *******************************************************************************/
- char *strstr( const char *s1, const char *s2 )
- {
- int len2;
- if ( !(len2 = strlen(s2)) )
- return (char *)s1;
- for ( ; *s1; ++s1 )
- {
- if ( *s1 == *s2 && strncmp( s1, s2, len2 )==0 )
- return (char *)s1;
- }
- return NULL;
- }
- /*******************************************************************************
- * 函數名 : WaitOK(uchar *th, uchar time)
- * 函數功能 : 等待time s的時間,判斷6A模組返回信息是否OK
- * 輸入 : 指針:th ; 等待時間:time
- * 輸出 : OK返回1,否則返回0
- *******************************************************************************/
- char WaitOK(char *th, char time)
- {
- while(time--)
- {
- if(strstr(RsBuf,th) != NULL) //strncmp
- {
- return 1;
- }
-
- else
- {
- if(time!=0)
- delay_1ms(1000);
- }
- }
- return 0;
- }
- /*******************************************************************************
- * 函數名 : Connect_GPRS()
- * 函數功能 : 連接GPRS
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- char Connect_GPRS()
- {
- char i;
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區 AT_Code
- RsPoint=0;
- ES=0; //關閉接收中斷
- Send_Str("ATE0\x0D\x0A"); //ATE0:關閉回顯; ATE1:打開回顯
- ES=1; //打開接收中斷
- if(WaitOK(AT_Code, 10)!=1)
- return 0;
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區 AT_Code
- RsPoint=0;
- ES=0; //關閉接收中斷
- Send_Str("AT+CGATT=1\x0D\x0A"); //GPRS 附著; AT+CGATT=0 GPRS分離
- ES=1; //打開接收中斷
- if(WaitOK(AT_Code, 10)!=1)
- return 0;
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區 AT_Code
- RsPoint=0;
- ES=0; //關閉接收中斷
- Send_Str("AT+CGACT=1,1\x0D\x0A"); //PDP上下文激活 去激活:AT+CGACT=0,1
- ES=1; //打開接收中斷
- if(WaitOK(AT_Code, 10)!=1)
- return 0;
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區 AT_Code
- RsPoint=0;
- ES=0; //關閉接收中斷
- Send_Str("AT+CIFSR\x0D\x0A"); //查詢 IP 地址
- ES=1; //打開接收中斷
- if(WaitOK(AT_Code,10)==1)
- {
- LcdWriteCom(0x88); //清空第3行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteCom(0x88);
-
- for(i=2;i<17;i++)
- {
- if((RsBuf[i]!='\x0D')&&(RsBuf[i]!='\x0A')&&(RsBuf[i]!=' '))
- LcdWriteData(RsBuf[i]);
- }
- }
-
- ClrRsBuf(RsBuf,50); //清空接收緩沖區 AT_Code
- RsPoint=0;
- ES=0; //關閉接收中斷
- Send_Str(TCP); //GPRS TCP 連接
- ES=1; //打開接收中斷
- if(WaitOK(AT_Code,10)==1) //strncmp(RsBuf+17,CONNECT_OK, 10)==0 WaitOK(CONNECT_OK, 10)==1
- {
- LcdWriteCom(0x98); //清空lcd后1行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteStr(0x98, "CONNECT OK", 10);
- Flag=1; //置GPRS連接標志
-
- return 1;
- }
-
- LcdWriteCom(0x88); //清空lcd后1行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteCom(0x98); //清空lcd后1行
- for(i=0;i<16;i++)
- LcdWriteData(' ');
- LcdWriteStr(0x98, "CONNECT ERROR", 13);
- Flag=0; //清GPRS連接標志
-
- return 0;
-
- }
- /*******************************************************************************
- * 函數名 : void Usart()
- * 函數功能 : 串口中斷函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void Usart() interrupt 4 using 3
- {
- if(RI==1)
- {
- RI=0;
- RsBuf[RsPoint++]=SBUF;
- if (RsPoint>=50)
- {
- ES=0; //關閉接收中斷
- RsPoint=50;
- }
- }
- }
- /*******************************************************************************
- * 函數名 : Timer0
- * 函數功能 : 定時器0中斷函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void Timer0() interrupt 1 using 3
- {
- TH0=0X3C; //重裝定時值50ms
- TL0=0XB0;
- count++;
-
- }
- /*******************************************************************************
- * 函數名 : KeyScan
- * 函數功能 : 按鍵檢測函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void KeyScan()
- {
- unsigned char i=0;
- int Dev;
-
- K1=1;
- if(K1==0) //檢測按鍵K1是否按下
- {
- delay_1ms(10); //消除抖動
- if(K1==0) //按鍵1按下時執行該動作
- {
-
- Set += 1;
- if(Set==5)
- Set=0;
-
- LcdWriteCom(0x01); //寫入空格清屏幕
-
- LcdWriteCom(0x80); //設定首行顯示位置
-
- if(Set==1)
- {
- LcdWriteStr(0x80, "Correct Temp1:", 14);
-
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Deviation == 0)
- LcdWriteData(' '); //顯示
- if(Deviation > 0)
- LcdWriteData('+'); //顯示正
- if(Deviation < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Deviation);
-
- dat[0] = Dev % 1000 / 100;
- dat[1] = Dev % 100 / 10;
- dat[2] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[1]); //十分位
- LcdWriteData('0'+dat[2]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- if(Set==2)
- {
- LcdWriteStr(0x80, "Correct Temp2:", 14);
-
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Deviation1 == 0)
- LcdWriteData(' '); //顯示
- if(Deviation1 > 0)
- LcdWriteData('+'); //顯示正
- if(Deviation1 < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Deviation1);
-
- dat[0] = Dev % 1000 / 100;
- dat[1] = Dev % 100 / 10;
- dat[2] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[1]); //十分位
- LcdWriteData('0'+dat[2]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- if(Set==3)
- {
- LcdWriteStr(0x80, "High Ring1:", 10);
-
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Report == 0)
- LcdWriteData(' '); //顯示
- if(Report > 0)
- LcdWriteData('+'); //顯示正
- if(Report < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Report);
-
- dat[0] = Dev % 10000 / 1000;
- dat[1] = Dev % 1000 / 100;
- dat[2] = Dev % 100 / 10;
- dat[3] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //十位
- LcdWriteData('0'+dat[1]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[2]); //十分位
- LcdWriteData('0'+dat[3]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- if(Set==4)
- {
- LcdWriteStr(0x80, "High Ring2:", 10);
-
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Report1 == 0)
- LcdWriteData(' '); //顯示
- if(Report1 > 0)
- LcdWriteData('+'); //顯示正
- if(Report1 < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Report1);
-
- dat[0] = Dev % 10000 / 1000;
- dat[1] = Dev % 1000 / 100;
- dat[2] = Dev % 100 / 10;
- dat[3] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //十位
- LcdWriteData('0'+dat[1]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[2]); //十分位
- LcdWriteData('0'+dat[3]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- while((i<50)&&(K1==0)) //檢測按鍵是否松開
- {
- delay_1ms(10);
- i++;
- }
- i=0;
- }
- }
-
- K2=1;
- if(K2==0) //檢測按鍵K1是否按下
- {
- delay_1ms(10); //消除抖動
- if(K2==0)
- {
-
- if(Set==1)
- {
- Deviation += 10; //按鍵2按下時執行該動作,按一下溫度值正向糾正 0.1°C,最多糾正5°C
- if(Deviation >= 500)
- {
- Deviation = 500;
- }
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Deviation == 0)
- LcdWriteData(' '); //顯示
- if(Deviation > 0)
- LcdWriteData('+'); //顯示正
- if(Deviation < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Deviation);
-
- dat[0] = Dev % 1000 / 100;
- dat[1] = Dev % 100 / 10;
- dat[2] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[1]); //十分位
- LcdWriteData('0'+dat[2]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- if(Set==2)
- {
- Deviation1 += 10; //按鍵2按下時執行該動作,按一下溫度值正向糾正 0.1°C,最多糾正5°C
- if(Deviation1 >= 500)
- {
- Deviation1 = 500;
- }
- LcdWriteCom(0x91); //設定顯示位置
-
- if(Deviation1 == 0)
- LcdWriteData(' '); //顯示
- if(Deviation1 > 0)
- LcdWriteData('+'); //顯示正
- if(Deviation1 < 0)
- LcdWriteData('-'); //顯示負
-
- Dev = abs(Deviation1);
-
- dat[0] = Dev % 1000 / 100;
- dat[1] = Dev % 100 / 10;
- dat[2] = Dev % 10;
-
- LcdWriteData('0'+dat[0]); //個位
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteData('0'+dat[1]); //十分位
- LcdWriteData('0'+dat[2]); //百分位
- LcdWriteData(' ');
- LcdWriteData('C');
- }
-
- if(Set==3)
- {
- Report += 10; //按鍵2按下時執行該動作,按一下溫度報警值正向增加0.1°C
- if(Report >= 9000)
- {
- Report = 9000;
- }
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (45.84 KB, 下載次數: 144)
下載附件
2017-4-21 17:22 上傳
資料下載:
程序 原理圖 用到的包括串口助手,服務器等資料.zip
(4 MB, 下載次數: 405)
2017-4-21 16:23 上傳
點擊文件名下載附件
基于單片機的遠程實時溫度監控系統設計 上位機(gprs通訊) 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|