📄 wsd1.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 + -