⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于AT89C2051的SHT11温湿度传感器嵌入式程序KEIL环境
💻 C
字号:
#include "reg52.h"   //晶振可以用11.0592MHZ,如果用串口的话
                     //提示:在调试程序的时候晶振用12MHZ
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "intrins.h"
//#include "bcd.h"
//#include "SHTXX_iic.c"
/**********************************************************************************/
#define uchar unsigned char 
#define BIT7  0X80	                 
#define BIT6  0X40	                 
#define BIT5  0X20	                 
#define BIT4  0X10	                 
#define BIT3  0X08	                 
#define BIT2  0X04	                 
#define BIT1  0X02	                 
#define BIT0  0X01	                 
sbit SDA=P1^6;                          // 将p1.6口模拟数据口
bdata uchar canmea;
float hum,tem;float ftem;
uchar aaa,dhum[4],dtem[4];
int  count,second;
uchar MeasureMode;
uchar rnum,tnum,tlen;uchar uartflasR,uartflasT;

#define  NUM  20 	                    //	接收和发送缓存区的深度
#define  NUM1  7 	                    //	接收和发送缓存区的深度
unsigned char idata sendbuf[NUM];       // 数据发送缓冲区
unsigned char idata receivebuf[NUM1];    // 数据接收缓冲区

void	TxData ();
void 	Inituart();
void 	InitSHTXX();
void 	Inittimer0();
float 	CalculateHum();
float 	CalculateTem();
void 	MeasureTem();
void 	MeasureHum();
void 	measure();

/*****************************************MAIN  START ******************************/
void main(void)
{	
	uchar okqi;
	int dat;//int i;
	uchar okmea;
//	uchar aaa;
	Inittimer0();
	second=1;
	while(second){}//上电延时
	Inituart();
	InitSHTXX();
	if (F0==1)
		okqi=0;//无传感器标志
	else
		okqi=1;//有传感器标志

	sendbuf[0]=0X80;//起始符
//	sendbuf[1]=0X01;//本机地址
	sendbuf[1]=P1&0X0F;//本机地址

	//receivebuf[3]=0x00;uartflasT=1;//上电发送测试数据
	okmea=1;//测量
	MeasureMode=1;

while (1)
	{
	if(uartflasR==1)//接收命令处理
	{
		if(rnum>3) //接收数据应大于4字节,否则帔格式不对
		if(receivebuf[0]==sendbuf[1]) //本机地址才处理
		switch(receivebuf[3]) //命令处理
		{
		case 0x12:
		case 0x13:
		case 0x11:{okmea=1;/*P0=~P0;*/}break;//测量湿度和温度命令
		case 0x00:{uartflasT=1;}break;//检测命令
		default:;
		}
		uartflasR=0;
	}
	if(uartflasT==1)//发送命令处理
	{
	//sendbuf[0]=0X80;//起始符
	//sendbuf[1]=0X01;//本机地址
	switch(receivebuf[3])//命令处理
		{
		case 0x11:{//测量湿度和温度命令
					sendbuf[2]=0;//字节数1
					sendbuf[3]=11;//字节数2
					sendbuf[4]=0x11;//命令码

					sendbuf[5]=0x12;//湿度数据
					sendbuf[6]=dhum[0];
					sendbuf[7]=dhum[1];
					sendbuf[8]=dhum[2];
					sendbuf[9]=dhum[3];

					sendbuf[10]=0x13;//温度数据
					sendbuf[11]=dtem[0];
					sendbuf[12]=dtem[1];
					sendbuf[13]=dtem[2];
					sendbuf[14]=dtem[3];

					/*sendbuf[6]=0x07;
					sendbuf[7]=0x06;
					sendbuf[8]=0x05;
					sendbuf[9]=0x04;

					sendbuf[11]=0x00;
					sendbuf[12]=0x02;
					sendbuf[13]=0x09;
					sendbuf[14]=0x08;*/

					sendbuf[15]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9]
								^sendbuf[10]^sendbuf[11]^sendbuf[12]^sendbuf[13]^sendbuf[14];

					sendbuf[16]=0x7F;//停止符
					tlen=17;
				  }break;
		case 0x12:{//测量湿度命令
					sendbuf[2]=0;//字节数1
					sendbuf[3]=6;//字节数2
					sendbuf[4]=0x11;//命令码

					sendbuf[5]=0x12;//湿度数据
					sendbuf[6]=dhum[0];
					sendbuf[7]=dhum[1];
					sendbuf[8]=dhum[2];
					sendbuf[9]=dhum[3];

					sendbuf[10]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9];

					sendbuf[11]=0x7F;//停止符
					tlen=12;
				  }break;
		case 0x13:{//测量温度命令
					sendbuf[2]=0;//字节数1
					sendbuf[3]=6;//字节数2
					sendbuf[4]=0x11;//命令码

					sendbuf[5]=0x13;//温度数据
					sendbuf[6]=dtem[0];
					sendbuf[7]=dtem[1];
					sendbuf[8]=dtem[2];
					sendbuf[9]=dtem[3];

					sendbuf[10]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9];

					sendbuf[11]=0x7F;//停止符
					tlen=12;
				  }break;
		case 0x00:{//检测命令
					sendbuf[2]=0;//字节数1
					sendbuf[3]=1;//字节数2
					sendbuf[4]=0x00;//命令码

					sendbuf[5]=okqi;//传感器标志

					sendbuf[6]=0x7F;//停止符
					tlen=7;
				  }break;
		default:;
		}
	uartflasT=0;
	tnum=0;
	SBUF=sendbuf[tnum];tnum++;
	}


