單片機(jī)小白學(xué)習(xí)之路(三十四)---電子時(shí)鐘編程

目標(biāo):DS1302電子時(shí)鐘編程



ds1302.h

#include "ds1302.h"

uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};   //讀模式下,秒分時(shí)日星期月年寄存器所在的地址
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};  //寫模式下,秒分時(shí)日星期月年寄存器所在的地址

//---DS1302時(shí)鐘初始化2016年5月7日星期六12點(diǎn)00分00秒蒸甜。---//
//---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼---//
uchar TIME[7] = {0,0,0x12,0x07,0x05,0x06,0x16};

void Ds1302Write(uchar addr , uchar dat)  //向ds1302寫入命令(地址+數(shù)據(jù))雷猪,addr是寄存器所在的地址睛竣,dat是要傳入的數(shù)據(jù)
{
    uchar n;

    RST = 0;
    _nop_();
    SCLK = 0; //先將SCLK置低電平為上升沿做準(zhǔn)備
    _nop_();
    RST = 1;  //將RST(CE)置高電平,進(jìn)行數(shù)據(jù)傳輸
    _nop_();

    for(n=0;n<8;n++){  //開(kāi)始傳輸八位地址命令
        DSIO = addr & 0x01; //先從數(shù)據(jù)的低位開(kāi)始傳輸
        addr >>= 1;
        SCLK = 1;
        _nop_();  //一個(gè)脈沖上升沿求摇,往ds1302寫入一為位數(shù)據(jù)
        SCLk = 0;
        _nop_();  //為下次上升沿做準(zhǔn)備
    }
    for(n=0;n<8;n++){
        DSIO = dat & 0x01;
        dat>>= 1;
        SCLK = 1;
        _nop_();
        SCLK = 0; //數(shù)據(jù)在上升沿時(shí)射沟,往DS1302寫數(shù)據(jù)
        _nop_();
    }
    RST = 0; // 將RST(CE)置低電平 ,數(shù)據(jù)傳輸完了
    _nop_();
}

uchar Ds1302Read(uchar addr) //讀取一個(gè)地址的數(shù)據(jù)
{
    uchar n,dat1,dat;

    RST = 0;
    _nop_();
    SCLk = 0;  //先將SCLK置低電平為上升沿做準(zhǔn)備
    _nop_();
    RST = 1;   //將RST(CE)置高電平与境,進(jìn)行數(shù)據(jù)傳輸
    _nop_();

    for(n=0;n<8;n++){  //開(kāi)始傳輸八位地址命令
        dat1 = addr & 0x01;
        addr >>= 1;
        SCLK = 1;
        _nop_();
        SCLK = 0;
        _nop_();    
    }
    for(n=0;n<8;n++){
        dat1 = DSIO;  //一次得到一位
        dat = (dat>>1) | (dat1<<7);
        SCLK = 1;  //上面地址寫完后SCLK是验夯,先把SCLK變?yōu)楦唠娖?        _nop_();
        SCLK = 0; //DS1302下降沿時(shí),放置數(shù)據(jù)
        _nop_();    
    }
    RST = 0;    //數(shù)據(jù)傳輸結(jié)束
    _nop_();    //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的摔刁。
    SCLK = 1;
    _nop_();
    DSIO = 0;
    _nop_();
    DSIO = 1;
    _nop_();
    return dat; 
}

void Ds1302Init()//初始化ds1302
{
    uchar n;
    Ds1302Write(0x8e,0x00); //寫保護(hù)功能關(guān)閉
    for(n=0;n<7;n++){
        Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);//把日期時(shí)間寫入相應(yīng)地址
    }
    Ds1302Write(0x8e,0x80);  //開(kāi)啟寫保護(hù)功能
}

void Ds1302ReadTime() //讀取時(shí)鐘信息
{
    uchar n;
    for(n=0;n<7;n++){
        TIME[n] = Ds1302Read(READ_RTC_ADDR[7n]);//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
    }
}

發(fā)現(xiàn)寫入和讀取的程序一樣但其實(shí)內(nèi)在不一樣挥转,因?yàn)樽x取時(shí)SCLK 是0,先變?yōu)?共屈,再變?yōu)?就有了個(gè)下降沿绑谣,雖然有上升沿,但看脈沖圖也是有的拗引,有下降沿就行



ds1302.h

#ifndef _ds1302.h_
#define _ds1302.h_

//---包含頭文件---//
#include<reg52.h>
#include<intrins>

//---重定義關(guān)鍵詞---//
#ifndef uchar
#define uchar
#endif

#ifndef uint
#define uint
#endif

//---定義ds1302使用的IO口---//
sbit DSIO = P3^4;
sbit RST = P3^5;
sbit SCLK = P3^6;

//---定義全局函數(shù)---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();


//---加入全局變量--//
extern uchar TIME[7];   //加入全局變量

#endif



main.c

#include "ds1302.h"
#include "reg52.h"   //此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;  //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit LSA = P3^0;
sbit LSB = P3^1;
sbit LSC = P3^3;

char num = 0;
u8 DisplayData[8];
u8 code smgduan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i) //延時(shí)函數(shù)借宵,i=1時(shí),大約延時(shí)10us
{
    while(i--);
}

void datapros()
{
    Ds1302ReadTime();
    DisplayData[0] = smgduan[TIME[2]/16];    //時(shí)
    DisplayData[1] = smgduan[TIME[2]&0x0f];
    DisplayData[2] = 0x40;
    DisplayData[3] = smgduan[TIME[1]/16];    //分
    DisplayData[4] = smgduan[TIME[1]&0x0f];
    DisplayData[5] = 0x40;
    DisplayData[6] = smgduan[TIME[0]/16];    //秒
    DisplayData[7] = smgduan[TIME[0]&0x0f];

}

void DigDisplay()
{
    u8 i;
    for(i=0;i<8;i++)
    {
        switch(i)    //位選寺擂,選擇點(diǎn)亮的數(shù)碼管暇务,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//顯示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//顯示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//顯示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//顯示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//顯示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//顯示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//顯示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//顯示第7位    
        }
        P0=DisplayData[i];//發(fā)送數(shù)據(jù)
        delay(100); //間隔一段時(shí)間掃描  
        P0=0x00;//消隱
    }
    
}       

void main()
{
    Ds1302Init();
    while(1){
        datapros();    //數(shù)據(jù)處理函數(shù)
        DigDisplay(); //數(shù)碼管顯示
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泼掠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垦细,更是在濱河造成了極大的恐慌择镇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括改,死亡現(xiàn)場(chǎng)離奇詭異腻豌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嘱能,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門吝梅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惹骂,你說(shuō)我怎么就攤上這事苏携。” “怎么了对粪?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵右冻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我著拭,道長(zhǎng)纱扭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任儡遮,我火速辦了婚禮乳蛾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鄙币。我一直安慰自己肃叶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布爱榔。 她就那樣靜靜地躺著被环,像睡著了一般。 火紅的嫁衣襯著肌膚如雪详幽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天浸锨,我揣著相機(jī)與錄音唇聘,去河邊找鬼。 笑死柱搜,一個(gè)胖子當(dāng)著我的面吹牛迟郎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聪蘸,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宪肖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼表制!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起控乾,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤么介,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蜕衡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤短,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年慨仿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了久脯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镰吆,死狀恐怖帘撰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情万皿,我是刑警寧澤摧找,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站相寇,受9級(jí)特大地震影響慰于,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唤衫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一婆赠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佳励,春花似錦休里、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瞧剖,卻和暖如春拭嫁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抓于。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工做粤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉撮。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓怕品,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巾遭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肉康,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容