《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > 基于AT89C52以及DS1302的電子時(shí)鐘C程序

基于AT89C52以及DS1302的電子時(shí)鐘C程序

2015-11-04
關(guān)鍵詞: DS1302 AT89C52

說明:此程序?yàn)椴┲鲄⒖计渌绦虬存I一為時(shí)間與日期切換鍵;按鍵二為時(shí)間或日期調(diào)整鍵,即當(dāng)顯示時(shí)間時(shí),每按一次依次顯示小時(shí)、分鐘、秒;當(dāng)顯示日期時(shí),每按一次依次顯示年、月、日;按鍵三和按鍵四依次為加鍵和減鍵,每按一次當(dāng)松開時(shí)相應(yīng)的變化一次。

#include <reg52.h>
#define uchar unsigned char  
#define uint unsigned int

sbit T_CLK = P1^0; //DS1302管腳定義
sbit T_IO  = P1^1;  
sbit T_RST = P1^2;

sbit KEY_1 = P1^3; //按鍵管腳定義
sbit KEY_2 = P1^4;
sbit KEY_3 = P1^5; 
sbit KEY_4 = P1^6;

sbit ACC0  = ACC^0;
sbit ACC7  = ACC^7;

uchar DUAN_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X0};  //共陰極數(shù)碼管段碼表
uchar BIT_CODE[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF};  //數(shù)碼管位選
uchar second,minute,hour,day,month,year,flag,keyvalue,value=0;
uchar Time[6]={0X0,0X0,0X0,0X0,0X0,0X0};
bit setsecond,setminute,sethour,setday,setmonth,setyear,distime=1,disdate=0;
void Delay(unsigned int i)
{
  unsigned int j;
   for(j=0;j<i;j++);
}

unsigned char BCD2HEX(unsigned char BCDChar)    
{
   unsigned char temp;
   temp=(BCDChar/16*10+BCDChar);
   return temp;
}
 
unsigned char HEX2BCD(unsigned char HEXChar)
{
   unsigned char temp;
   temp=(HEXChar/10*16+HEXChar);
   return temp;
}
 
void WriteByteDS1302(unsigned char Data)
{
   unsigned char i;
   ACC = Data;
   for(i=8; i>0; i--)
   {
       T_IO = ACC0;        
       T_CLK = 1;
       T_CLK = 0;
       ACC = ACC >> 1;
   }
}
 
unsigned char ReadByteDS1302(void)
{
   unsigned char i;
   for(i=8; i>0; i--)
   {
       ACC = ACC >>1;      
       ACC7 = T_IO;
       T_CLK = 1;
       T_CLK = 0;
   }
   return(ACC);
}
 
void WriteDS1302(unsigned char Addr,unsigned char Data)
{
   T_RST = 0;
   T_CLK = 0;
   T_RST = 1;
   WriteByteDS1302(Addr);   
   WriteByteDS1302(Data); 
   T_CLK = 1;
   T_RST = 0;
}
 
unsigned char ReadDS1302(unsigned char Addr)
{
   unsigned char Data;
   T_RST = 0;
   T_CLK = 0;
   T_RST = 1;
   WriteByteDS1302(Addr);         
   Data = ReadByteDS1302();    
   T_CLK = 1;
   T_RST = 0;
   return(Data);
}
 
void DS1302_INI()  //設(shè)置ds1302函數(shù),初始化時(shí)間和日期
{
 WriteDS1302(0x8e,0x00);  //關(guān)閉寫保護(hù),允許寫操作
 WriteDS1302(0x80,0x51);  //秒
 WriteDS1302(0x82,0x59);  //分
 WriteDS1302(0x84,0x12);  //時(shí)
 WriteDS1302(0x86,0x20);  //日
 WriteDS1302(0x88,0x05);  //月
 WriteDS1302(0x8c,0x12);  //年
 WriteDS1302(0x90,0xa5);  //充電
 WriteDS1302(0xc0,0xf0);  //判斷是否初始化一次標(biāo)識(shí)寫入
 WriteDS1302(0x8e,0x80);  //打開寫保護(hù),禁止寫操作
}

void ReadTime()
{
 second  = BCD2HEX(Time[0]=ReadDS1302(0x81));
 minute  = BCD2HEX(Time[1]=ReadDS1302(0x83));
 hour    = BCD2HEX(Time[2]=ReadDS1302(0x85));
 day     = BCD2HEX(Time[3]=ReadDS1302(0x87));
 month   = BCD2HEX(Time[4]=ReadDS1302(0x89));
 year    = BCD2HEX(Time[5]=ReadDS1302(0x8d));
 
}
 
void Set(unsigned char sel,unsigned char selby)
{
 unsigned char address,item;
 unsigned char max,min;
 if(sel==0) {address=0x80; max=59;min=0;}   //秒
 if(sel==1) {address=0x82; max=59;min=0;}   //分鐘
 if(sel==2) {address=0x84; max=23;min=0;}   //小時(shí)
 if(month==2)
 {
  if(flag==1)
  {
   if(sel==3) {address=0x86; max=29;min=1;}
  }
  else
  {
   if(sel==3) {address=0x86; max=28;min=1;}
  }
 }
 else
 {
  if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
  {   
   if(sel==3) {address=0x86; max=31;min=1;}
  }
  if(month==4|month==6|month==9|month==11)
  {   
   if(sel==3) {address=0x86; max=30;min=1;}
  }
 }
 if(sel==4) {address=0x88; max=12;min=1;}   //月
   if(sel==5) {address=0x8c; max=99;min=0;}   //年
 item=ReadDS1302(address+1)/16*10+ReadDS1302(address+1);
   if (selby==0) item++; else item--;
   if(item>max) item=min;  
   if(item<min) item=max;
   WriteDS1302(0x8e,0x00);
   WriteDS1302(address,item/10*16+item);
   WriteDS1302(0x90,0xa5);
   WriteDS1302(0x8e,0x80); 
}
void Display()
{
 uchar i=0;

 for(i=0;i<6;i++)
 {
  P0=DUAN_CODE[Time[i]];  
  P2=BIT_CODE[i];
  Delay(5);
  P2=0xff;  
 } 
}
void DisplayMode()
{
 if(distime==1)
 {
    if(KEY_2==0)
    {
        Delay(10);  //延時(shí)去抖
        if(KEY_2==0)
        {
    while(KEY_2==0);
            value++;
    if(value>=4)value=0;
        }
  }
  if(value==0)
  {
   sethour=0;
   setminute=0;
   setsecond=0;

   setyear=0;
   setmonth=0;
   setday=0;

   Time[0]=hour/10;
   Time[1]=hour;
   Time[2]=minute/10;
   Time[3]=minute;
   Time[4]=second/10;
   Time[5]=second;
  }
  if(value==1)
  {
   sethour=1;
   setminute=0;
   setsecond=0;

   setyear=0;
   setmonth=0;
   setday=0;
   Time[0]=hour/10;
   Time[1]=hour;
   Time[2]=10;
   Time[3]=10;
   Time[4]=10;
   Time[5]=10;
  }
  if(value==2)
  {
   sethour=0;
   setminute=1;
   setsecond=0;

   setyear=0;
   setmonth=0;
   setday=0;

   Time[0]=10;
   Time[1]=10;
   Time[2]=minute/10;
   Time[3]=minute;
   Time[4]=10;
   Time[5]=10;
  }
  if(value==3)
  {
   sethour=0;
   setminute=0;
   setsecond=1;

   setyear=0;
   setmonth=0;
   setday=0;

   Time[0]=10;
   Time[1]=10;
   Time[2]=10;
   Time[3]=10;
   Time[4]=second/10;
   Time[5]=second;
  }
 }
 if(disdate==1)
 {
    if(KEY_2==0)
    {
        Delay(10);  //延時(shí)去抖
        if(KEY_2==0)
        {
    while(KEY_2==0);
            value++;
    if(value>=4)value=0;
        }
  }
  if(value==0)
  {
   sethour=0;
   setminute=0;
   setsecond=0;

   setyear=0;
   setmonth=0;
   setday=0;

   Time[0]=year/10;
   Time[1]=year;
   Time[2]=month/10;
   Time[3]=month;
   Time[4]=day/10;
   Time[5]=day;
  }
  if(value==1)
  {
   sethour=0;
   setminute=0;
   setsecond=0;

   setyear=1;
   setmonth=0;
   setday=0;
   Time[0]=year/10;
   Time[1]=year;
   Time[2]=10;
   Time[3]=10;
   Time[4]=10;
   Time[5]=10;
  }
  if(value==2)
  {
   sethour=0;
   setminute=0;
   setsecond=0;

   setyear=0;
   setmonth=1;
   setday=0;

   Time[0]=10;
   Time[1]=10;
   Time[2]=month/10;
   Time[3]=month;
   Time[4]=10;
   Time[5]=10;
  }
  if(value==3)
  {
   sethour=0;
   setminute=0;
   setsecond=0;

   setyear=0;
   setmonth=0;
   setday=1;

   Time[0]=10;
   Time[1]=10;
   Time[2]=10;
   Time[3]=10;
   Time[4]=day/10;
   Time[5]=day;
  }
 }
}
void KeyCheck()
{
   if(KEY_1==0)
   {
       Delay(5);
       if(KEY_1==0)
       {
          keyvalue=1;
       }
       while(KEY_1==0)Display();
   }
}
void KeyCheckADDorPLUS()
{
   if(KEY_3==0)
   {
       Delay(5);
       if(KEY_3==0)
       {
   while(KEY_3==0);
           if(setsecond==1)Set(0,0);
   else if(setminute==1)Set(1,0);
   else if(sethour==1)Set(2,0);
   else if(setday==1)Set(3,0);
   else if(setmonth==1)Set(4,0);
   else if(setyear==1)Set(5,0);
       }

   }
   if(KEY_4==0)
   {
       Delay(5);
       if(KEY_4==0)
       {
   while(KEY_4==0);
           if(setsecond==1)Set(0,1);
   else if(setminute==1)Set(1,1);
   else if(sethour==1)Set(2,1);
   else if(setday==1)Set(3,1);
   else if(setmonth==1)Set(4,1);
   else if(setyear==1)Set(5,1);
       }

   }
}
void ChangeDisplay()  
{
 
 if(keyvalue==1)
   {
  if(distime)
  {
   distime=0;
   disdate=1;
   }
  else if(disdate)
  {
   distime=1;
   disdate=0;
  }
 }
 keyvalue=0;
}
void LeapYear(void)
{
 if((year%4==0&&year0!=0)||(year0==0&&year@0==0))
 {
  flag=1;
 }
 else
 {
  flag=0;
 }
 if(flag==1&month==2&day==29&hour==0&minute==0&second==1)
 {
   WriteDS1302(0x8e,0x00);//允許寫操作
   WriteDS1302(0x88,0x03);
   WriteDS1302(0x86,0x01);
   WriteDS1302(0x90,0xa5);//充電 
   WriteDS1302(0x8e,0x80);//禁止寫操作
 }
 if(flag==0&month==2&day==28&hour==0&minute==0&second==1)
 {
   WriteDS1302(0x8e,0x00);//允許寫操作
   WriteDS1302(0x88,0x03);
   WriteDS1302(0x86,0x01);
   WriteDS1302(0x90,0xa5);//充電 
   WriteDS1302(0x8e,0x80);//禁止寫操作
 }
}
void main()
{
 DS1302_INI();
 while(1)
 {
  KeyCheck();
  ChangeDisplay();
  ReadTime();
  DisplayMode();
  Display();
  KeyCheckADDorPLUS();
  DisplayMode();
  LeapYear(); //閏年修正
 } 
}

