![]() |
發布時間: 2020-11-11 19:04
正文摘要:最近做設計用到了這個溫濕度變送器,自己寫的代碼以及網上搜集的一些資料進行了統一整理。 代碼評論后可見,資料齊全! 本貼為原創,轉載請注明出處!時間:2020/11/ 祝好! |
最近剛好在學習這個 非常感謝給了一條思路 |
先收藏,有幣再來下 |
用過這個模塊,485觸摸屏通訊。做實驗這個模塊好像只能顯示溫度,沒有開關量控制協議 |
好東西,看看是不是完整的資料!!!!!。。。。。! |
求源碼 |
這個程序好像不完整啊,讀取的溫度,濕度沒有經過處理,沒有顯示啊 |
wbaisen 發表于 2021-11-7 14:14 是的。我用MAX485模塊,不知道你的程序里,方向引腳是接單片機的哪個管腳哦?急! |
wbaisen 發表于 2021-11-7 14:14 MAX485模塊 |
wsh123456789 發表于 2021-8-14 23:20 好久沒看論壇了,你是用485模塊? |
MAX485的方向引腳接哪里?程序未定義啊 |
本帖最后由 wsh123456789 于 2021-8-16 18:28 編輯 看貼的人不能說下嗎?MAX485的方向引腳接哪里? |
大佬看下我的程序,用51單片機讀溫濕度數據 /*****************************main.c 文件程序源代碼*****************************/ #include <reg52.h> #include <intrins.h> /* 數碼管顯示配置,可以不看 */ typedef unsigned char u8; u8 code smgduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned int wendu_H=0x00; //溫度值高4位字節 unsigned int wendu_L=0x00; //溫度值低4位字節 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; /* 485通信 */ unsigned char len; unsigned char pdata buf[40]={0x01,0x03,0x02,0x00,0x00,0x03,0x04,0x73}; sbit RS485_DIR=P1^7; bit flagFrame = 0; //幀接收完成標志,即接收到一幀新數據 bit flagTxd = 0; //單字節發送完成標志,用來替代 TXD 中斷標志位 unsigned char cntRxd = 0; //接收字節計數器 unsigned char pdata bufRxd[64]; //接收字節緩沖區 unsigned char TORH=0; unsigned char TORL=0; /* 延遲函數,數碼管顯示調用 */ void delay(unsigned int t,unsigned int u) { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<u;j++); } /* 串口配置函數,baud-通信波特率 */ void ConfigUART(unsigned int baud) { SCON = 0x50; //配置串口為模式 1 TMOD &= 0x0F; //清零 T1 的控制位 TMOD |= 0x20; //配置 T1 為模式 2 TH1 = 256 - (12000000/12/32)/baud; //計算T1重載值,12M晶振 TL1 = TH1; //初值等于重載值 ET1 = 0; //禁止 T1 中斷 ES = 1; //使能串口中斷 TR1 = 1; //啟動 T1 } void DelayX10us(unsigned char t) { do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }while(--t); } /* 串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度 */ void UartWrite(unsigned char *buf, unsigned char len) { RS485_DIR=1; while (len--) //循環發送所有字節 { flagTxd = 0; //清零發送標志 SBUF = *buf++; //發送一個字節數據 while (!flagTxd); //等待該字節發送完成 } DelayX10us(5); RS485_DIR=0; } /* 串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度 */ unsigned char UartRead(unsigned char *buf, unsigned char len) { unsigned char i; if (len > cntRxd) //指定讀取長度大于實際接收到的數據長度時, { //讀取長度設置為實際接收到的數據長度 len = cntRxd; } for (i=0; i<len; i++) //拷貝接收到的數據到接收指針上 { *buf++ = bufRxd[i]; } cntRxd = 0; //接收計數器清零 return len; //返回實際讀取長度 } /* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */ void UartRxMonitor(unsigned char ms) { static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收計數器大于零時,監控總線空閑時間 { if (cntbkp != cntRxd) //接收計數器改變,即剛接收到數據時,清零空閑計時 { cntbkp = cntRxd; idletmr = 0; } else //接收計數器未改變,即總線空閑時,累積空閑時間 { if (idletmr < 30) //空閑計時小于 30ms 時,持續累加 { idletmr += ms; if (idletmr >= 30) //空閑時間達到 30ms 時,即判定為一幀接收完畢 { flagFrame = 1; //設置幀接收完成標志 } } } } else { cntbkp = 0; } } /* 串口中斷服務函數 */ void InterruptUART() interrupt 4 { if (RI) //接收到新字節 { RI = 0; //清零接收中斷標志位 if (cntRxd < sizeof(bufRxd)) //接收緩沖區尚未用完時, { //保存接收字節,并遞增計數器 bufRxd[cntRxd++] = SBUF; } } if (TI) //字節發送完畢 { TI = 0; //清零發送中斷標志位 flagTxd = 1; //設置字節發送完成標志 } } void ConfigTimer0(unsigned int ms) { unsigned long tmp; tmp=12000000/12; //12M晶振 tmp=(tmp*ms)/1000; tmp=65536-tmp; tmp=tmp+33; TORH=(unsigned char)(tmp>>8); TORL=(unsigned char)tmp; TMOD&=0xF0; TMOD|=0x01; TH0=TORH; TL0=TORL; ET0=1; TR0=1; } void main() { EA=1; ConfigTimer0(1); ConfigUART(2400); //設置波特率2400 delay(200,500); UartWrite(buf,len); //向傳感器發送命令,01 03 02 00 00 03 04 73 if (flagFrame) //有命令到達時,讀取處理該命令 { flagFrame = 0; len = UartRead(buf, sizeof(buf)); //將接收到的命令讀取到緩沖區中 } wendu_H=bufRxd[3]; //數據幀第4字節是溫度值高位, wendu_L=bufRxd[4]; //數據幀第5字節是溫度值低位。 while (1) //以下為數碼管顯示溫度值,16進制表示 { LSA=0; LSB=1; LSC=1; P0=smgduan[wendu_H%16]; delay(10,5); LSA=1; LSB=1; LSC=1; P0=smgduan[wendu_H/16]; delay(10,5); LSA=0; LSB=0; LSC=1; P0=smgduan[wendu_L%16]; delay(10,5); LSA=1; LSB=0; LSC=1; P0=smgduan[wendu_L/16]; delay(10,5); } } void InterruptTimer0() interrupt 1 { TH0 = TORH; //重新加載重載值 TL0 = TORL; UartRxMonitor(1); //串口接收監控 } |
這個變送器買了也有一段時間,現在學習使用。 |
正好需要 學習一下 謝謝樓主 |
樓主,改造成STC89C52啊,IIC接口的OLED屏 |
哪個附件是源碼。第一個嗎? |
好東西,正在學習485,一些東西不明白。 |
zxianyu 發表于 2020-11-29 17:50 配置下51的串口加幾個變量就可以 |
參考下,看是否能用51代替 。 |
多謝分享,正在使用溫度變送器 |
好想法,求看源碼 |
老規矩,先回后下!!!!!!! |
好東西,值得一看 |
gpdt3209 發表于 2020-11-12 15:32 資料齊全 |
資料完整就好了。 |
好東西,看看是不是完整的資料。。。。。。。。。。。 |