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

📄 wsd.c

📁 湿度采集模块
💻 C
字号:
/*-----------------------------------------
编者:吴威  04.09.16
实验板程序
-----------------------------------------*/
#include <REGX52.H>
#define  uchar unsigned char
#define  fchar signed char
#define  uint  unsigned int
/*--------------------------------*/
sbit K1=P1^0;               
sbit K2=P1^1;               
sbit K3=P1^2;               
sbit K4=P1^3;     

sbit SER=P2^5;           //14,8位串行输入
sbit RCLK1=P2^6;           //12琐存
sbit SRCLK=P2^7;           //11时钟   

sbit LED1=P0^0;               
sbit LED2=P0^1;               
sbit LED3=P0^2;               
sbit LED4=P0^3;     
sbit LED5=P0^4;               
sbit LED6=P0^5;               
sbit LED7=P0^6;               
sbit LED8=P0^7;  
sbit ds1820=P2^0;
//-----------------------------
uchar bdata x;
sbit x0     =x^7;
sbit x1     =x^6;
sbit x2     =x^5;
sbit x3     =x^4;
//-----------------------------
uchar data TAB[10],xs1[8],msn=50;
uint plz,wdz;
//-----------------------------
extern  void d25045(uchar x);
//-----------------------------
uchar code lcd1[17]={0x14,0xB7,0x2C,0x25,0x87,
                     0x45,0x44,0x37,0x04,0x05,
					 0x7F,0xEF,0xFD,0xc4,0xFF};
					//显示0--F 
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,
		};
//-----------------------------
void delay1(uint ms)
{
uint i;
for(i=0;i<ms;i++);            //Feed the dog
}
//****************************/
void d595(uchar temp)
{
uchar j;
for (j=0;j<8;j++)
   {
     temp=temp>>1; 
	 SER=CY; 
	 SRCLK=1; SRCLK=0;
   }
 RCLK1=0; RCLK1=1;
}
/*-------------------------------*/
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)
{uint wdz;
wdz=cjtemp();
if((wdz>>15)==1)
  {wdz=~wdz;}
  wdz=((0x0ff0&wdz)>>4)*10+((0x0f&wdz)*6/10);
  if(wdz>1260){wdz=0;}
return wdz;
}
/*-------------------------------*/
uint RDSDZ(void)
{uchar i=0,z=0;
while(z<100)
 {
 if(plz<SDTAB[i]){i++;}
 else{z=101;}
 }
return i;
}
//-----------------------------
void AJ(void)
{uchar a,b,c;
 uint Collect;
 if(K1=1,K1==0)
   {
  if(K4=1,K4==0){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(800);
   }
 if(x0==1)
  {
  if(K2=1,K2==0)
   {
   a++;
   x0=1;
   delay1(200);
   }
  if(K3=1,K3==0)
   {
   a--;
   x0=1;
   delay1(200);
   }
  if(K4=1,K4==0)
   {
   c=~c;
   delay1(200);
   }
   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[6]=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;

       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 delay(uint ms)
{
uint i;
for(i=0;i<ms;i++);            //Feed the dog
}
//-----------------------------
void Show0(void)
{
   d595(lcd1[TAB[0]]);
   LED1=0;
   delay(40);
   LED1=1;
   d595(lcd1[TAB[1]]);
   LED2=0;
   delay(40);
   LED2=1;
   d595(lcd1[TAB[2]]);
   LED3=0;
   delay(40);
   LED3=1;
   d595(lcd1[TAB[3]]);
   LED4=0;
   delay(40);
   LED4=1;
}
//-------------------------------
void Show1(void)
{  
   d595(lcd1[TAB[4]]);
   LED5=0;
   delay(40);
   LED5=1;
   d595(lcd1[TAB[5]]);   
   LED6=0;
   delay(40);
   LED6=1;
   d595(lcd1[TAB[6]]);   
   LED7=0;
   delay(40);
   LED7=1;
   d595(lcd1[TAB[7]]);
   LED8=0;
   delay(40);
   LED8=1;
}
/*-------------------------------*/
void time0_int(void)interrupt 1 //using 0
{    uint a;
TR0=TR1=0;
  TH0=0Xdc;TL0=0X00;
  msn--;
  if(msn==0)
  {
  msn=50;
  a=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();
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)
{ 
  SP=0x5f;
  d25045(1);
  d25045(3);
/*
  SCON=0x50;
  TMOD=0x20;
  TH1=TL1=0XfF;         //11。0592    56000
  PCON=0x80;
  TR1=1;
*/
  TMOD=0x59;
  SCON=0x50;
  PCON=0;
  //T2MOD=0x02;
  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);
  //Send_out();
  //wdz=cjtemp();
  }
}

⌨️ 快捷键说明

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