DS1302时钟不能调整

2019-03-24 19:10发布

DS1302 可以正常显示时间,但是不能调整时间(调整后的时钟写入DS1302的程序还没写),看不出来时钟调整那块出了什么问题,大家帮忙看看吧 !谢谢#include"reg52.h"#include"intrins.h"#define uchar unsigned char #define uint unsigned int
uchar ,flag;uint hour,min,sec,;uchar m[3];  //秒,分,时寄存器初始值
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40} ;
sbit DIO=P3^4;sbit SCL=P3^6;sbit CE=P3^5;sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;sbit k4=P3^3;sbit ACC_7=ACC^7; //最好用ACC,不然有问题/*----------宏定义读写 秒,分,时,日期的寄存器地址和控制字-----*/#define write_sec        0x80#define write_min        0x82#define write_hour       0x84#define write_day        0x86#define write_month      0x88#define write_week       0x8a#define write_year       0x8c#define read_second      0x81#define read_minute      0x83#define read_hour        0x85#define read_day         0x87#define read_month       0x89#define read_week        0x8B#define read_year        0x8D#define write_protect    0x8Evoid delay(){  uchar i,j;  for(i=0;i<10;i++)     for(j=0;j<10;j++);}
void writebyte(uchar dat){     uchar i,tmp;   tmp=dat;      SCL=0;   for(i=8;i>0;i--)    {    DIO=tmp&0x01;    SCL=0;  SCL=1; tmp>>=1;  }   }void writedata(uchar add,uchar dat){ CE=0; SCL=0; CE=1; writebyte(add);  writebyte(dat);    SCL=1; CE=0;}uchar readdata(uchar add){ uchar j,dat;  CE=0;    //终止传输 SCL=0; CE=1;  //开始传输 writebyte(add);  for(j=8;j>0;j--)    {      dat>>=1;   SCL=1;    SCL=0;   if(DIO)dat|=0x80;     }  SCL=1;  CE=0;  return dat;}

void dis(){      uint a,b,c; if(flag==0) { hour=m[2]; min=m[1]; sec=m[0]; a=hour=(hour/16)*10+hour%16; b=min=(min/16)*10+min%16; c=sec=(sec/16)*10+sec%16; } if(flag==1)  {    a=hour;      b=min;  c=0;  } P0=table[a/10]; P2=0; delay();
P0=table[a%10]; P2=1; delay();
P0=0x40; P2=2; delay();
P0=table[b/10]; P2=3; delay();
P0=table[b%10]; P2=4; delay();
P0=0x40; P2=5; delay();
P0=table[c/10]; P2=6; delay();
P0=table[c%10]; P2=7; delay();}void delay1(){ uchar i,j;       for(i=0;i<10;i++)         for(j=0;j<20;j++)dis();}void key() {          dis();   if(k1==0) delay1(); if(k1==0)flag++;   if(flag==1)       {                            if(k2==0)     delay1();   if(k2==0)hour++ ;     if(hour>24)hour=0;   if(k3==0)               delay1();             if(k3==0)hour-- ;   if(hour<0)hour=23;   dis();  }         if(flag==2)   {                             if(k2==0)          delay1();   if(k2==0)min++ ;     if(hour>59)min=0;   if(k3==0)               delay1();             if(k3==0)min-- ;   if(hour<0)hour=59; dis(); }          if(flag=3)flag=0;      
   }  
void init(){        writedata(0x8e,0x00); //WP=0 写操作 writedata(0x80,0x00);//0x80是写秒数据此处写进"00"秒 writedata(0x82,0x59);//0x82是写分数据 writedata(0x84,0x23);//0x84是写时数据 writedata(0x8e,0x80); //WP=1 写保护 }void main(){  uchar i,add;    init(); while(1) {   add=0x81; for(i=0;i<3;i++) {     m=readdata(add); add+=2; } key(); } } 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
孤獨の快樂
1楼-- · 2019-03-25 15:02

我改了下程序,仿真可以显示了

说明:1.之所以加了个E1使能端,因为段码改变时不关位选,数码管显示会错误。(实际不知道怎么样,起码我仿真会有问题)

           2.P1=flag只是为了知道此时flag是多少

           3.按键得按一会儿才会有作用,估计是延时太久了,你可以自己改改

           4.其余应该能理解,有问题再问吧

危险城堡
2楼-- · 2019-03-25 16:47
 精彩回答 2  元偷偷看……
xuezhimeng2010
3楼-- · 2019-03-25 19:46
调完时间后 你没有写入到芯片  所以还是读回原来的时间。

一周热门 更多>