找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1354|回复: 5
收起左侧

基于DS1302的电子时钟+SHT10温湿度测量,SHT10与DS1302冲突,仿真没问题,但实物不对

[复制链接]
ID:482970 发表于 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内,能正常显示温湿度,但过了1S又和开启ds1302_init()一样了。 求助是什么问题



IMG_20190308_215402.jpg
IMG_20190308_215338.jpg

冲突总代码和只能正常显示温湿度.rar

144.84 KB, 下载次数: 8

最佳答案

查看完整内容

一般是DS1302这块有问题,把其他项屏蔽掉直接调试DS1302
回复

使用道具 举报

ID:472242 发表于 2019-3-8 22:04 | 显示全部楼层
一般是DS1302这块有问题,把其他项屏蔽掉直接调试DS1302
回复

使用道具 举报

ID:482970 发表于 2019-3-8 22:25 | 显示全部楼层
我自己找到了............
回复

使用道具 举报

ID:482970 发表于 2019-3-8 22:26 | 显示全部楼层
MMP  接口重复了 我还看了好几遍

评分

参与人数 1黑币 +90 收起 理由
admin + 90 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2019-3-9 09:23 | 显示全部楼层
走单步,自己试。
回复

使用道具 举报

ID:123289 发表于 2019-3-9 09:24 | 显示全部楼层
学会调试、自查比什么都好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表