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

📄 wsd1.c

📁 湿度采集模块
💻 C
字号:
/*-----------------------------------------
编者:吴威  04.09.16
-----------------------------------------*/
#include <REGX52.H>
#define  uchar unsigned char
#define  fchar signed char
#define  uint  unsigned int
#define dat    30
#define dat1   60
#define dat2   30
/*--------------------------------*/
sbit K1=P0^5;               
sbit K2=P0^6;               
sbit K3=P0^7;               
sbit K4=P0^4;     

sbit WOUTH=P0^0;               
sbit WOUTL=P0^1;               
sbit SOUTH=P0^2;               
sbit SOUTL=P0^3;     

sbit SER=P1^4;           //14,8位串行输入
sbit SRCLK=P1^6;           //12琐存
sbit CLK=P1^5;           //11时钟   

sbit ds1820=P3^4;
sbit beep=P2^1;
//-----------------------------
uchar bdata x;
sbit x0     =x^7;
sbit db     =x^6;      //小数点控制位
sbit db1    =x^5;
sbit x3     =x^4;
//-----------------------------
uchar data TAB[18],xs1[8],msn=50;
uint SOUT,plz,wdz;
//-----------------------------
extern  void d25045(uchar x);
/*-----------------------------------*/
uchar code DAT[11]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //位驱动数组

uchar code DAT1[18]={0xeb,0x0a,0x79,0x5b,0x9a,
                     0xd3,0xf3,0x4a,0xfb,0xdb,
					 0x40,0x10,0x01,0x3b,0x00,
					 0xf0,0xba,0x00};
uint code SDTAB[101]=
/*
       {
    	 7285,7276,7264,7252,7240,7228,7216,7204,7192,7180,
		 7168,7156,7144,7132,7120,7108,7096,7084,7072,7060,
		 7048,7036,7024,7012,7000,6988,6976,6964,6952,6940,
		 6928,6916,6904,6892,6880,6868,6856,6844,6832,6820,
		 6808,6796,6784,6772,6760,6748,6736,6724,6712,6700,
		 6688,6675,6664,6652,6640,6628,6616,6604,6592,6580,
		 6568,6556,6544,6532,6520,6508,6496,6484,6472,6460,
		 6448,6436,6424,6412,6400,6388,6376,6364,6352,6340,
		 6328,6316,6304,6292,6280,6268,6256,6244,6232,6220,
		 6088,6076,6064,6052,6040,6028,6016,6004,5992,5980,
		};
		*/
		{
          7285,7245,7233,7221,7219,7207,7195,7183,7171,7159,
          7153,7141,7129,7117,7095,7083,7071,7059,7047,7035,
          7021,7009,6997,6985,6973,6961,6949,6937,6925,6913,
          6899,6887,6875,6863,6851,6839,6827,6815,6803,6791,
          6775,6763,6751,6739,6727,6715,6703,6691,6679,6667,
          6648,6636,6624,6612,6600,6588,6576,6564,6552,6540,
          6507,6495,6483,6471,6469,6447,6435,6423,6411,6409,
		  6381,6369,6357,6345,6333,6321,6309,6297,6285,6273,
          6238,6226,6214,6202,6190,6178,6166,6154,6142,6130,
          6068,6056,6044,6032,6020,6018,6006,5994,5982,5970,
		  };
		  /*
		{
    	 5970,5982,5994,6006,6018,6020,6032,6044,6056,6068,
		 6130,6142,6154,6166,6178,6190,6202,6214,6226,6238,
		 6273,6285,6297,6309,6321,6333,6345,6357,6369,6381,
		 6409,6411,6423,6435,6447,6469,6471,6483,6495,6507,
		 6540,6552,6564,6576,6588,6600,6612,6624,6636,6648,
		 6667,6679,6691,6703,6715,6727,6739,6751,6763,6775,
		 6791,6803,6815,6827,6839,6851,6863,6875,6887,6899,
		 6913,6925,6937,6949,6961,6973,6985,6997,7009,7021,
		 7035,7047,7059,7071,7083,7095,7117,7129,7141,7153,
		 7159,7171,7183,7195,7207,7219,7221,7233,7245,7285,
		};
		*/
