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