找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2141|回复: 1
收起左侧

求高手指教我在用DS1302和数码管制作电子钟遇到的一个很难理解的问题

[复制链接]
ID:170141 发表于 2017-5-5 09:07 | 显示全部楼层 |阅读模式
在用DS1302和数码管制作电子时钟闹铃初始设置的过程中,发现秒设置显示的时间始终不能达到要求,比如我要设置闹铃时间11:11:11闹钟开始闹铃,可以数码管不显示11:11:11,而是显示11:11:06,虽然实际中谁也不会去设置闹铃的秒,但是遇到了问题觉得应该去解决它,但是始终百思不得其解,为什么同一数字同样的处理规则会得到不同的结果,恳求高人指点,谢谢!附源码如下:
0.png
代码在2楼
回复

使用道具 举报

ID:170141 发表于 2017-5-5 11:14 | 显示全部楼层
后面代码字体格式不一样,重发一下
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;
sbit  LSA=P2^2;//38译码器的接入
sbit  LSB=P2^3;//38译码器的接入
sbit  LSC=P2^4;//38译码器的接入
sbit DS1302_CE = P3^5;//DS1302接入
sbit DS1302_CK = P3^6;//DS1302接入
sbit DS1302_IO = P3^4;//DS1302接入
sbit  key1= P3^1;     //四个独立按键
sbit  key2= P3^0;     //四个独立按键
sbit  key3= P3^2;     //四个独立按键
sbit  key4= P3^3;     //四个独立按键
sbit  beep=P1^5;      //蜂鸣器接入
uchar xdata   smgduan[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                          0x7f,0x6f};  //共阴数码管0-9
bit key1flag;        //四个按键标志位
bit key2flag;        //四个按键标志位
bit key3flag;        //四个按键标志位
bit key4flag;        //四个按键标志位
bit time5min;        //四个按键标志位
uchar  Display[7];   //数码管显示的时钟数据缓存
uchar xdata FirstTime[7]= {  
                      0x00,0x26,0x08,0x05,0x05,0x05,0x17
                      };//时钟初始时间设置
uchar  Timesaving[7];   //从DS1302读得的时钟数据缓存
uchar  naozhong[3]={0x11,0x11,0x11};      //闹钟初始时间设定
uchar shiftflag=0;      //独立按键功能标志位
bit flag200ms=0;        //数码管刷新标志位
uchar T0RH = 0;         //定时器高位重载值
uchar T0RL = 0;         //定时器低位重载值

void ConfigTimer0(uint ms);
void keyscan();
void DS1302SingleWrite(uchar add, uchar dat);
void Set_RTC();
void Read_RTC();
void Numpros();
void keyfun();
void DigDisplay();
void NaoLing();
void main()
{
    ConfigTimer0(1);  
    Set_RTC();
        Read_RTC();
    while (1)
    {         
                 keyfun();
                 if (flag200ms)
                   {                           
                     flag200ms = 0;
                     Numpros();
                                 DigDisplay();
                           }
                          NaoLing();
    }
}

void delay(uchar i)
{
  while(i--);
}

void Numpros()
{
     Read_RTC();
         if(shiftflag==0)
         {
             Display[7] =smgduan[Timesaving[2]/16];
             Display[6] =smgduan[Timesaving[2]&0x0f];
             Display[5] = 0x40;
             Display[4] =smgduan[Timesaving[1]/16];
             Display[3] =smgduan[Timesaving[1]&0x0f];
             Display[2] = 0x40;
             Display[1] =smgduan[Timesaving[0]/16];
             Display[0] =smgduan[Timesaving[0]&0x0f];
          }
         if(shiftflag==1)
         {
             Display[7] =smgduan[Timesaving[6]/16];
             Display[6] =smgduan[Timesaving[6]&0x0f];
             Display[5] = 0x40;
             Display[4] =smgduan[Timesaving[4]/16];
             Display[3] =smgduan[Timesaving[4]&0x0f];
             Display[2] = 0x40;
             Display[1] =smgduan[Timesaving[3]/16];
             Display[0] =smgduan[Timesaving[3]&0x0f];
         }
                  if(shiftflag==2)
         {
             
             Display[7] =smgduan[naozhong[2]/16];
             Display[6] =smgduan[naozhong[2]&0x0f];
             Display[5] = 0x40;
             Display[4] =smgduan[naozhong[1]/16];
             Display[3] =smgduan[naozhong[1]&0x0f];
             Display[2] = 0x40;
             Display[1] =smgduan[naozhong[0]/16];
             Display[0] =smgduan[naozhong[0]&0x0f];
          }
}