//-----------------------------
void delay1(uint ms)
{
uint i;
for(i=0;i<ms;i++);            //Feed the dog
}
//*******************************************
void d595(uchar x)
{
uchar temp,j;
     temp=x; 
	 if(db==1)
	 {
	 if(db1==1){temp=temp|4;}
	 }
for (j=0;j<8;j++){
     temp=temp>>1; SER=CY; CLK=1; CLK=0;
      }
}
/*-------------------------------*/
uint cjtemp(void)
{uint z; 

#pragma asm
GET_TEMP:
        //CLR EA                ;使用ds1820一定要禁止任何中断产生
        ACALL INT            ;调用初使化子程序
        MOV A,#0CCH
        ACALL WRITE     ;送入跳过ROM命令
        MOV A, #44H
        ACALL WRITE     ;送入温度转换命令
        ACALL INT           ;温度转换完全,再次初使化ds1820
        MOV A,#0CCH
        ACALL WRITE     ;送入跳过ROM命令
        MOV A,#0BEH
        ACALL WRITE     ;送入读温度暂存器命令
        ACALL READ
        mov r7,a             ;读出温度值低字节存入R7
        ACALL READ
        ;lr ACC.7
        mov r6,a             ;读出谩度值高字节存入R6
        SETB EA
     RET
  INT:   
        CLR EA                  ;初始化ds1820子程序
     L0:CLR ds1820           ;ds1820总线为低复位电平87460452
        MOV R2,#200
     L1:CLR ds1820
        DJNZ R2,L1           ;总线复位电平保持400us
        SETB ds1820             ;释放ds1820总线
        MOV R2,#30
     L4:DJNZ R2,L4         ;释放ds1820总线保持60us
        CLR C                    ;清存在信号(存在C=0,不存在C=1)
        ORL C,ds1820
        ;JC L0
        MOV R6,#80
     L5:ORL C,ds1820
        JC L3
        DJNZ R6,L5
        ;AJMP L0
     L3:MOV R2,#240
     L2:DJNZ R2,L2    
        SETB EA
     RET
WRITE:                         ;向ds1820写操作命令子程序
        CLR EA
        MOV R3,#8           ;写入ds1820的bit数,一个字节8个bit
    WR1:SETB ds1820
        MOV R4,#8
        RRC A                     ;把一个字节data(A)分成8个bit环移给 C
        CLR ds1820                 ;开始写入ds1820总线要处于复位(低)状态
    WR2:DJNZ R4,WR2     ;ds1820总线复位保持16us
        MOV ds1820,C               ;写入一个bit
        MOV R4,#20
    WR3:DJNZ R4,WR3     ;等待40us
        DJNZ R3,WR1          ;写入下一个bit 
        SETB ds1820                ;重新释放ds1820总线
		SETB EA
     RET
READ:
        CLR EA
        MOV R6,#8            ;连续读8个bit
    RE1:CLR ds1820           ;读前总线保持为低
        MOV R4,#4
        NOP
        SETB ds1820             ;开始读,总线释放
    RE2:DJNZ R4,RE2     ;持续8us
        MOV C,ds1820           ;从ds1820总线读得一个bit
        RRC A                    ;把读得的位值环移给 A
        MOV R5,#30
    RE3:DJNZ R5,RE3     ;持续60us
        DJNZ R6,RE1         ;读下一个bit
        SETB ds1820              ;重新释放ds1820总线
		SETB EA
     RET          
#pragma endasm

return z;
}
//--------------------------------
uint wdcl(void)
{ 
wdz=cjtemp();
if((wdz>>15)==1)
  {wdz=~wdz;}
  wdz=((0x0ff0&wdz)>>4)*10+((0x0f&wdz)*6/10);
  if(wdz>1260){wdz=0;}
return wdz;
}
/*-------------------------------*/
uchar RDSDZ(void)
{uchar i=0,z=0;
static uchar a,S1,S2,S3;
while(z<100)
 {
 if(plz<SDTAB[i]){i++;}
 else{z=101;}
 }
/*
if(msn==50)
{
a++;
if(a>4){a=1;}
switch(a)
     {
      case 1: S1=i;     break;  // 
      case 2: S2=i;     break;  // 
  	  case 3: S3=i;     break;  // 
	  default: 
      SOUT=((S1+S2+S3)/3);     
	  break;  // 
     }
*/
return i;
}
//-----------------------------
void AJ(void)
{uchar a,b,c;
 uint Collect;
 if(K1=1,K1==0)
   {
  db1=0;         //关闭小数点
  while(~K1)
  {
   if(K4=1,K4==0){db1=1;d25045(2);x0=0;}
   else x0=1;
   }
	b++;
	if(b>6){b=1;}
	switch(b)
       {
          case 1:  a=xs1[0];               break;
          case 2:  a=xs1[1];               break;
  	      case 3:  a=xs1[2];               break;
		  case 4:  a=xs1[3];c=xs1[6];      break;
          case 5:  a=xs1[4];c=xs1[7];      break;
		  case 6:  a=xs1[5];               break;
       }
	delay1(300);
   }
 if(x0==1)
  {
  if(K2=1,K2==0)
   {
   a++;
   x0=1;
   delay1(80);
   }
  if(K3=1,K3==0)
   {
   a--;
   x0=1;
   delay1(80);
   }
  if(K4=1,K4==0)
   {
   c=~c;
   delay1(80);
   }
   if(b==1)
   {
    if(a>100){a=0;}
    TAB[0]=10;
    TAB[1]=a/100;
    TAB[2]=a%100/10;
    TAB[3]=a%100%10;
	xs1[0]=a;    //湿度上线
   }
   if(b==2) 
    {
	if(a>100){a=0;}
	TAB[0]=12;
	TAB[1]=a/100;
    TAB[2]=a%100/10;
    TAB[3]=a%100%10;
	xs1[1]=a;   //湿度下线
	}
   if(b==3) 
    {
	if(a>20){a=0;}
	TAB[0]=13;
	TAB[1]=14;
    TAB[2]=a%100/10;
    TAB[3]=a%100%10;
	xs1[2]=a;
	}
	if(b==4) 
    {
	if(a>125){a=0;}
	TAB[4]=10;
	if(c==0){TAB[5]=11;if(a>55){a=0;}}
	else TAB[5]=a/100;
    TAB[6]=a%100/10;
    TAB[7]=a%100%10;
	xs1[3]=a;      //温度上线
    xs1[6]=c;
	}
	if(b==5) 
    {
	if(a>125){a=0;}
	TAB[4]=12;
	if(c==0){TAB[5]=11;if(a>55){a=0;}}
	else TAB[5]=a/100;
    TAB[6]=a%100/10;
    TAB[7]=a%100%10;
	xs1[4]=a;     //温度下线
	xs1[7]=c;
	}
    if(b==6) 
    {
	if(a>20){a=0;}
	TAB[4]=13;
    TAB[5]=14;
    TAB[6]=a%100/10;
    TAB[7]=a%100%10;
	xs1[5]=a;
	}
  }
  else {
       Collect=RDSDZ();
	   if(Collect<999){TAB[0]=14;}
       else TAB[0]=Collect/1000;
	   if(Collect<99){TAB[1]=14;}
	   else TAB[1]=Collect%1000/100;
	   if(Collect<9){TAB[2]=14;}
	   else TAB[2]=Collect%1000%100/10;
	   TAB[3]=Collect%1000%100%10;

	   db1=1;
       Collect=wdcl();
	   if(Collect<999){TAB[4]=14;}
       else TAB[4]=Collect/1000;
	   if(Collect<99){TAB[5]=14;}
	   else TAB[5]=Collect%1000/100;
	   if(Collect<9){TAB[6]=14;}
	   else TAB[6]=Collect%1000%100/10;
	   TAB[7]=Collect%1000%100%10;
	   }
}
//-----------------------------
void Show0(void)
{
  d595(DAT[7]);
  d595(DAT1[TAB[3]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[6]);
  d595(DAT1[TAB[2]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[5]);
  d595(DAT1[TAB[1]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[4]);
  d595(DAT1[TAB[0]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);
}
//-------------------------------
void Show1(void)
{  
  d595(DAT[0]);
  d595(DAT1[TAB[4]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[1]);
  d595(DAT1[TAB[5]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[2]);
  db=1;       //开启小数点
  d595(DAT1[TAB[6]]);
  db=0;       //关闭小数点
  SRCLK=0; SRCLK=1;
  delay1(dat);

  d595(DAT[3]);
  d595(DAT1[TAB[7]]);
  SRCLK=0; SRCLK=1;
  delay1(dat);
}
/*-------------------------------*/
void kzbj(void)
{
if(SOUT>xs1[0])
  {
  // delay(xs1[2]);
   WOUTH=0;WOUTL=1;
  }    //湿度上线
else if(SOUT<xs1[1])
  {
  //delay(xs1[2]);
  WOUTL=0;WOUTH=1;
  }    //湿度下线
else {
      WOUTH=1;WOUTL=1;
	 }
if(wdz>(xs1[3]*10))
  {
  //delay(xs1[5]);
  SOUTH=0;SOUTL=1;
  }     //温度上线
else if(wdz<(xs1[4]*10))
  {
  //delay(xs1[5]);
  SOUTL=0;SOUTH=1;
  }     //温度下线
else {
      SOUTH=1;SOUTL=1;
	 }
}
/*-------------------------------*/
void time0_int(void)interrupt 1 //using 0
{uchar i=0,z=0;uint pplz;
//static uchar a,S1,S2,S3;
TR0=TR1=0;
TH0=0Xdc;TL0=0X00;
  msn--;
  if(msn==0)
  {
  msn=46;
  plz=(TH1*256+TL1)*2;
  TH1=TL1=0;
}
TR0=TR1=1;
}
/*-------------------------------*/
void time1_int(void)interrupt 3 //using 0
{

}
/*-------------------------------*/
void time2_int(void)interrupt 5 //using 1
{ 
TR2=0;
  Show1();
  Show0();
 RCAP2H=0xff;
 RCAP2L=0xc0;
TR2=1;
TF2=0;
}
/*------------温度数据发送到上位机函数-----------
void Send_out(void)
{
uchar code tab1[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/*
  do{
     while(!RI);
     RI=0;
    }while((SBUF^0x38)!=0);

	 SBUF=tab1[TAB[4]];  
     while(!TI);
     TI=0;
	 SBUF=tab1[TAB[5]];  
     while(!TI);
     TI=0;
	 SBUF=tab1[TAB[6]];  
     while(!TI);
     TI=0;
     SBUF=tab1[TAB[7]];  
     while(!TI);
     TI=0;
}
//-----------------------------*/
void main(void)
{ 
  beep=1;
  SP=0x5f;
  //d25045(1);
  //d25045(3);
/*
  SCON=0x50;
  TMOD=0x20;
  TH1=TL1=0Xfd;         //11。0592    56000
  PCON=0x80;
  TR1=1;
*/
  TMOD=0x59;
  SCON=0x50;
  TH1=TL1=0;
  TH0=0xdc;TL0=0x00;
  TR0=TR1=1;

  RCAP2H=0xff;
  RCAP2L=0xc0;
  ET2=TR2=1;
  IP=0x02;
  IE=0xba;
while(1)
  {
  AJ();
  //d25045(4);
  kzbj();
  //Send_out();
  //wdz=cjtemp();
  }
}

⌨️ 快捷键说明

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