找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2230|回復: 5
打印 上一主題 下一主題
收起左側

基于DS1302的電子時鐘+SHT10溫濕度測量,SHT10與DS1302沖突,仿真沒問題,但實物不對

[復制鏈接]
跳轉到指定樓層
樓主
ID:482970 發(fā)表于 2019-3-8 22:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
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()一樣了。 求助是什么問題



IMG_20190308_215402.jpg (6.68 MB, 下載次數(shù): 40)

IMG_20190308_215402.jpg

IMG_20190308_215338.jpg (7.97 MB, 下載次數(shù): 41)

IMG_20190308_215338.jpg

沖突總代碼和只能正常顯示溫濕度.rar

144.84 KB, 下載次數(shù): 8

最佳答案

查看完整內(nèi)容

一般是DS1302這塊有問題,把其他項屏蔽掉直接調(diào)試DS1302
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:472242 發(fā)表于 2019-3-8 22:04 | 只看該作者
一般是DS1302這塊有問題,把其他項屏蔽掉直接調(diào)試DS1302
回復

使用道具 舉報

板凳
ID:482970 發(fā)表于 2019-3-8 22:25 | 只看該作者
我自己找到了............
回復

使用道具 舉報

地板
ID:482970 發(fā)表于 2019-3-8 22:26 | 只看該作者
MMP  接口重復了 我還看了好幾遍

評分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:123289 發(fā)表于 2019-3-9 09:23 | 只看該作者
走單步,自己試。
回復

使用道具 舉報

6#
ID:123289 發(fā)表于 2019-3-9 09:24 | 只看該作者
學會調(diào)試、自查比什么都好。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表