微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 麻烦各位看看ds1302时钟c程序,编了两天就是用不了,求帮...

麻烦各位看看ds1302时钟c程序,编了两天就是用不了,求帮...

时间:10-02 整理:3721RD 点击:
#include <REGX52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit yma=P2^2;  //138译码器控制口
sbit ymb=P2^3;
sbit ymc=P2^4;
sbit sclk=P3^6;//ds1302控制
sbit ce=P3^5;
sbit io=P3^4;
sbit rs=P2^6;//lcd1602控制
sbit rw=P2^5;
sbit sn=P2^7;
char code dsread[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d,};//ds1302读数组
char code dswrite[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,};//写数组
char  time[]={0,0,0x12,0x01, 0x01, 0x02, 0x13};//存放时间数组
void delay(uint x)//延时
{
  uint i,j;
  for(i=x;i>0;i--)
         for(j=110;j>0;j--);
}
void ds1302write(uchar add, uchar dat)//数据和地址的写入
{
  char n;
  ce=0;
  _nop_();
  sclk=0;
  _nop_();
  ce=1;
  _nop_();
  for(n=0;n<8;n++)
  {
           io=add&0x01;
         add>>=1;
         sclk=1;
         _nop_();
         sclk=0;
         _nop_();
  }
  for(n=0;n<8;n++)
  {
           io=dat&0x01;
         dat>>=1;
         sclk=1;
         _nop_();
         sclk=0;
         _nop_();
  }
  ce=0;
  _nop_();
}
char ds1302read(char add)//读取数据
{
   char n,dat,dat1;
   ce=0;
   _nop_();
   sclk=0;
   _nop_();
   ce=1;
   _nop_();
   for(n=0;n<8;n++)
   {
            io=add&0x01;
         add>>=1;
         sclk=1;
         _nop_();
         sclk=0;
         _nop_();
   }
   _nop_();
   for(n=0;n<8;n++)
   {
            dat1=io;
         dat=(dat>>1) | (dat1<<7);
         sclk=1;
         _nop_();
         sclk=0;
         _nop_();
   }
           ce = 0;
        _nop_();       
    sclk = 1;
        _nop_();
        io = 0;
        _nop_();
        io = 1;
        _nop_();
        return dat;       
}
void ds1302init()//初始化
{
  char n;
  ds1302write(0x8e,0x00);
  for(n=0;n<7;n++)
          {
          ds1302write(dswrite[n],time[n]);
        }
        ds1302write(0x8e,0x80);
}
void dsreadtime()//读取时间
{
  char n;
  for(n=0;n<7;n++)
  {
          time[n] = ds1302read(dsread[n]);
  }
}
void writecom(char com)
{
        rs=0;
        sn=0;
        rw=0;
        P0=com;
        delay(5);
        sn=1;
        delay(5);
        sn=0;
}
void writedate(char date)
{
        rs=1;
        sn=0;
        rw=0;       
        P0=date;
        delay(5);
        sn=1;
        delay(5);
        sn=0;
       
}
void init()
{
       
        writecom(0x38);
        writecom(0x0c);
        writecom(0x06);
        writecom(0x01);
        writecom(0x80);
}
void display()
{
  writecom(0x80+0x40);
  writedate('0'+time[2]/16);
  writedate('0'+time[2]&0x0f);
  writedate('-');
  writedate('0'+time[1]/16);
  writedate('0'+time[1]&0x0f);
  writedate('-');
  writedate('0'+time[0]/16);
  writedate('0'+time[0]&0x0f);

}
void main()
{  
    init();
   ds1302init();
   while(1)
   {
           dsreadtime();
            display();
   }
}
1602显示部分测试过,是没问题的。主要是时间读不出来,求大神,帮帮忙,不胜感激

你的解决了没?我也是读不出来的问题,可以教教我怎么解决吗?

没呢,最近没怎么看,准备考试

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

网站地图

Top