蓝桥杯单片机DS130

Bug也很明显 就是会显示ff 编译没有错误 可运行

img

img


img

main.c



#include <REGX52.H>
#include "ds1302.h"
#include "Nixie.h"
unsigned char Write_address[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_address[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//Time init  2022.1.18. Saturday .17.59.50
unsigned char Time[7]={0x50,0x59,0x17,0x18,0x01,0x06,0x22};

void DS1302_Init(){
    unsigned char i;
    Ds1302_Single_Byte_Write(0x8e,0x00);
    for(i=0;i<7;i++){
        Ds1302_Single_Byte_Write(Write_address[i],Time[i]);
    }
    Ds1302_Single_Byte_Write(0x8e,0x80);
}

void DS1302_time(){
    unsigned char i;
    for(i=0;i<7;i++){
    Time[i]=Ds1302_Single_Byte_Read(Read_address[i]);
    }
}
void main(){    
    P2=(P2&0x1f)|0x80;
    P0=0xff;
    P2=(P2&0x1f)|0xa0;
    P0=0x00;

    DS1302_Init();
    while(1){
        DS1302_time();
        Nixie_Last_three(Time[2],Time[1],Time[0]);    
    }
}

Nixie.c

#include <REGX52.H>

unsigned char code Nixie_Show[]={
    0xC0,0xF9,0xA4,0xB0,0x99,
    0x92,0x82,0xF8,0x80,0x90,
    0x88,0x80,0xC6,0xC0,0x86,
    0x8E,0xBF,0x7F};

void Delay(unsigned char xms)        //@12.000MHz
{
    unsigned char i, j;
    while(xms>0){
    i = 2;
    j = 239;
    do
    {
        while (--j);
    } while (--i);
    xms--;
    }
}

void NixieShow(unsigned char Locate,Number){
    P2=(P2&0x1f)|0xc0;
    P0=0x01<<(Locate-1);
    P2=(P2&0x1f)|0xe0;
    P0=Nixie_Show[Number];
    Delay(1);

}
void Nixie_First_three(unsigned char Year,Month,Day){
    NixieShow(1,Year/16);
    Delay(10);
    NixieShow(2,Year%16);
    Delay(10);
    NixieShow(3,16);
    Delay(10);
    NixieShow(4,Month/16);
    Delay(10);
    NixieShow(5,Month%16);
    Delay(10);
    NixieShow(6,16);
    Delay(10);
    NixieShow(7,Day/16);
    Delay(10);
    NixieShow(8,Day%16);
    Delay(10);

    
}
void Nixie_Last_three(unsigned char Hour,Minute,Second){
    NixieShow(1,Hour/16);
    Delay(10);
    NixieShow(2,Hour%16);
    Delay(10);
    NixieShow(3,16);
    Delay(10);
    NixieShow(4,Minute/16);
    Delay(10);
    NixieShow(5,Minute%16);
    Delay(10);
    NixieShow(6,16);
    Delay(10);
    NixieShow(7,Second/16);
    Delay(10);
    NixieShow(8,Second%16);
    Delay(10);
}


ds1302.c 这里就是蓝桥杯官方给的底层驱动代码
有一部分乱码是使用了汉字

#include "ds1302.h"
/********************************************************************/ 
/*µ¥×Ö½ÚдÈëÒ»×Ö½ÚÊý¾Ý*/
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; 
    } 
}

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;
}


void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)
{ 

    RST_CLR;            /*RST½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
    SCK_CLR;            /*SCK½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/

    RST_SET;            /*Æô¶¯DS1302×ÜÏß,RST=1µçƽÖÃ¸ß */
    addr = addr & 0xFE;     
    Write_Ds1302_Byte(addr); /*дÈëÄ¿±êµØÖ·£ºaddr,±£Ö¤ÊÇд²Ù×÷,д֮ǰ½«×îµÍλÖÃÁã*/    
    Write_Ds1302_Byte(dat);     /*дÈëÊý¾Ý£ºdat*/
    RST_CLR;                 /*Í£Ö¹DS1302×ÜÏß*/
}

/********************************************************************/ 
/*´ÓDS1302µ¥×Ö½Ú¶Á³öÒ»×Ö½ÚÊý¾Ý*/
unsigned char Ds1302_Single_Byte_Read(unsigned char addr) 
{ 
    unsigned char temp;
    RST_CLR;            /*RST½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/
    SCK_CLR;            /*SCK½ÅÖõͣ¬ÊµÏÖDS1302µÄ³õʼ»¯*/

    RST_SET;    /*Æô¶¯DS1302×ÜÏß,RST=1µçƽÖÃ¸ß */    
    addr = addr | 0x01;     
    Write_Ds1302_Byte(addr); /*дÈëÄ¿±êµØÖ·£ºaddr,±£Ö¤ÊǶÁ²Ù×÷,д֮ǰ½«×îµÍλÖøß*/
    temp=Read_Ds1302_Byte(); /*´ÓDS1302ÖжÁ³öÒ»¸ö×Ö½ÚµÄÊý¾Ý*/        
    RST_CLR;    /*Í£Ö¹DS1302×ÜÏß*/
    return temp;
}


ds1302.h



#ifndef  __DS1302_H__
#define  __DS1302_H__

#include<regx52.h>
#include<intrins.h>

sbit SCK=P1^7;        
sbit SD=P2^3;        
sbit RST=P1^3;

/*¸´Î»½Å*/
#define RST_CLR    RST=0    /*µçƽÖõÍ*/
#define RST_SET    RST=1    /*µçƽÖøß*/
/*Ë«ÏòÊý¾Ý*/
#define SDA_CLR    SD=0    /*µçƽÖõÍ*/
#define SDA_SET    SD=1    /*µçƽÖøß*/
#define SDA_R    SD    /*µçƽ¶ÁÈ¡*/    
/*ʱÖÓÐźÅ*/
#define SCK_CLR    SCK=0    /*ʱÖÓÐźÅ*/
#define SCK_SET    SCK=1    /*µçƽÖøß*/
 
#define ds1302_sec_addr            0x80        //ÃëÊý¾ÝµØÖ·
#define ds1302_min_addr            0x82        //·ÖÊý¾ÝµØÖ·
#define ds1302_hr_addr            0x84        //ʱÊý¾ÝµØÖ·
#define ds1302_date_addr        0x86        //ÈÕÊý¾ÝµØÖ·
#define ds1302_month_addr        0x88        //ÔÂÊý¾ÝµØÖ·
#define ds1302_day_addr            0x8A        //ÐÇÆÚÊý¾ÝµØÖ·
#define ds1302_year_addr        0x8C        //ÄêÊý¾ÝµØÖ·

#define ds1302_control_addr        0x8Ee        //д±£»¤ÃüÁî×Öµ¥ÔªµØÖ·
#define ds1302_charger_addr        0x90         //丵çÁ÷³äµçÃüÁî×ÖµØÖ·             
#define ds1302_clkburst_addr    0xBE        //ÈÕÀú¡¢Ê±ÖÓÍ»·¢Ä£Ê½ÃüÁî×ÖµØÖ·

extern void Write_Ds1302_Byte(unsigned char dat);

extern unsigned char Read_Ds1302_Byte(void);
  

extern void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat);

extern unsigned char Ds1302_Single_Byte_Read(unsigned char addr);

#endif     


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^