温湿度检测无线模块

我自己设计、制作、编程开发的温湿度无线模块正式调试完成了。

整个模块由STC89C52RC单片机+DS18B20温度传感器+DHT11湿度传感器+24L01P无线模块组成。

其功能可以将温湿度采样后通过2.4G无线信号传送到主机上。

另外,这个模块也在92频道上监听来自主机的命令:

命令 80:查询命令。一旦接收到这个命令,模块马上进行一次温湿度采样,并将结果立即返回主机;

命令 90:设置模块工作模式命令。模块一共有28个工作模式,设置不同的采样间隔时间,最小5秒,最大18个小时。0模式设置模块不自主发送温湿度给主机,仅在主机发送查询命令时返回温湿度值。主机对模块的设置将被存入STC的片内EEPROM中。这样,下次开机时,模块就自动按照上次的设置开始工作了。

目前的问题是定时有误差。我还没有找到原因,我是用定时器0做的定时,应该很准的,但实际却有误差。下面是定时、中断相关的代码,如果您看出为何会出现误差,请回复这个帖子告诉我您的想法,谢谢先。

首先是定义了2个全局变量:

//中断计数器,每50ms加一
byte timerMSCounter = 0;

//中断计数器,每1秒加一
uint timerSecCounter = 0;

然后是对Timer0的初始化:

void initTimer0(void)
{
	TMOD &= 0xf0; //清除定时器0模式位
	TMOD |= 0x01; //设定定时器0为方式1:16位计数器

	TH0=0x4c; //给定时器赋初值,定时时间50ms,11.0592MHz晶振
	TL0=0x00; 
	ET0=1; //允许定时 0 中断 
	EA=1; //允许总中断 
	TR0=1; //启动定时器 0 
	
	//清计数器
	timerMSCounter = 0;
	timerSecCounter = 0;
}

接下来是中断0的处理程序:

//定时器0中断处理程序
void interruptTimer0(void) interrupt 1
{
	TH0=0x4c; //给定时器0重赋初值,定时时间50ms,11.0592MHz晶振
	//TL0=0x00; //低位本来就是从0开始,故这里就不再重装初值了


	if( ++timerMSCounter==20 ) //每20次中断是1秒,即,50ms*20=1000ms
	{
		timerMSCounter=0;
		if( ++timerSecCounter == sendDataInterval )
		{
			timerSecCounter = 0;
			sendDataFlag = 1;
		}
	}
}

main函数里面一直循环,直到时间到了sendDataInterval,中断0程序将上面的sendDataFlag置1时,发送数据给主机。

误差我没有精确测量。我将节点设置为5分钟发送一次数据时,每5分钟就有将近1秒的误差(不到1秒)。


下面上两张模块的照片,电路图等我学会了Protel再画给大家。如果有需要的,可以回帖,我可以抽时间手绘一份,如果没人要我就不用费这个时间了。




下面这张特写一下NRF24L01+无线模块,很好用。唯一遗憾的是2.4G的信号(0dB发送)在室内隔了2个房间的距离后,数据收发就有了严重的丢包现象。



模块发送回来的数据,由主机接收后通过串口送到上位机(PC)。上位机软件目前还没有写,只是做了一个简单的界面,供调试下位机和节点用,下面是这个程序的截屏:



通过这个,我们看到目前我家的湿度是51%,温度在25.7度附近。是不是有点意思?






你可能感兴趣的:(代码片段)