#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define sint signed int
sint hvalue,tvalue,tvaluenew;
float tvalueexact; /*exact 0.1 c*/
uchar i,j;
uchar dispbit,disptime;
uint delayl;
uchar delay,k;
sbit IO_PIN=P1^0;
sbit PSW_5=PSW^5;
sbit xcs=P0^0; sbit xso=P0^1;sbit xsck=P0^2;sbit xsi=P0^3;
sbit SER=P0^5; sbit RCLK=P3^5; sbit SRCLK=P3^4; /*display sign*/
bdata uchar a,b,sendata;
sbit sendbit_0=sendata^0;
sbit a_0=a^0;sbit a_1=a^1;sbit a_2=a^2;sbit a_3=a^3;
sbit a_4=a^4;sbit a_5=a^5;sbit a_6=a^6;sbit a_7=a^7;
sbit b_0=b^0;sbit b_1=b^1;sbit b_2=b^2;sbit b_3=b^3;
sbit b_4=b^4;sbit b_5=b^5;sbit b_6=b^6;sbit b_7=b^7;
uchar disbuf1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; /* display use*/
uchar code disptab[24]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x0b,
0x7f,0x0e,0xff,0x80,0xe3,0x44,0x41,0x23,0x11,0x10,
0xc3,0x00,0x03,0x19};
/*88H-"0",ebH-"1",4cH-"2",49H-"3",2bH-"4",19H-"5",18H-"6",cbH-"7",08H-"8"*/
/*0bH-"9",7fH-"-",0eH-"P",ffH-" "19-"H" because add not-gat no-logic */
uchar itu_data[4]={0x00,0x00,0x00,0x00};
/*ITU_DATA[0]-ITU TYPE;ITU_DATA[1]-DATAL*/
/*ITU_DATA[2]-DATAH;ITU_DATA[3]-CHECK SUM;*/
uchar hum[4]={0x00,0x00,0x00,0x00};
/*hum[0]-ITU TYPE;hum[1]-DATAL;hum[2]-DATAH;hum[3]-CHECK SUM*/
void rst_wdog(void);
void outbyt(void);
void inbyt(void);
void rdsr_cmd(void);
void wren_cmd(void);
void wip_p(void);
void wrsr_cmd(void);
void wreep(uchar value);
void rdeep(void);
void start_itu(void);
void wrt_cmd(void);
void read_4byte(void);
void ltm8901(void);
void display(sint z);
void display1(sint z);
void sendchar(void);
void main()
{ EA=0;
P1=0xff;
rdsr_cmd();
if((a&0x30)!=0) wrsr_cmd();
rst_wdog();
for(i=0;i<8;i++) disbuf1[i]=0;
sendchar();
IO_PIN=1;
while(1)
{rst_wdog();
ltm8901();
sendchar();
}
}
void ltm8901(void)
{ PSW_5=0;
k=0;
do{rst_wdog();
start_itu();
k=k+1;
if(k>=25) PSW_5=1;
}while(PSW_5==0);
for(delayl=0;delayl<65500;delayl++) {;} /*943ms*/
rst_wdog();
a=0x00; /*send read hum-data command*/
wrt_cmd(); /*write ITU addr byte*/
a=0x00; /*write command byte*/
wrt_cmd();
a=0x00; /*write check-sum byte*/
wrt_cmd();
for(delay=0;delay<3;delay++) {;}
read_4byte();
for(i=0;i<4;i++)
hum[i]=itu_data[i];
for(delayl=0;delayl<300;delayl++) {;}
a=0x00; /*send read hum-data command*/
wrt_cmd(); /*write ITU addr byte*/
a=0x00; /*write command byte*/
wrt_cmd();
a=0x00; /*write check-sum byte*/
wrt_cmd();
for(delay=0;delay<3;delay++) {;}
read_4byte();
hvalue=(sint)(hum[1]*5);
display1(hvalue);
if((itu_data[2]&0x08)==0) /*tempreture>=0*/
{tvaluenew=(sint)((itu_data[2]&0x07)*256+itu_data[1]);
tvalueexact=(float)(tvaluenew*0.625);
tvaluenew=(sint)(tvalueexact);
if(tvaluenew>1250) /*if >125 display"PPPP" */
{disbuf1[0]=11; disbuf1[1]=11;
disbuf1[2]=11;
}
else
{tvalue=tvaluenew;
display(tvalue);
}
}
else /*tempreture<0*/
{tvaluenew=(sint)(-1*((8-(itu_data[2]&0x07))*256-itu_data[1]));
tvalueexact=(float)(tvaluenew*0.625);
tvaluenew=(sint)(tvalueexact);
if(tvaluenew<=-550) tvaluenew=-550; /*if <-55 display =-55*/
tvalue=tvaluenew;
tvalue=-1*tvalue;
display(tvalue);
}
sendchar();
}
void display(sint z) /*change int data to tempreture display data*/
{if(z>=0)
{disbuf1[0]=(uchar)(z/1000); disbuf1[1]=(uchar)((z-disbuf1[0]*1000)/100);
disbuf1[2]=(uchar)((z-disbuf1[0]*1000-disbuf1[1]*100)/10);
disbuf1[3]=(uchar)(z-disbuf1[0]*1000-disbuf1[1]*100-disbuf1[2]*10);
if(disbuf1[0]==0) disbuf1[0]=12;
if(disbuf1[1]==0) {if(disbuf1[0]==12) disbuf1[1]=12;}
}
else /*z<0*/
{z=-1*z;
disbuf1[1]=(uchar)(z/100);
disbuf1[2]=(uchar)((z-disbuf1[1]*100)/10);
disbuf1[3]=(uchar)(z-disbuf1[1]*100-disbuf1[2]*10);
if(disbuf1[1]==0) /*test display "-"*/
{disbuf1[0]=12; disbuf1[1]=10;}
else
disbuf1[0]=10;
}
disbuf1[2]=disbuf1[2]+13; /*add "."*/
}
void display1(sint z) /*change int data to tempreture display data*/
{ disbuf1[4]=(uchar)(z/1000); disbuf1[5]=(uchar)((z-disbuf1[4]*1000)/100);
disbuf1[6]=(uchar)((z-disbuf1[4]*1000-disbuf1[5]*100)/10);
disbuf1[7]=(uchar)(z-disbuf1[4]*1000-disbuf1[5]*100-disbuf1[6]*10);
disbuf1[4]=disbuf1[4]+13;
}
void start_itu(void)
{ IO_PIN=0;
for(delay=0;delay<35;delay++) {;} /*delay 8*33+7=271us*/
IO_PIN=1;
for(delay=0;delay<17;delay++) {;} /*delay 8*17+7=143us*/
if(IO_PIN==0)
{ for(delay=0;delay<12;delay++){;} /*delay 103us*/
if(IO_PIN==1) PSW_5=1;
}
}
void wrt_cmd(void)
{ for(i=0;i<8;i++)
{if(a_0==0)
{IO_PIN=0; /*write 0*/
for(delay=0;delay<7;delay++) {;} /*delay 8*7+7=63us*/
IO_PIN=1;
for(delay=0;delayl<4;delayl++) {;} /*delay8*4 +7=39us*/
}
else
{IO_PIN=0;
for(delay=0;delay<2;delay++){;} /*delay 8*2+7=23us*/
IO_PIN=1;
for(delay=0;delay<9;delay++){;} /*delay 8*9+7=79us*/
}
a=a>>1;
}
for(delay=0;delay<12;delay++){;} /*delay 103us*/
}
void read_4byte(void)
{ for(j=0;j<4;j++)
{for(i=0;i<8;i++)
{ k=0;
do{if(IO_PIN==0)k=1;
}while(k==0);
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
a_7=IO_PIN;
b_0=a_0;
a=a>>1;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;PSW_5=0;
PSW_5=0;PSW_5=0;
/*for(delay<0;delay<2;delay++){;} /*delay 23us*/
}
a=a<<1;
a_0=b_0;
itu_data[j]=a;
}
}
void sendchar(void)
{ RCLK=0;
for(dispbit=0;dispbit<8;dispbit++)
{sendata=disptab[disbuf1[dispbit]];
for(disptime=0;disptime<8;disptime++)
{SRCLK=0;
SER=sendbit_0;
SRCLK=1;
sendata=sendata>>1;
}
}
RCLK=1;
}
void rst_wdog(void)
{xcs=0;
PSW_5=0;PSW_5=0;
xcs=1;
}
void outbyt(void)
{for(i=0;i<8;i++)
{xsck=0;
PSW_5=0;
xsi=a_7;
a=a<<1;
PSW_5=0;
xsck=1;
PSW_5=0;
}
xsi=0;
}
void inbyt(void)
{for(i=0;i<8;i++)
{xsck=1;
PSW_5=0;
xsck=0;
PSW_5=0;
a_0=xso;
PSW_5=a_7;
a=a<<1;
}
a=a>>1;
a_7=PSW_5;
}
void rdsr_cmd(void)
{xsck=0;
PSW_5=0;
xcs=0;
a=0x05;
PSW_5=0;
outbyt();
PSW_5=0;
inbyt();
PSW_5=0;
xsck=0;
xcs=1;
}
void wren_cmd(void)
{xsck=0;
PSW_5=0;
PSW_5=0;
xcs=0;
PSW_5=0;
a=0x06;
PSW_5=0;
outbyt();
xsck=0;
xcs=1;
}
void wip_p(void)
{for(i=0;i<0xef;i++)
{rdsr_cmd();
if(a_0==0) i=0xef;
}
}
void wrsr_cmd(void)
{wren_cmd();
xsck=0;
xcs=0;
a=0x01;
outbyt();
a=0x00;
outbyt();
xsck=0;
xcs=1;
wip_p();
}
void rde