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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7846|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

DS1302實(shí)時(shí)時(shí)鐘程序寄存器控制字及時(shí)序分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72008 發(fā)表于 2015-1-11 14:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1、時(shí)序圖
2、控制字
3、寄存器地址與RAM地址
4、代碼

    時(shí)序圖


控制字



寄存器與RAM



代碼:
#include <reg52.h>

#include <intrins.h>

sbit dm = P2^2;        //段碼
sbit wm = P2^3;        //位碼

sbit st = P1^6;        //使能(RST)
sbit cl = P1^4;        //時(shí)鐘管腳(CLK)
sbit da = P1^5;        //i/o管腳(數(shù)據(jù)管腳)(i/o)


/*這兩個(gè)函數(shù)就這時(shí)鐘芯片的精髓*/
void x_1302(unsigned char addr,unsigned char q,bit l);        //寫(xiě)入8個(gè)bit(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
unsigned char d_1302(unsigned char addr,bit l);                                //讀取8個(gè)bit(參數(shù)1:地址,參數(shù)2:啟用BCD處理)
/*上面的兩函數(shù)就是最低層的函數(shù)了*/

//下面的常量是一些寄存器的地址
#define addr_m        0x80        //秒
#define addr_f        0x82        //分
#define addr_x        0x84        //小時(shí)
#define addr_rq        0x86        //日期
#define addr_y        0x88        //月
#define addr_xq        0x8a        //星期
#define addr_n        0x8c        //年
#define addr_xbh 0x8e        //寫(xiě)保護(hù)
#define addr_ram 0xc0        //RAM 開(kāi)始地址(這款芯片有31個(gè)8位的RAM起始地址是C0)

//下面的是一些用到的全局變量
unsigned char hc[8];        //數(shù)碼管緩存
unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
unsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        //位碼。顯示的位置
unsigned char sjhc[8]={20,13,12,12,14,30,10,4};        //空年月日時(shí)分秒周
unsigned char shijian[8];        //保存返回的數(shù)據(jù)

void DelayUs2x(unsigned char t)        //延時(shí)
{   
while(--t);
}

void x_1302(unsigned char addr,unsigned char q,bit l)        //寫(xiě)入8個(gè)bit(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
{
        unsigned char i;
        if(l)        //BCD處理
        {
                i=q/10;
                q=q%10;
                q=q+i*16;
        }
        addr = addr & 0xFE;     //最低位置零
        cl = 0;        //拉低時(shí)鐘
        da = 0;        //復(fù)位數(shù)據(jù)
        st = 1;        //使能芯片。寫(xiě)入開(kāi)始
        for(i=0;i<8;i++)        //寫(xiě)入地址
        {
                addr >>= 1;
                da = CY;
                cl = 1;
                cl = 0;        
        }
        for(i=0;i<8;i++)        //寫(xiě)入數(shù)據(jù)
        {
                q >>= 1;
                da = CY;
                cl = 1;
                cl = 0;
        }
        st = 0;        //寫(xiě)入結(jié)束
}

unsigned char d_1302(unsigned char addr,bit l)        //讀取8個(gè)bit(參數(shù)1:地址,參數(shù)2:啟用BCD處理)
{
        unsigned char i,dat;
        addr = addr | 0x01;//最低位置高
        cl = 0;        //拉低時(shí)鐘
        da = 0;        //復(fù)位數(shù)據(jù)
        st = 1;        //使能芯片,讀取開(kāi)始
        for(i=0;i<8;i++)        //寫(xiě)入地址
        {
                addr >>= 1;
                da = CY;
                cl = 1;
                cl = 0;
        }
        for(i=0;i<8;i++)        //讀取數(shù)據(jù)
        {
                dat >>= 1;
                if(da)
                        dat = dat | 0x80;
                cl = 1;
                cl = 0;
        }
        st = 0;        //讀取結(jié)束
        if(l)        //BCD處理
        {
                i = dat / 16;        
                dat = dat % 16;
                dat = dat +i*10;
        }
        return dat;
}

void d_sj()        //讀出時(shí)間寫(xiě)入數(shù)碼管緩存
{
        shijian[0]= d_1302(addr_x,0);        //讀出小時(shí)BCD數(shù)據(jù)
        shijian[1]= d_1302(addr_f,0);        //讀出分鐘BCD數(shù)據(jù)
        shijian[2]= d_1302(addr_m,0);        //讀出秒BCD數(shù)據(jù)
        hc[0]=DM[shijian[0]/16];
        hc[1]=DM[shijian[0]%16];
        hc[2]=0x40;
        hc[3]=DM[shijian[1]/16];
        hc[4]=DM[shijian[1]%16];
        hc[5]=0x40;
        hc[6]=DM[shijian[2]/16];
        hc[7]=DM[shijian[2]%16];
}

void sm()        //數(shù)碼管掃描顯示
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                P0 = 0;        //消影
                dm = 1;
                dm = 0;

                P0 = WM[ i];        //寫(xiě)入位碼
                wm = 1;
                wm = 0;

                P0 = hc[ i];        //寫(xiě)入段碼
                dm = 1;
                dm = 0;
                DelayUs2x(10);
        }
}
void x_sj()        //寫(xiě)入時(shí)間
{
        x_1302(addr_xbh,0,0);                //關(guān)閉寫(xiě)保護(hù)
        x_1302(addr_x,sjhc[4],1);        //寫(xiě)入小時(shí)(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
        x_1302(addr_f,sjhc[5],1);        //寫(xiě)入分鐘(參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
        x_1302(addr_m,sjhc[6],1);        //寫(xiě)入秒  (參數(shù)1:地址,參數(shù)2:數(shù)據(jù),參數(shù)3:啟用BCD處理)
        x_1302(addr_xbh,80,0);                //打開(kāi)寫(xiě)保護(hù)
}
void main()
{
   x_1302(addr_ram,7,0);        //這里弄了我一個(gè)星期 。。現(xiàn)在什么情況還不明了。
        //上面一條代碼是關(guān)鍵。如果沒(méi)有這條代碼我這里就寫(xiě)不進(jìn)數(shù)據(jù)。起始這條
        //代碼可以改成寫(xiě)其他的比如寫(xiě)RAM或在寫(xiě)年等等。
        //上面的一條代碼可以說(shuō)是初始化的 。。
        x_sj();
        while(1)
        {

                d_sj();        //讀出時(shí)間然后寫(xiě)入數(shù)碼管顯示緩存
                sm();        //掃描數(shù)碼管(也就是8位數(shù)碼管顯示)
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕在线观看不卡 | 成人国产网站 | 天天射天天舔 | 国产一级免费视频 | 日日操日日干 | 国产www在线观看 | 天天躁日日躁bbbbb | 久久黄视频| 日韩精品在线观看视频 | 中文字幕伊人 | www午夜| www久久久久 | 午夜精品久久 | 国产乱码一区二区三区 | 亚洲天堂免费视频 | 黄色成人在线视频 | 国产精品手机在线观看 | 国产区视频 | 日韩一区二区三区四区 | 日韩一级黄色片 | 亚洲天堂网址 | 成人在线观看免费爱爱 | 日韩福利一区 | 日韩成人精品视频 | 国语av | 成人在线小视频 | 久久手机免费视频 | 亚洲精品在线视频 | 欧美精品网 | 中文字幕有码在线 | 亚洲免费精品视频 | 国产成人在线免费观看 | av网页在线观看 | 免费的黄色录像 | 在线播放国产精品 | 一级片免费网站 | 欧美一区二区 | 天堂资源av | 黄色影院在线观看 | 丁香花在线观看 | 日韩在线视频一区 |