if(okmea==1)
if(okqi==0)
{
	receivebuf[3]=0x00;uartflasT=1;okmea=0;
}
else
		switch(MeasureMode)
		{
		case 1:{//启动测量湿度
			MeasureHum();
/*	aaa=0x12;
	TxData();
	if(F0==1)
	aaa=0xaa;//无器件
	else
	aaa=0x55;//有器件
	TxData();
*/			/*TH0=0Xca;
			TL0=0X00;//11.0592MHz 15mS
			TR0=1;*/
			count=0;
			MeasureMode++;}break;
		case 2:if(count==2)
				{MeasureMode++;count=0;}break;//等待延时
		case 3:{//读湿度数据
				if(SDA==0) //等待测量完毕
				{
				canmea=0;
			 	hum=CalculateHum();
				dat=floor(hum*100);
				dhum[0]=floor(hum/10);//十位
				ftem=1000;ftem=fmod(dat,ftem);
				dhum[1]=floor(ftem/100);//个位
				dat=ftem;ftem=100;ftem=fmod(dat,ftem);
				dhum[2]=floor(ftem/10);//十分一位
				dat=ftem;ftem=10;ftem=fmod(dat,ftem);
				dhum[3]=floor(ftem);//百分一位
/*				for(p=dhum,i=0;i<4;i++,p++)
				{aaa=*p;TxData();}
*/				MeasureMode++;
				}
			}break;
		case 4:if(count==2)
				{MeasureMode++;count=0;}break;//等待延时
		case 5:{//启动测量温度
			MeasureTem();
/*	aaa=0x13;
	TxData();
	if(F0==1)
	aaa=0xaa;//无器件
	else
	aaa=0x55;//有器件
	TxData();
*/			/*TH0=0X28;
			TL0=0X00;//11.0592MHz 60mS
			TR0=1;*/
			count=0;
			MeasureMode++;}break;
		case 6:if(count==4)
				{MeasureMode++;count=0;}break;//等待延时
		case 7:{//读温度数据
				if(SDA==0)//等待测量完毕
				{
				canmea=0;
			 	tem=CalculateTem();
			//	dat=fsign(tem/100);
			//	p=&tem;aaa=*p;
				if (tem<0)
				{dtem[0]=0x0f;//符号位
				tem=fabs(tem);
				}
				else
				{tem=fabs(tem);
				ftem=100;
				ftem=fmod(tem,ftem);
				dtem[0]=floor(ftem);//百位
				}
				dtem[1]=floor(tem/10);//十位
				ftem=10;
				ftem=fmod(tem,ftem);
				dtem[2]=floor(ftem);//个位
				ftem=fmod(ftem*10,10);
				dtem[3]=floor(ftem);//十分一位
/*				for(p=dtem,i=0;i<4;i++,p++)
				{aaa=*p;TxData();}
*/				MeasureMode=1;uartflasT=1;okmea=0;/*P0=~P0;*/
				}
			}break;
		default:;
		}
	}
}
/*************************************Rmain      END *******************************/
/**************************************Measure  START ******************************/
/*void measure(void)
{	
}
/**************************************Measure  END   ******************************/
/*void TxData (void)
{
	SBUF=aaa;	
	while(TI==0);
		TI=0;

}*/
void Inituart(void)
{
	TMOD = 0x21;				//timer1 working mode 1
	TL1 = 0xfd;					//fb=9600 for 18.432mhz Fosc,and ... 
	TH1 = 0xfd;					//fd=9600 for 11.0592mhz Fosc
	SCON = 0x50;				//uart mode 3,ren==1
	//PCON = 0x80;				//smod=0
	TR1 = 1;					//start timer1
	ES=1;
}
void Inittimer0(void)
{
	TMOD = 0x21;				//timer0 working mode 1
	TL0 = 0x00;					//
	TH0 = 0xb8;					//20ms for 11.0592mhz Fosc
	TR0 = 1;					//start timer1
	ET0=1;EA=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: timer0
// 定时器0中断函数
// 函数功能: 计时
//--------------------------------------------------------------------------------------------------
void timer0 (void) interrupt 1 using 2
{
	TH0=0Xb8;
	TL0=0X00;//11.0592MHz 20mS
	if (MeasureMode==2)count++;
	if (MeasureMode==4)count++;
	if (MeasureMode==6)count++;
	second++;
	if (second==100)
	{
		second=0;
/*		switch(MeasureMode)
		{
		case 4:{MeasureMode++;}break;
		case 0:{MeasureMode++;}break;
		default:;
		}*/
	}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: uart
// 定时器0中断函数
// 函数功能: 计时
//--------------------------------------------------------------------------------------------------
void uart (void) interrupt 4 using 0
{
uchar dsbuf;
	if(RI==1)
	{
		RI=0;dsbuf=SBUF;
		switch(dsbuf)
		{
		case 0X80:{rnum=0;}break;
		case 0X7F:{uartflasR=1;}break;
	//	case 0Xaa:{SBUF=0x55;tlen=0;}break;
		default:{receivebuf[rnum]=dsbuf;
		rnum++;}
		}
	}
	if(TI==1)
	{
		TI=0;
		if (tnum<tlen)
		{SBUF=sendbuf[tnum];tnum++;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -