久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2607|回復: 1
打印 上一主題 下一主題
收起左側

求高手指教我在用DS1302和數碼管制作電子鐘遇到的一個很難理解的問題

[復制鏈接]
跳轉到指定樓層
樓主
在用DS1302和數碼管制作電子時鐘鬧鈴初始設置的過程中,發現秒設置顯示的時間始終不能達到要求,比如我要設置鬧鈴時間11:11:11鬧鐘開始鬧鈴,可以數碼管不顯示11:11:11,而是顯示11:11:06,雖然實際中誰也不會去設置鬧鈴的秒,但是遇到了問題覺得應該去解決它,但是始終百思不得其解,為什么同一數字同樣的處理規則會得到不同的結果,懇求高人指點,謝謝!附源碼如下:

代碼在2樓
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一道本在线 | 在线成人| a精品视频| 国产精品区二区三区日本 | 久草新在线| 亚洲视频一区二区三区 | 久久99精品久久久久久青青日本 | 欧美日韩一卡二卡 | 在线一级片 | 久久精品在线 | 日本一级淫片免费啪啪3 | 狠狠夜夜| 国产女人精品视频 | 国产精品视频免费观看 | 欧美日韩久久久 | 国产精品视频一二三区 | 一级毛片视频免费观看 | 国产一区免费视频 | 五月天国产 | 亚洲国产二区 | 青青草网| 99精品视频在线 | 久久99精品久久久久久 | 精品欧美一区二区三区久久久 | 一区二区三区中文字幕 | 国产精品一区久久久久 | 99久久精品一区二区毛片吞精 | 亚洲免费在线观看av | 国产精品a久久久久 | 日韩综合在线播放 | 中文字幕免费在线 | 91视频一区二区三区 | 欧美精品一区二区在线观看 | 国产一级毛片精品完整视频版 | 亚洲国产精品va在线看黑人 | 亚洲成人一二三 | 亚洲精品不卡 | chinese中国真实乱对白 | 97精品国产手机 | 久久久精品国产 | 国产福利在线免费观看 |