微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 亲友们不知道是ds1302软件问题还是硬件问题帮忙测试下

亲友们不知道是ds1302软件问题还是硬件问题帮忙测试下

时间:10-02 整理:3721RD 点击:
程序如下:

#include<reg52.h>    //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
/* 变量定义 -----------------------------------------------*/
sbit SCK=P1^5;        //时钟       
sbit SDA=P1^7;        //数据       
sbit RST=P1^6;// DS1302复位         

//________________常数宏_______________//
#define DS1302_SECOND_WRITE   0X80                 //写时钟芯片的寄存器位置
#define DS1302_MINUTE_WRITE   0X82
#define DS1302_HOUR_WRITE     0X84
#define DS1302_WEEK_WRITE     0X8A
#define DS1302_DAY_WRITE     0X86
#define DS1302_MONTH_WRITE   0X88
#define DS1302_YEAR_WRITE    0X8D
#define DS1302_SECOND_READ    0X81          //读时钟芯片的寄存器位置
#define DS1302_MINUTE_READ    0X83
#define DS1302_HOUR_READ      0X85
#define DS1302_WEEK_READ      0X8B
#define DS1302_DAY_READ       0X87
#define DS1302_MONTH_READ     0X89
#define DS1302_YEAR_READ      0x8D


unsigned char code dm[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf};
unsigned char const positon[]= {0xfe,0xfd,0xfb,0xf7};//      0xfe,0xfd,0xfb,0xf7
unsigned char  clock_2[4]={0};

extern      struct
  {
   unsigned char second;
   unsigned char minute;
   unsigned char hour;
   unsigned char day;
   unsigned char week;
   unsigned char month;
   unsigned char year;
   }currenttime;



/*
********************************************************************************
** 函数名称 : Write_Ds1302_Byte(unsigned  char temp)
** 函数功能 : 写一个字节
********************************************************************************
*/

extern void smgSaoMiao (void)         //数码管扫描函数
{
static unsigned char i=0;
  P2=0XFF;       
  P0=dm[clock_2[i]];
  P2=positon[i];
  if(++i>=4) i=0;
}


void Write_Ds1302_Byte(unsigned  char temp)
{
        uchar i;
        for (i=0;i<8;i++)             //循环8次 写入数据
        {
                SCK=0;
                SDA=temp&0x01;     //每次传输低字节
                temp>>=1;                  //右移一位
                SCK=1;
        }
}
/*
********************************************************************************
** 函数名称 : Write_Ds1302( uchar address,uchar dat )
** 函数功能 : 写入DS1302
********************************************************************************
*/   
void Write_Ds1302( uchar address,uchar dat )     
{
        RST=0;
        _nop_();
        SCK=0;
        _nop_();
        RST=1;       
        _nop_();                    //启动
        Write_Ds1302_Byte(address);        //发送地址
        Write_Ds1302_Byte(dat);                //发送数据
        RST=0;                              //恢复
}
/*
********************************************************************************
** 函数名称 : Read_Ds1302 ( uchar address )
** 函数功能 : 读出DS1302数据
********************************************************************************
*/
uchar Read_Ds1302 ( uchar address )
{
        uchar i,temp=0x00;
        RST=0;
        _nop_();
        _nop_();
        SCK=0;
        _nop_();
        _nop_();
        RST=1;
        _nop_();
        _nop_();
        Write_Ds1302_Byte(address);
        for (i=0;i<8;i++)                 //循环8次 读取数据
        {               
                if(SDA)
                        temp|=0x80;                        //每次传输低字节
                SCK=0;
                temp>>=1;                        //右移一位
                _nop_();
                _nop_();
                _nop_();
                SCK=1;
        }
        RST=0;
        _nop_();                          //以下为DS1302复位的稳定时间
        _nop_();
        RST=0;
        SCK=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        SCK=1;
        _nop_();
        _nop_();
        SDA=0;
        _nop_();
        _nop_();
        SDA=1;
        _nop_();
        _nop_();
        return (temp);                        //返回
}

/*
********************************************************************************
** 函数名称 :delay(uint z)
** 函数功能 : 延时函数         延时0.1ms个单位
********************************************************************************
*/
void delay(uint z)
{{        while(z--);
  }
}
/**********************************************************/
// 初始化DS1302
/**********************************************************/
  void  v_clocklnit_f(void)
   {
          
                   Write_Ds1302(0x8e,0x00);
                   Write_Ds1302(DS1302_YEAR_WRITE, 0x01 );    //年
           Write_Ds1302(DS1302_WEEK_WRITE, 0x01 );    //星期
                   Write_Ds1302(DS1302_MONTH_WRITE, 0x01 );   //月
           Write_Ds1302(DS1302_DAY_WRITE, 0x01 ) ;    //日
           Write_Ds1302(DS1302_HOUR_WRITE, 0x13 ) ;   //小时
           Write_Ds1302(DS1302_MINUTE_WRITE, 0x56 ) ; //分钟
          Write_Ds1302(DS1302_SECOND_WRITE, 0x50 ) ; //秒
          Write_Ds1302(0x90, 0xa5 ) ;                //充电
           Write_Ds1302(0xc0, 0xf0 ) ;                //判断是否初始化一次标识写入
          // v_ds1302writebyte_f(0x8e, 0x80 ) ;                //禁止写操作
        }

   void   v_ClockUpdata_f( )
  {
         currenttime.second=Read_Ds1302(DS1302_SECOND_READ);
         currenttime.minute=Read_Ds1302( DS1302_MINUTE_READ ) ;
         currenttime.hour=Read_Ds1302( DS1302_HOUR_READ ) ;
         currenttime.day=Read_Ds1302( DS1302_DAY_READ);
         currenttime.month=Read_Ds1302(DS1302_MONTH_READ);
         currenttime.week=Read_Ds1302(DS1302_WEEK_READ);
         currenttime.year=Read_Ds1302(DS1302_YEAR_READ);
  }


/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void main(void)   
{

  v_clocklnit_f();
  P1=0xfe;
  TMOD=0x11;                          
  TH0=0xec;                                  
  TL0=0x78;                                 
  EA=1;                                       
  ET0=1;                                 
  TR0=1;


        while(1)
        {
   smgSaoMiao();

        }

}

void  ZhongDuan1 (void) interrupt 1         using 3
  {
    static unsigned    int jishu=1;
  // unsigned int          ADshuju;
  TH0=(65535-2000)/256;
  TL0=(65535-2000)%256;
         if(++jishu>=500)
         {
           jishu=0;
          v_ClockUpdata_f( );
          clock_2[3]=currenttime.hour/16;
          clock_2[2]=currenttime.hour%16;
          clock_2[1]=currenttime.minute/16;
          clock_2[0]=currenttime.minute%16;
        }
        }




小编,这程序看的头晕,分享快乐

呵呵,新手水平有限,见笑了。抄袭的加上自己编写些

这个……看看再说吧,,,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top