微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于51单片机的ds1302时钟芯片怎么设置12小时制?

基于51单片机的ds1302时钟芯片怎么设置12小时制?

时间:10-02 整理:3721RD 点击:

实在是解决不了  纠结好几天了 !求大神指导!
这是原程序!
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^6;
sbit SDA=P3^5;                                                                                            
sbit REST=P1^7;
sbit dula=P3^7;
uchar dat1,dat2;
uchar code Tab_Num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delayus(uchar xms)
{
   uint i;
  for(i=xms;i>0;i--);
}
void delayms(uchar xms)
{        uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
   
}
void writebyte(uchar add)
{
   uchar i;
   SCLK=0;
   delayus(2);
   for(i=0;i<8;i++)
   {
       SDA=add&0x01;
           SCLK=1;
           delayus(2);
           SCLK=0;
           add>>=1;
   }
}
uchar readbyte()
{
   uchar i,dat;
   delayus(2);
   for(i=0;i<8;i++)
   {  
      dat>>=1;
          if(SDA)
           dat=dat|0x80;
          SCLK=1;
          delayus(2);
          SCLK=0;
          delayus(2);
   }
   return dat;
}
void write1302(uchar add,uchar dat)
{
   SCLK=0;
   REST=0;
   delayus(2);
   REST=1;
   writebyte(add);
   delayus(2);
   writebyte(dat);
   delayus(2);
   REST=0;
}
uchar read1302(uchar add)
{
  uchar temp;
  SCLK=0;
  REST=0;
  delayus(2);
  REST=1;
  writebyte(add);
  delayus(2);
  temp=readbyte();
  SCLK=1;
  REST=0;
  return(temp);
}
void init1302()
{
  
  write1302(0x8e,0x00);
  write1302(0x80,0x55);
  write1302(0x82,0x59);
  //write1302(0x84,0x80);
//write1302(0x84,(11/10<<4)|(11%10));//直接用十进制表示传输的数据  十进制转换成16进制!
write1302(0x84,0x15);
  write1302(0x8e,0x80);
}
void main()
{
  uchar e,b,c,shi,fen,miao;
  //uint miaoshi,miaoge;
  //if(read1302(0x81)&0x80)      //查询1302时钟是否已经启动:如果时钟停止走动,则启动时钟 + 初始化时间;否则跳过。秒寄存器的最高位
      //{
          init1302();   
     // }
  
  while(1)
  {
     shi=read1302(0x85);
         
         delayus(1);
        
         e=shi;
         shi=shi>>4;
         e=e&0x0f;
         dula=1;P0=Tab_Num[shi];dula=0;P2=0x00;delayms(1);
     dula=1;P0=Tab_Num[e];dula=0;P2=0x01; delayms(1);
         delayms(1);
         dula=1;P0=0x40;dula=0;P2=2; delayms(1);
     fen=read1302(0x83);
         delayus(1);
         b=fen;
         fen=fen>>4;
         b=b&0x0f;
         dula=1;P0=Tab_Num[fen];dula=0;P2=0x03; delayms(1);
         dula=1;P0=Tab_Num;dula=0;P2=0x04; delayms(1);
         delayms(1);
         dula=1;P0=0x40;dula=0;P2=5; delayms(1);
         miao=read1302(0x81);
         delayus(1);
         c=miao;
         miao=miao>>4;
         c=c&0x0f;
         dula=1;P0=Tab_Num[miao];dula=0;P2=0x06; delayms(1);
         dula=1;P0=Tab_Num[c];dula=0;P2=0x07; delayms(1);
     delayms(1);
        /* dat1=miao/16; //16进制转换成BCD
     dat2=miao%16;
     miao=dat1*10+dat2; //转换成10进制数
         miaoshi=miao/10;
         miaoge=miao%10;
         dula=1;P0=Tab_Num[miaoshi];dula=0;P2=0x06; delayms(1);
         dula=1;P0=Tab_Num[miaoge];dula=0;P2=0x07; delayms(1);        */        //16进制转换成10进制由十进制计算个位与十位
         
   }
}




用数码管显示的 东流电子的板子求指导  现在只能24小时制!

东西是死的,人是活的。你可以把代码转换一下啊,比如原来24小时制是18:30你把18减去12不就变成6:30了,再做个上、下午标志,代码自己研究吧,有助于加深印象。

顶楼上

那要想让时钟停下来呢  

啥意义,不明白

谢谢大家已经解决了

哟西......

八嘎。来自: Android客户端

看看, 但不太明白

你去查数据手册,有设置的!

小编  怎么解决的

请问一下  那个ds1302的秒寄存器如何置1啊?

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

网站地图

Top