6007ef94hbf9b5a38c83c&690.jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲国产欧美日韩精品| 亚洲一区日韩在线| 亚洲美女av网站| 在线成人黄色| 黑人极品videos精品欧美裸| 国产欧美一区二区精品性色 | 欧美一区二区三区免费视频| 亚洲天堂激情| 中日韩美女免费视频网站在线观看| 亚洲人成人77777线观看| 久久精品视频99| 欧美综合第一页| 久久精品官网| 亚洲第一天堂av| 亚洲国产一区二区a毛片| 91久久夜色精品国产九色| 亚洲国产精品久久久久婷婷老年| 久久精品欧洲| 亚洲级视频在线观看免费1级| 亚洲精品国产精品国自产观看| 亚洲人人精品| 日韩亚洲在线观看| 亚洲一级二级| 欧美一区二区三区男人的天堂 | 亚洲视频久久| 亚洲小说区图片区| 欧美一级理论性理论a| 欧美在线3区| 亚洲国产成人av| 亚洲精品影院在线观看| 一区二区三区 在线观看视| 亚洲一区二区三区精品动漫| 亚洲女同性videos| 久久动漫亚洲| 蜜臀久久99精品久久久画质超高清| 欧美激情视频给我| 欧美视频中文字幕在线| 国产精品久久久久毛片大屁完整版 | 亚洲免费一在线| 亚洲欧美制服另类日韩| 欧美在线首页| 亚洲理论在线| 小黄鸭精品aⅴ导航网站入口| 久久精品九九| 欧美激情精品久久久久久免费印度| 欧美日韩一区二区在线| 国产日韩精品久久| 在线精品观看| 99国产精品久久久久久久| 午夜精品网站| 亚洲人成艺术| 亚洲欧美www| 久久综合九色综合久99| 欧美日韩国产综合久久| 国产日韩欧美一区在线 | 亚洲国产精品第一区二区三区| 一本一道久久综合狠狠老精东影业 | 午夜精品三级视频福利| 久久婷婷麻豆| 欧美日韩在线免费观看| 国产三级精品三级| 最新中文字幕亚洲| 欧美一级免费视频| 一区二区国产精品| 欧美在线亚洲在线| 欧美精品一区二区三区很污很色的 | 国产精品久久久久9999| 影音先锋欧美精品| 亚洲午夜激情网站| 亚洲三级影院| 久久九九国产| 欧美色精品天天在线观看视频 | 91久久精品国产91久久| 午夜精品一区二区三区在线| 9国产精品视频| 久久亚洲国产成人| 国产精品天天看| 亚洲免费观看在线视频| 久久精品国产成人| 午夜精品久久久久久| 欧美欧美天天天天操| 极品少妇一区二区| 亚洲综合色婷婷| 中文日韩在线视频| 欧美国产日韩一区二区在线观看| 国产日韩精品一区| 在线一区二区三区四区五区| 亚洲美女视频在线免费观看| 久久免费的精品国产v∧| 国产精品国产三级国产aⅴ入口 | 欧美一区二区三区精品| 亚洲一区亚洲二区| 欧美精品在线观看91| 激情视频一区| 欧美一级电影久久| 午夜精品成人在线| 欧美日韩一区在线观看视频| 亚洲人精品午夜| 亚洲欧洲日产国产综合网| 欧美一区二区三区视频在线观看| 欧美视频中文字幕在线| 日韩视频三区| 99国产精品视频免费观看| 美女免费视频一区| 激情欧美日韩| 久久精品2019中文字幕| 久久精品视频在线看| 国产美女精品人人做人人爽| 亚洲婷婷综合久久一本伊一区| 中日韩美女免费视频网站在线观看| 欧美不卡在线视频| 亚洲第一精品在线| 亚洲国产日韩一级| 美国十次了思思久久精品导航| 国产一区二区三区免费观看| 亚洲自拍偷拍网址| 午夜欧美大尺度福利影院在线看| 欧美色另类天堂2015| 99re6热只有精品免费观看| 一区二区日本视频| 欧美日一区二区在线观看| 99在线精品观看| 亚洲一区二区三区视频播放| 欧美日韩一区二区三区| 99re亚洲国产精品| 亚洲一区二区黄色| 国产精品久久久久久影视| 亚洲影院一区| 久久国产成人| 国产综合在线看| 久久精品日产第一区二区| 鲁大师成人一区二区三区| 亚洲成色999久久网站| 亚洲精品视频在线观看免费| 欧美精品少妇一区二区三区| 一区二区三区高清| 亚洲欧美日韩在线播放| 国产午夜精品视频| 久久精品av麻豆的观看方式| 美玉足脚交一区二区三区图片| 亚洲国产另类精品专区 | 亚洲一区二区三区视频| 国产精品你懂的在线| 香蕉尹人综合在线观看| 久久久蜜桃精品| 亚洲国产精品高清久久久| 在线亚洲激情| 国产酒店精品激情| 久久精品国产欧美激情| 欧美激情精品久久久久久大尺度 | 亚洲综合另类| 老司机成人在线视频| 亚洲福利小视频| 亚洲深夜激情| 国产精自产拍久久久久久| 亚洲国产精品国自产拍av秋霞| 欧美国产乱视频| 亚洲视频在线一区观看| 久久精品99无色码中文字幕| 亚洲高清在线视频| 亚洲一区影院| 激情六月婷婷久久| 在线亚洲精品福利网址导航| 国产美女一区| 亚洲电影欧美电影有声小说| 欧美伦理影院| 亚洲欧美视频一区二区三区| 蜜桃av噜噜一区| 一区二区三区波多野结衣在线观看| 欧美在线91| 亚洲国产高清在线| 亚洲摸下面视频| 亚洲国产精品va在看黑人| 亚洲自拍偷拍福利| 在线观看国产精品淫| 亚洲女同在线| 亚洲第一久久影院| 午夜精品视频在线观看| 亚洲韩国精品一区| 欧美影院成年免费版| 亚洲黄色片网站| 久久精品在线视频| 一本色道久久加勒比88综合| 久久久欧美精品sm网站| 野花国产精品入口| 免费在线一区二区| 亚洲一区二区三区免费在线观看| 女人天堂亚洲aⅴ在线观看| 亚洲图片欧洲图片av| 欧美黄色一区二区| 欧美在线日韩精品| 欧美性猛交99久久久久99按摩| 亚洲国产日韩在线| 国产美女在线精品免费观看| 一区二区三区蜜桃网| 在线观看欧美日本| 久久精品国产久精国产思思| 亚洲精品社区| 麻豆九一精品爱看视频在线观看免费| 亚洲线精品一区二区三区八戒|