熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2020-11-11 19:04
正文摘要:最近做設(shè)計(jì)用到了這個(gè)溫濕度變送器,自己寫(xiě)的代碼以及網(wǎng)上搜集的一些資料進(jìn)行了統(tǒng)一整理。 代碼評(píng)論后可見(jiàn),資料齊全! 本貼為原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!時(shí)間:2020/11/ 祝好! |
| 最近剛好在學(xué)習(xí)這個(gè) 非常感謝給了一條思路 |
| 先收藏,有幣再來(lái)下 |
| 用過(guò)這個(gè)模塊,485觸摸屏通訊。做實(shí)驗(yàn)這個(gè)模塊好像只能顯示溫度,沒(méi)有開(kāi)關(guān)量控制協(xié)議 |
| 好東西,看看是不是完整的資料!!!!!!!!!!!! |
|
求源碼 |
| 這個(gè)程序好像不完整啊,讀取的溫度,濕度沒(méi)有經(jīng)過(guò)處理,沒(méi)有顯示啊 |
wbaisen 發(fā)表于 2021-11-7 14:14 是的。我用MAX485模塊,不知道你的程序里,方向引腳是接單片機(jī)的哪個(gè)管腳哦?急! |
wbaisen 發(fā)表于 2021-11-7 14:14 MAX485模塊 |
wsh123456789 發(fā)表于 2021-8-14 23:20 好久沒(méi)看論壇了,你是用485模塊? |
| MAX485的方向引腳接哪里?程序未定義啊 |
|
本帖最后由 wsh123456789 于 2021-8-16 18:28 編輯 看貼的人不能說(shuō)下嗎?MAX485的方向引腳接哪里? |
|
大佬看下我的程序,用51單片機(jī)讀溫濕度數(shù)據(jù) /*****************************main.c 文件程序源代碼*****************************/ #include <reg52.h> #include <intrins.h> /* 數(shù)碼管顯示配置,可以不看 */ 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位字節(jié) unsigned int wendu_L=0x00; //溫度值低4位字節(jié) 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; //幀接收完成標(biāo)志,即接收到一幀新數(shù)據(jù) bit flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來(lái)替代 TXD 中斷標(biāo)志位 unsigned char cntRxd = 0; //接收字節(jié)計(jì)數(shù)器 unsigned char pdata bufRxd[64]; //接收字節(jié)緩沖區(qū) unsigned char TORH=0; unsigned char TORL=0; /* 延遲函數(shù),數(shù)碼管顯示調(diào)用 */ void delay(unsigned int t,unsigned int u) { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<u;j++); } /* 串口配置函數(shù),baud-通信波特率 */ void ConfigUART(unsigned int baud) { SCON = 0x50; //配置串口為模式 1 TMOD &= 0x0F; //清零 T1 的控制位 TMOD |= 0x20; //配置 T1 為模式 2 TH1 = 256 - (12000000/12/32)/baud; //計(jì)算T1重載值,12M晶振 TL1 = TH1; //初值等于重載值 ET1 = 0; //禁止 T1 中斷 ES = 1; //使能串口中斷 TR1 = 1; //啟動(dòng) T1 } void DelayX10us(unsigned char t) { do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }while(--t); } /* 串口數(shù)據(jù)寫(xiě)入,即串口發(fā)送函數(shù),buf-待發(fā)送數(shù)據(jù)的指針,len-指定的發(fā)送長(zhǎng)度 */ void UartWrite(unsigned char *buf, unsigned char len) { RS485_DIR=1; while (len--) //循環(huán)發(fā)送所有字節(jié) { flagTxd = 0; //清零發(fā)送標(biāo)志 SBUF = *buf++; //發(fā)送一個(gè)字節(jié)數(shù)據(jù) while (!flagTxd); //等待該字節(jié)發(fā)送完成 } DelayX10us(5); RS485_DIR=0; } /* 串口數(shù)據(jù)讀取函數(shù),buf-接收指針,len-指定的讀取長(zhǎng)度,返回值-實(shí)際讀到的長(zhǎng)度 */ unsigned char UartRead(unsigned char *buf, unsigned char len) { unsigned char i; if (len > cntRxd) //指定讀取長(zhǎng)度大于實(shí)際接收到的數(shù)據(jù)長(zhǎng)度時(shí), { //讀取長(zhǎng)度設(shè)置為實(shí)際接收到的數(shù)據(jù)長(zhǎng)度 len = cntRxd; } for (i=0; i<len; i++) //拷貝接收到的數(shù)據(jù)到接收指針上 { *buf++ = bufRxd[i]; } cntRxd = 0; //接收計(jì)數(shù)器清零 return len; //返回實(shí)際讀取長(zhǎng)度 } /* 串口接收監(jiān)控,由空閑時(shí)間判定幀結(jié)束,需在定時(shí)中斷中調(diào)用,ms-定時(shí)間隔 */ void UartRxMonitor(unsigned char ms) { static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收計(jì)數(shù)器大于零時(shí),監(jiān)控總線空閑時(shí)間 { if (cntbkp != cntRxd) //接收計(jì)數(shù)器改變,即剛接收到數(shù)據(jù)時(shí),清零空閑計(jì)時(shí) { cntbkp = cntRxd; idletmr = 0; } else //接收計(jì)數(shù)器未改變,即總線空閑時(shí),累積空閑時(shí)間 { if (idletmr < 30) //空閑計(jì)時(shí)小于 30ms 時(shí),持續(xù)累加 { idletmr += ms; if (idletmr >= 30) //空閑時(shí)間達(dá)到 30ms 時(shí),即判定為一幀接收完畢 { flagFrame = 1; //設(shè)置幀接收完成標(biāo)志 } } } } else { cntbkp = 0; } } /* 串口中斷服務(wù)函數(shù) */ void InterruptUART() interrupt 4 { if (RI) //接收到新字節(jié) { RI = 0; //清零接收中斷標(biāo)志位 if (cntRxd < sizeof(bufRxd)) //接收緩沖區(qū)尚未用完時(shí), { //保存接收字節(jié),并遞增計(jì)數(shù)器 bufRxd[cntRxd++] = SBUF; } } if (TI) //字節(jié)發(fā)送完畢 { TI = 0; //清零發(fā)送中斷標(biāo)志位 flagTxd = 1; //設(shè)置字節(jié)發(fā)送完成標(biāo)志 } } 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); //設(shè)置波特率2400 delay(200,500); UartWrite(buf,len); //向傳感器發(fā)送命令,01 03 02 00 00 03 04 73 if (flagFrame) //有命令到達(dá)時(shí),讀取處理該命令 { flagFrame = 0; len = UartRead(buf, sizeof(buf)); //將接收到的命令讀取到緩沖區(qū)中 } wendu_H=bufRxd[3]; //數(shù)據(jù)幀第4字節(jié)是溫度值高位, wendu_L=bufRxd[4]; //數(shù)據(jù)幀第5字節(jié)是溫度值低位。 while (1) //以下為數(shù)碼管顯示溫度值,16進(jìn)制表示 { 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); //串口接收監(jiān)控 } |
| 這個(gè)變送器買(mǎi)了也有一段時(shí)間,現(xiàn)在學(xué)習(xí)使用。 |
| 正好需要 學(xué)習(xí)一下 謝謝樓主 |
| 樓主,改造成STC89C52啊,IIC接口的OLED屏 |
| 哪個(gè)附件是源碼。第一個(gè)嗎? |
| 好東西,正在學(xué)習(xí)485,一些東西不明白。 |
zxianyu 發(fā)表于 2020-11-29 17:50 配置下51的串口加幾個(gè)變量就可以 |
| 參考下,看是否能用51代替 。 |
| 多謝分享,正在使用溫度變送器 |
| 好想法,求看源碼 |
|
老規(guī)矩,先回后下!!!!!!! |
| 好東西,值得一看 |
gpdt3209 發(fā)表于 2020-11-12 15:32 資料齊全 |
| 資料完整就好了。 |
| 好東西,看看是不是完整的資料!!!!!!!!!!!! |
Powered by 單片機(jī)教程網(wǎng)