|
#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
sbit Dat=P2^0;
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
sbit CE=P1^2;
sbit DSIO=P1^4;
sbit SCL=P1^3;
uchar code talble[]="0123456789";
uchar read[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //??????????????????????????
uchar time[]={0x21,0x53,0x15,0x18,0x09,0x05,0x20}; //??????????????????????BCD?
uchar num0=0,num1=0,num2=0;
void delayms(uint z) //12MHz?,z=1??1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
void delayus(uchar z) //12MHz?,z=1??17us
{
while(z--);
}
/************************************??*************************************/
//??
/******************************DHT11??????********************************/
uchar Read_Byte()
{
uchar m,n,sum;
for(m=0;m<8;m++)
{
while(!Dat); //??????????50us????,??50us??
delayus(3); //??50us?????
sum<<=1; //????,?????????0??1???,??????
n=Dat; //???
if(n==1)
{
sum=sum|0x01;
while(!Dat); //???????
}
else
{
sum=sum|0x00;
}
delayus(3);
}
return (sum);
}
void dht11()
{
uchar m0,m1,m2,m3,m4;
Dat=1;
delayms(1);
Dat=0; //?????
delayms(20); //????18ms
Dat=1; //????,????DHT11????
delayus(3); //?????????,??20~40u?,??DHT11????
if(Dat==0) //??DHT11???????,?DHT11??????,????????80us,?????80us??????
{
while(!Dat); //???????,????????
while(Dat); //???????,???????80us,??????,???????
m0=Read_Byte(); //????????
m1=Read_Byte(); //????????
m2=Read_Byte(); //????????
m3=Read_Byte(); //????????
m4=Read_Byte(); //?????
}
if(m4==(m0+m1+m2+m3)) //????,????????,??????????
{
num0=m0;
num1=m2;
}
else
{
num0=num0;
num1=num1;
}
}
/************************************DS1302*************************************/
void Ds1302_Write_Byte(uchar addr,uchar dat) //?????????????
{
uchar i;
CE=0; //CE????,??????
SCL=0; //??????
CE=1; //CE??,??????
for(i=0;i<8;i++) //????,??8???
{
DSIO=addr&0x01; //????????
addr>>=1; //?????1?
SCL=1; //????????DS1302
_nop_();
SCL=0;
_nop_();
}
for(i=0;i<8;i++) //?????
{
DSIO=dat&0x01;
dat>>=1;
SCL=1;
_nop_();
SCL=0;
_nop_();
}
CE=0;
}
uchar Ds1302_Read_Byte(uchar addr) //?????????
{
uchar i,dat0,dat1;
CE=0; //CE????,???
SCL=0; //SCL????,???
CE=1; //??DS1302??,CE??
for(i=0;i<8;i++)
{
DSIO=addr&0x01; //?????,??addr????,?????DSIO
addr>>=1; //???????,????,???0
SCL=1; //??SCL????,????,???????,?????DS1302,??????,?????
_nop_();
SCL=0; //?SCL??,??????????
_nop_();
}
for(i=0;i<8;i++)
{
dat0=DSIO;
dat1=(dat1>>1)|(dat0<<7);
SCL=1;
_nop_();
SCL=0;
_nop_();
}
CE=0;
SCL=1;
DSIO=0;
DSIO=1;
return dat1;
}
void DS1302_Init()
{
Ds1302_Write_Byte(0x8e,0x00); //????????
Ds1302_Write_Byte(0x80,0x21); //?????
Ds1302_Write_Byte(0x82,0x53); //?????
Ds1302_Write_Byte(0x84,0x15); //?????
Ds1302_Write_Byte(0x86,0x18); //?????
Ds1302_Write_Byte(0x88,0x09); //?????
Ds1302_Write_Byte(0x8a,0x05); //????
Ds1302_Write_Byte(0x8c,0x20); //????
Ds1302_Write_Byte(0x8e,0x80); //?????
}
void Read_time()
{
uchar i;
for(i=0;i<7;i++)
{
time[i]=Ds1302_Read_Byte(read[i]);
}
}
/************************************??*************************************/
//??
/**********************************1602??*************************************/
bit Busy()
{
bit bsy;
RS=0;
RW=1;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
bsy=(bit)(P0&0x80);
EN=0;
return (bsy);
}
void Wr_com(uchar com)
{
while(Busy());
RS=0;
RW=0;
P0=com;
delayus(1);
EN=1;
EN=0;
}
void Wr_dat(uchar dat)
{
while(Busy());
RS=1;
RW=0;
P0=dat;
delayus(1);
EN=1;
EN=0;
}
void LCD_Init()
{
Wr_com(0x38);
Wr_com(0x0C);
Wr_com(0x06);
Wr_com(0x01);
}
void display()
{
Wr_com(0x80);
Wr_dat('2');
Wr_dat('0');
Wr_dat('0'+time[6]/16); //?
Wr_dat('0'+(time[6]&0x0f));
Wr_dat('-'); //-
Wr_dat('0'+time[4]/16); //?
Wr_dat('0'+(time[4]&0x0f));
Wr_dat(0xb0); //-
Wr_dat('0'+time[3]/16); //?
Wr_dat('0'+(time[3]&0x0f));
Wr_com(0x80+0x0b);
Wr_dat('0'+(time[5]&0x0f)); //??
Wr_com(0x80+0x0d);
Wr_dat(talble[num0/10]); //??
Wr_dat(talble[num0%10]);
Wr_dat(0x25); //%
Wr_com(0xC0);
Wr_dat('0'+time[2]/16); //?
Wr_dat('0'+(time[2]&0x0f));
Wr_dat(0x3a); //:
Wr_dat('0'+time[1]/16); //?
Wr_dat('0'+(time[1]&0x0f));
Wr_dat(0x3a); //:
Wr_dat('0'+time[0]/16); //?
Wr_dat('0'+(time[0]&0x0f));
Wr_com(0xC0+0x0a);
Wr_dat(talble[num1/10]); //??
Wr_dat(talble[num1%10]);
Wr_dat(0x2e); //.
Wr_dat(talble[0]);
Wr_dat(0xdf); //
Wr_dat(0x43); //C
}
void main()
{
uint a;
LCD_Init();
DS1302_Init();
while(1)
{
a++;
if(a==20)
{
a=0;
dht11();
}
Read_time();
display();
}
} |
|