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

📄 system.c

📁 单片机的温湿度测量系统
💻 C
字号:
	//--------------------------------
	//-----湿度读取子程序 ------------
	//--------------------------------
	//----以下变量均为全局变量--------
	//----温度高8位== U8T_data_H------
	//----温度低8位== U8T_data_L------
	//----湿度高8位== U8RH_data_H-----
	//----湿度低8位== U8RH_data_L-----
	//----校验 8位 == U8checkdata-----
	//----调用相关子程序如下----------
	//---- Delay();, Delay_10us();,COM(); 
	//--------------------------------

#include <reg51.h>
#include <intrins.h> 
#include <stdio.h>

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable 	  无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable		  有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable 	  无符号16位整型变量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable 	  有符号16位整型变量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable 	  无符号32位整型变量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable 	  有符号32位整型变量 */
typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
#define   Data_0_time    4

sbit DIN=P2^0;
sbit LOAD=P2^1;
sbit CLK=P2^2;
sbit dout=P2^5;
sbit nullio=P2^3;
sbit sound =P3^2;
sbit mode=P1^2;
sbit set=	P1^3;

uchar mode_flag;
uchar  set_flag; 


U8  U8FLAG,k;
U8  U8count,U8temp;
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;
U8  outdata[5];  //定义发送的字节数	   
U8  indata[5];
U8  count, count_r=0;
U16 U16temp1,U16temp2;
unsigned char th,tl,hh,hl;
unsigned char th0,tl0,hh0,hl0;
bit time_flag;
uchar criterion_hum;
uchar criterion_temp;

void RH(void);
void s_seg(uchar ,uchar ,uchar, uchar );
void send(uchar ,uchar);
void  COM(void);
void  process(void);
void Delay(U16 );
void  Delay_10us(void);
void key_scan(void);
void winkling(void);
void delayMs(unsigned int i);
void special(unsigned char i);
void init(void);
void main(void)
{
  init();
 	while(1)
	{
	RH();//读取数据
	process(); //数据处理

  s_seg(th,tl,hh,hl);	//显示温湿度

  key_scan();//按键扫描
  winkling();
	criterion_temp=th0*10+tl0;
	criterion_hum=hh0*10+hl0;
	if ((U8T_data_H>criterion_temp)||(U8RH_data_H>criterion_hum)) sound=0;

	else sound =1;
//	delayMs(150);
  special(180);//延时

  }

	
}

void init(void)
{
// s_seg(0x81,0x82,0x83,4,5,6,7,8);
	 criterion_temp=19;
	 criterion_hum=50;
	 th0=criterion_temp/10;
	 tl0=criterion_temp%10;
	 hh0=criterion_hum/10;
	 hl0=criterion_hum%10;
}

void special(unsigned char i)
{
  unsigned int j;
     while(i--)
      {
         for(j = 0; j < 125; j++);
				 key_scan();
       }
}

void delayMs(unsigned int i)
  {
     unsigned int j;
     while(i--)
      {
         for(j = 0; j < 125; j++);
     }
 }


void key_scan(void)
{
	
		if(!set) 
		{
			delayMs(10);//延时10ms
				if(!set) {	set_flag ++ ;while(!set);}
				
 		 }
		if(!mode)
			{
			delayMs(10);//延时10ms
       if(!mode){			 mode_flag ++ ;	while(!mode) ;}
}			 }

     void  COM(void)
      {
     
	        U8 i;
       for(i=0;i<8;i++)	   
	    {
		
	   	    U8FLAG=2;
	   	//----------------------
	        // P2_1=0 ;  //T
	        // P2_1=1 ;  //T
	    //---------------------- 
	
	   	while((!dout)&&U8FLAG++);
			Delay_10us();
			Delay_10us();
		//	Delay_10us();
	  		U8temp=0;
	     if(dout)U8temp=1;
		    U8FLAG=2;
		 while((dout)&&U8FLAG++);
		 	
	    //----------------------
	        //  P2_1=0 ;  //T
	       //   P2_1=1 ;  //T
	   //----------------------
	   	//超时则跳出for循环		  
	   	 if(U8FLAG==1)break;
	   	//判断数据位是0还是1	 
	   	   
		// 如果高电平高过预定0高电平值则数据位为 1 
	   	 
		   U8comdata<<=1;
	   	   U8comdata|=U8temp;        //0
	     }//rof
	   
	}


void send(uchar add,uchar dat)
{
   	uchar ADS,i,j;
   	CLK=0;
	LOAD=0;
	DIN=0;
   	i=4;
   	while(i<16)
   	{
     	 if(i<8)
	  	{
	  		ADS=add;
		}
	  else
	  	{
			ADS=dat;
		}
	  for(j=8;j>=1;j--)
	  	{

			if((ADS&0x80)==0)
			{	DIN=0 ;}
			else 
			{	DIN=1;}
	  	  	ADS=ADS<<1;
		
		CLK=1;
		CLK=0;	
	 	 }
	  i=i+8;
   }
   LOAD=1;
}

