|
13黑幣
這是DS1302代碼#ifndef __DS1302_H__#define __DS1302_H__
#include<reg51.h>
#include<intrins.h>
unsigned char ds1302_write[7]={0x80,0x82,0x84,0x86,0x88,0x8A,0x8C};
unsigned char ds1302_read[7]={0x81,0x83,0x85,0x87,0x89,0x8B,0X8D};
unsigned char time[]={0x55,0x59,0x23,0x10,0x12,0x01,0x18};
unsigned char m1,m0,m2,m3,h1,h0,h2,h3,s1,s0,s2=0,s3=0,z0,z1=1,n2=8,n3=1,n0,n1,y2=1,y3,y0,y1,r3,r2=1,r0,r1;
unsigned char time1[]={0x00,0x00,0x25};
/********************************************************************/
sbit SCK=P3^6;
sbit SD=P3^4;
sbit RST=P3^5;
/********************************************************************/
/*¸′λ½Å*/
#define RST_CLR RST=0 /*μçÆ½ÖÃμí*/
#define RST_SET RST=1 /*μçÆ½Öøß*/
/*Ë«Ïòêy¾Y*/
#define SDA_CLR SD=0 /*μçÆ½ÖÃμí*/
#define SDA_SET SD=1 /*μçÆ½Öøß*/
#define SDA_R SD /*μçÆ½¶áè¡*/
/*ê±ÖóDÅoÅ*/
#define SCK_CLR SCK=0 /*ê±ÖóDÅoÅ*/
#define SCK_SET SCK=1 /*μçÆ½Öøß*/
/********************************************************************/
#define ds1302_sec_addr 0x80 //Ãëêy¾YμØÖ·
#define ds1302_min_addr 0x82 //·Öêy¾YμØÖ·
#define ds1302_hr_addr 0x84 //ê±êy¾YμØÖ·
#define ds1302_date_addr 0x86 //èÕêy¾YμØÖ·
#define ds1302_month_addr 0x88 //ÔÂêy¾YμØÖ·
#define ds1302_day_addr 0x8A //DÇÆúêy¾YμØÖ·
#define ds1302_year_addr 0x8C //Äêêy¾YμØÖ·
#define ds1302_control_addr 0x8Ee //D′±£»¤Ãüáî×Öμ¥ÔaμØÖ·
#define ds1302_charger_addr 0x90 //ä¸μçá÷3äμçÃüáî×ÖμØÖ·
#define ds1302_clkburst_addr 0xBE //èÕàú¡¢ê±Öóí»·¢Ä£ê½Ãüáî×ÖμØÖ·
/********************************************************************/
/********************************************************************/
/*μ¥×Ö½úD′èëò»×Ö½úêy¾Y*/
extern void Write_Ds1302_Byte(unsigned char dat);
/********************************************************************/
/*μ¥×Ö½ú¶á3öò»×Ö½úêy¾Y*/
extern unsigned char Read_Ds1302_Byte(void);
/********************************************************************/
/********************************************************************/
/*ÏòDS1302μ¥×Ö½úD′èëò»×Ö½úêy¾Y*/
extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);
/********************************************************************/
/*′óDS1302μ¥×Ö½ú¶á3öò»×Ö½úêy¾Y*/
extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr);
/********************************************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<50;i++)
{
for(j=0;j<10;j++);
}
}
/*μ¥×Ö½úD′èëò»×Ö½úêy¾Y*/
void Write_Ds1302_Byte(unsigned char dat)
{
unsigned char i;
SCK = 0;
for (i=0;i<8;i++)
{
if (dat & 0x01) // μè¼Ûóúif((addr & 0x01) ==1)
{
SDA_SET; //#define SDA_SET SDA=1 /*μçÆ½Öøß*/
}
else
{
SDA_CLR; //#define SDA_CLR SDA=0 /*μçÆ½ÖÃμí*/
}
SCK_SET;
SCK_CLR;
dat = dat >> 1;
}
}
/********************************************************************/
/*μ¥×Ö½ú¶á3öò»×Ö½úêy¾Y*/
unsigned char Read_Ds1302_Byte(void)
{
unsigned char i, dat=0;
for (i=0;i<8;i++)
{
dat = dat >> 1;
if (SDA_R) //μè¼Ûóúif(SDA_R==1) #define SDA_R SDA /*μçÆ½¶áè¡*/
{
dat |= 0x80;
}
else
{
dat &= 0x7F;
}
SCK_SET;
SCK_CLR;
}
return dat;
}
/********************************************************************/
/*ÏòDS1302 μ¥×Ö½úD′èëò»×Ö½úêy¾Y*/
void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)
{
RST_CLR; /*RST½ÅÖÃμí£¬êμÏÖDS1302μÄ3õê¼»ˉ*/
SCK_CLR; /*SCK½ÅÖÃμí£¬êμÏÖDS1302μÄ3õê¼»ˉ*/
RST_SET; /*Æô¶ˉDS1302×üÏß,RST=1μçÆ½ÖÃ¸ß */
addr = addr & 0xFE;
Write_Ds1302_Byte(addr); /*D′èëÄ¿±êμØÖ·£oaddr,±£Ö¤êÇD′2ù×÷,D′֮ǰ½«×îμíλÖÃáã*/
Write_Ds1302_Byte(dat); /*D′èëêy¾Y£odat*/
RST_CLR; /*í£Ö1DS1302×üÏß*/
}
/********************************************************************/
/*′óDS1302μ¥×Ö½ú¶á3öò»×Ö½úêy¾Y*/
unsigned char Ds1302_Single_Byte_Read(unsigned char addr)
{
unsigned char temp;
RST_CLR; /*RST½ÅÖÃμí£¬êμÏÖDS1302μÄ3õê¼»ˉ*/
SCK_CLR; /*SCK½ÅÖÃμí£¬êμÏÖDS1302μÄ3õê¼»ˉ*/
RST_SET; /*Æô¶ˉDS1302×üÏß,RST=1μçÆ½ÖÃ¸ß */
addr = addr | 0x01;
Write_Ds1302_Byte(addr); /*D′èëÄ¿±êμØÖ·£oaddr,±£Ö¤êǶá2ù×÷,D′֮ǰ½«×îμíλÖøß*/
temp=Read_Ds1302_Byte(); /*′óDS1302ÖD¶á3öò»¸ö×Ö½úμÄêy¾Y*/
RST_CLR; /*í£Ö1DS1302×üÏß*/
SCK_SET;
SDA_CLR;
SDA_SET;
return temp;
}
void ds1302_init()
{
unsigned char i;
Ds1302_Single_Byte_Write(0x8e,0x00);
for(i=0;i<7;i++)
{
Ds1302_Single_Byte_Write(ds1302_write[i],time[i]);
}
Ds1302_Single_Byte_Write(0x8e,0x80);
}
void ds1302_READ123()
{
unsigned char q;
for(q=0;q<7;q++)
{
time[q]=Ds1302_Single_Byte_Read(ds1302_read[q]);
}
}
void ds1302_temp()
{
s0=time[0]&0x0f;
s1=time[0]>>4;
m0=time[1]&0x0f;
m1=time[1]>>4;
h0=time[2]&0x0f;
h1=time[2]>>4;
r0=time[3]&0x0f;
r1=time[3]>>4;
y0=time[4]&0x0f;
y1=time[4]>>4;
n0=time[6]&0x0f;
n1=time[6]>>4;
z0=time[5]&0x0f;
}
#endif
/********************************************************************/
// ¡¡¡¡¡¡¡¡¡¡ END FILE
/********************************************************************/
這是main代碼
void main(void)
{ value humi_val,temp_val;
unsigned char error,checksum;
unsigned int wendu,shidu;
Initialize_LCD();
s_connectionreset();
//ClearLine(0);
//ClearLine(1);
// ds1302_init();
delay_n10us(20000); //??0.2s
while(1)
{ error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);
if(error!=0) s_connectionreset();
else
{ humi_val.f=(float)humi_val.i;
temp_val.f=(float)temp_val.i;
calc_SHT10(&humi_val.f,&temp_val.f);
wendu=10*temp_val.f;
WriteChar(1,11,(wendu%1000)/100+'0');
WriteChar(1,12,(wendu%100)/10+'0');
shidu=10*humi_val.f;
WriteChar(0,13,(shidu%1000)/100+'0');
WriteChar(0,14,(shidu%100)/10+'0');
WriteChar(0,15,'%');
}
delay_n10us(80000); //???0.8s
KEY_Temp();
KEY_ADD();
//ds1302_READ123();
ds1302_temp();
if(x1==0&&nz==0)
{ DisplayRTC();
}
if(x1==0&&nz==1)
{ Displaynz1();
}
if(x1==0&&nz==2)
{ Displaynz2();
}
if(x1==0&&nz==3)
{ Displaynz3();
}
if(x1==1&&nz==0)
{ DisplayR1();
}
if(x1==2&&nz==0)
{ DisplayR2();
}
if(x1==3&&nz==0)
{ DisplayR3();
}
if(x1==4&&nz==0)
{ DisplayR4();
}
if(x1==5&&nz==0)
{ DisplayR5();
}
if(x1==6&&nz==0)
{ DisplayR6();
}
if(x1==7&&nz==0)
{ DisplayR7();
}
{ if(time[1]==time1[1]&&time[2]==time1[2]&&nz==0&&x1==0)
{start=1;
if(start==1&&x2==1)
start=0;
}
else {start=0;}
}
{if(start==1)
{
sound();
}
else
{
FMQ=1;
} }
}
}
屏蔽 ds1302_init();和ds1302_READ123();后溫濕度能正常顯示到LCD,但是若開啟ds1302_init(),直接顯示固定值 濕度24%過一會變00,溫度14,若屏蔽ds1302_init(),開啟ds1302_READ123();啟動顯示的1s內(nèi),能正常顯示溫濕度,但過了1S又和開啟ds1302_init()一樣了。 求助是什么問題
|
|