void DigDisplay()
{
uchar i;
for(i=0;i<8;i++)
{
  switch(i)
  {          
      case 0:LSA=0;LSB=0;LSC=0;break;
            case 1:LSA=1;LSB=0;LSC=0;break;
            case 2:LSA=0;LSB=1;LSC=0;break;
            case 3:LSA=1;LSB=1;LSC=0;break;
      case 4:LSA=0;LSB=0;LSC=1;break;
      case 5:LSA=1;LSB=0;LSC=1;break;
          case 6:LSA=0;LSB=1;LSC=1;break;
          case 7:LSA=1;LSB=1;LSC=1;break;
   }
         P0=Display[i];
         delay(100);
         P0=0x00;
}
}

void keyscan()
{
   if(key1==0)
         {
          delay(200);
          if(key1==0)
          {
            key1flag=1;
           while(!key1);
          }
    }

  if(key2==0)
         {
          delay(200);
          if(key2==0)
          {
           key2flag=1;
           while(!key2);
          }
    }

   if(key3==0)
         {
          delay(200);
          if(key3==0)
          {
           key3flag=1;
           while(!key3);
          }
    }
  if(key4==0)
         {
          delay(200);
          if(key4==0)
          {
           shiftflag++;
           if(shiftflag>3)
           {
                   shiftflag=0;
           }
           while(!key4);
          }
         }
}
   
void keyfun()
{
if(shiftflag==0)
{
  if(key1flag==1)
  {
             if ((Timesaving[2]&0x0F) < 0x09)
                Timesaving[2] += 0x01;
             else
                            {
                                Timesaving[2] &= 0xF0;
                                Timesaving[2] += 0x10;
                            }
            if (((Timesaving[2]&0xF0) >= 0x20)&&((Timesaving[2]&0x0F) > 0x03))
                               {
                                Timesaving[2] = 0x00;
                               }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x84,Timesaving[2]);
             DS1302SingleWrite(0x8E, 0x80);
                         key1flag=0;
   }
  else  if(key2flag==1)
   {
          if ((Timesaving[1]&0x0F) < 0x09)
                Timesaving[1] += 0x01;
          else
                          {
                                Timesaving[1] &= 0xF0;
                                Timesaving[1] += 0x10;
                          }
          if (((Timesaving[1]&0xF0) >0x50)&&((Timesaving[1]&0x0F) >= 0x00))
                          {                                                                                                               
                                Timesaving[1] = 0x00;
                          }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x82,Timesaving[1]);
             DS1302SingleWrite(0x8E, 0x80);
                         key2flag=0;
        }
  else  if(key3flag==1)
     {
          if ((Timesaving[0]&0x0F) < 0x09)
                Timesaving[0] += 0x01;
          else
                          {
                                Timesaving[0] &= 0xF0;
                                Timesaving[0] += 0x10;
                          }
          if (((Timesaving[0]&0xF0) > 0x50)&&((Timesaving[0]&0x0F) >= 0x00))
                          {
                                Timesaving[0] = 0x00;
                          }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x82,Timesaving[0]);
             DS1302SingleWrite(0x8E, 0x80);
                         key3flag=0;
        }
}
if(shiftflag==1)
{
  if(key1flag==1)
  {  
             if ((Timesaving[6]&0x0F) < 0x09)
                Timesaving[6] += 0x01;
             else
                            {
                                Timesaving[6] &= 0xF0;
                                Timesaving[6] += 0x10;
                            }
            if (((Timesaving[6]&0xF0) > 0x90)&&((Timesaving[6]&0x0F) >= 0x00))
                               {
                                Timesaving[6] = 0x00;
                               }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x8c,Timesaving[6]);
             DS1302SingleWrite(0x8E, 0x80);
                         key1flag=0;
   }
  else  if(key2flag==1)
   {
          if ((Timesaving[4]&0x0F) < 0x09)
                Timesaving[4] += 0x01;
          else
                          {
                                Timesaving[4] &= 0xF0;
                                Timesaving[4] += 0x10;
                          }
          if (((Timesaving[4]&0xF0) >=0x10)&&((Timesaving[4]&0x0F) > 0x02))
                          {
                                Timesaving[4] = 0x01;
                          }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x88,Timesaving[4]);
             DS1302SingleWrite(0x8E, 0x80);
                         key2flag=0;
        }
  else   if(key3flag==1)
    {
          if ((Timesaving[3]&0x0F) < 0x09)
                Timesaving[3] += 0x01;
          else
                          {
                                Timesaving[3] &= 0xF0;
                                Timesaving[3] += 0x10;
                          }
          if (((Timesaving[3]&0xF0) >= 0x30)&&((Timesaving[3]&0x0F) >0x01))
                          {
                                Timesaving[3] = 0x01;
                          }
                         DS1302SingleWrite(0x8E, 0x00);  
             DS1302SingleWrite(0x86,Timesaving[3]);
             DS1302SingleWrite(0x8E, 0x80);
                         key3flag=0;
        }
  }