//void s_seg(uchar X1,uchar X2,uchar X3,uchar X4,uchar X5,uchar X6,uchar X7, uchar X8)
void s_seg(uchar X5,uchar X6,uchar X7, uchar X8)
{
	 send(0x0c,0x01);//正常状态
   send(0x0b,0x07);//设置扫描范围DIG0-7
	 send(0x0a,0x05);//设置亮度11/32
   send(0x09,0xff);//采用译码方式

  // send(0x01,X1);
  // send(0x02,X2);
  // send(0x03,X3);
  // send(0x04,X4);
   send(0x05,X5);
   send(0x06,X6);
   send(0x07,X7);
   send(0x08,X8);	
}





void RH(void)
	{
	  //主机拉低18ms 
     dout=0;
	   Delay(180);
	   dout=1;
	 //总线由上拉电阻拉高 主机延时20us
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	 //主机设为输入 判断从机响应信号 
	   dout=1;
	 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
	   if(!dout)		 //T !	  
	   {
	   U8FLAG=2;
	 //判断从机是否发出 80us 的低电平响应信号是否结束	 
	   while((!dout)&&U8FLAG++);
	   U8FLAG=2;
	 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
	   while((dout)&&U8FLAG++);
	 //数据接收状态		 
	   COM();
	   U8RH_data_H_temp=U8comdata;
	   COM();
	   U8RH_data_L_temp=U8comdata;
	   COM();
	   U8T_data_H_temp=U8comdata;
	   COM();
	   U8T_data_L_temp=U8comdata;
	   COM();
	   U8checkdata_temp=U8comdata;
	   dout=1;
	 //数据校验 
	 
	   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
	   if(U8temp==U8checkdata_temp)
	   {
	   	  U8RH_data_H=U8RH_data_H_temp;
	   	  U8RH_data_L=U8RH_data_L_temp;
		  U8T_data_H=U8T_data_H_temp;
	   	  U8T_data_L=U8T_data_L_temp;
	   	  U8checkdata=U8checkdata_temp;
	   }//fi
	   }//fi

	}
	

void  process(void)
{
		if(U8RH_data_H==0)
	{	hh=0;
	  hl=0;
	}
	else 
	{
		hh=U8RH_data_H/10;
		hl=U8RH_data_H%10;
	}

		if(U8T_data_H==0)
	{	th=0;
	  tl=0;
	}
	else 
	{
		th=U8T_data_H/10;
		tl=U8T_data_H%10;
	}	
}

     void Delay(U16 j)
    {      U8 i;
	    for(;j>0;j--)
	  { 	
		for(i=0;i<27;i++);

	  }
    }

 void  Delay_10us(void)
      {
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
       }
void winkling(void)
{
switch(mode_flag)
{
	 case 0:break;
	       
	 case  1:
	{ 
		while(mode_flag==1)
				{
					
						   send(0x05,0xf);
							  special(100);

								if(mode_flag!=1) 			{	  send(0x05,th0); 	goto XX2;			}


								 if(set_flag==1)
							 {
							 		set_flag=0;
									th0++;
									if(th0>9)	th0=0; 				
			 	
								}
																	
               send(0x05,th0);
							  special(100);
							  if(set_flag==1)
							 {
							 		set_flag=0;
									th0++;
									if(th0>9)	th0=0; 				
			 	
								} 
												 
					}
				}

		case  2:
	{ 
XX2:		while(mode_flag==2)
				{
					
               send(0x06,0xf);
							  special(100);
								if(mode_flag!=2){    send(0x06,tl0);  goto XX3;}
								 if(set_flag==1)
							 {
							 		set_flag=0;
									tl0++;
									if(tl0>9)tl0=0;						
							
			 					} 
               send(0x06,tl0);
							  special(100);
							  if(set_flag==1)
							 {
							 		set_flag=0;
									tl0++;
									if(tl0>9)tl0=0;						
							
			 					} 
					 
					}
				}
											  
		case 3:

XX3:	       { while(mode_flag==3)
					{
					
						   send(0x07,0xf);
							  special(100);
								if(mode_flag!=3) 						  { send(0x07,hh0); goto XX4;}

								 if(set_flag==1)
							 {
							 		set_flag=0;
									hh0++;
									if(hh0>9)hh0=0;						
							
			 					} 
						   send(0x07,hh0);
							  special(100);
							  if(set_flag==1)
							 {
							 		set_flag=0;
									hh0++;
										if(hh0>9) hh0=0;
								} 
					}
					}
					
					case 4:

XX4:	 { while(mode_flag==4)
					{
					
               send(0x08,0xf);
							  special(100);
								if(mode_flag!=4) {               send(0x08,hl0); goto XX5;	}
							  if(set_flag==1)
							 {
							 		set_flag=0;
									hl0++;
									if(hl0>9)  hl0=0;
								}
			 	
								 
               send(0x08,hl0);
							  special(100);
							  if(set_flag==1)
							 {
							 		set_flag=0;
									hl0++;
									if(hl0>9)  hl0=0;
							}
			 	
				}
				} 
					
	case  5:
	{ 
XX5:		while(mode_flag==5)
		{
					
  s_seg(th0,tl0,hh0,hl0);
						 
							 
							  special(100);
								if (mode_flag!=5)  { s_seg(th0,tl0,hh0,hl0); goto XX6;}
  s_seg(0xf,0xf,0xf,0xf);
							  special(100);

					 
		}
	}			
 }			
XX6:					mode_flag=0;
					s_seg(th,tl,hh,hl);


 }

⌨️ 快捷键说明

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