if(shiftflag==2)
{
  if(key1flag==1)
  {
             if ((naozhong[2]&0x0F) < 0x09)
                 naozhong[2] += 0x01;
             else
                            {
                                naozhong[2] &= 0xF0;
                                naozhong[2] += 0x10;
                            }
           if (((naozhong[2]&0xF0) >= 0x20)&&((naozhong[2]&0x0F) > 0x03))
                               {
                                naozhong[2] = 0x00;
                               }
                           key1flag=0;
   }
  else  if(key2flag==1)
   {
          if ((naozhong[1]&0x0F) < 0x09)
                naozhong[1] += 0x01;
          else
                          {
                                naozhong[1] &= 0xF0;
                                naozhong[1] += 0x10;
                          }
          if (((naozhong[1]&0xF0) > 0x50)&&((naozhong[1]&0x0F) >=0x00))
                          {
                                naozhong[1] = 0x00;
                          }
          key2flag=0;
        }

        if(time5min==1)
        {
     time5min=0;
         shiftflag=0;
        }
}
}
void NaoLing()
{
Read_RTC();
if((naozhong[2]==Timesaving[2])&&(naozhong[1]==Timesaving[1]))
  {
         while(1)
         {
         beep=~beep;
         delay(20);
         if(shiftflag==3)
         break;
         }
  }
}
void DS1302ByteWrite(unsigned char dat)
{
uchar i;
for(i=0;i<8;i++)  
{
  DS1302_CK = 0;   
  DS1302_IO=dat&0x01;
  DS1302_CK=1;  
  dat>>=1;
}
}

unsigned char DS1302ByteRead()
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
  DS1302_CK=0;
  dat>>=1;
  if(DS1302_IO)
  {
   dat|=0x80;
  }
  DS1302_CK=1;
}
  return dat;
}

void DS1302SingleWrite(unsigned char add, unsigned char dat)
{
DS1302_CE = 0;
DS1302_CK = 0;
DS1302_IO=0;
DS1302_CE = 1;
DS1302ByteWrite(add);
DS1302ByteWrite(dat);
DS1302_CE = 0;
}

unsigned char DS1302SingleRead(unsigned char add)
{
  uchar  dat=0x00;
  DS1302_CE = 0;
  DS1302_CK = 0;
  DS1302_IO=0;
  DS1302_CE = 1;
  DS1302ByteWrite(add);
  dat = DS1302ByteRead();
  DS1302_CK = 1;
  DS1302_CE = 0;
  return dat;
}


void Read_RTC()
{
Timesaving[0]=DS1302SingleRead(0x81);
Timesaving[1]=DS1302SingleRead(0x83);
Timesaving[2]=DS1302SingleRead(0x85);
Timesaving[3]=DS1302SingleRead(0x87);
Timesaving[4]=DS1302SingleRead(0x89);
Timesaving[5]=DS1302SingleRead(0x8b);
Timesaving[6]=DS1302SingleRead(0x8d);
}
void Set_RTC()
{

   DS1302SingleWrite(0x8E, 0x00);  
   DS1302SingleWrite(0x80,FirstTime[0]);
   DS1302SingleWrite(0x82,FirstTime[1]);
   DS1302SingleWrite(0x84,FirstTime[2]);
   DS1302SingleWrite(0x86,FirstTime[3]);
   DS1302SingleWrite(0x88,FirstTime[4]);
   DS1302SingleWrite(0x8a,FirstTime[5]);
   DS1302SingleWrite(0x8c,FirstTime[6]);
   DS1302SingleWrite(0x8E, 0x80);
}


void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  
   
    tmp = 12000000 / 12;      
    tmp = (tmp * ms) / 1000;  
    tmp = 65536 - tmp;         
    tmp = tmp + 25;            
    T0RH = (unsigned char)(tmp>>8);  
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   
    TMOD |= 0x01;   
    TH0 = T0RH;     
    TL0 = T0RL;
        EA = 1;
    ET0 = 1;        
    TR0 = 1;        
}

void InterruptTimer0() interrupt 1
{
    static unsigned char count1 = 0;
    static unsigned long count2 = 0;
    TH0 = T0RH;  
    TL0 = T0RL;
        keyscan();
    count1++;
        count2++;
    if (count1 >= 20)  
    {
        count1 = 0;
        flag200ms = 1;
    }
        if(count2>=300000)
        {
            count2 = 0;
                 time5min=1;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表