⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.txt

📁 经过验证过的DS1302程序.mage16
💻 TXT
字号:
 
#define DS1302_PORT                PORTC 
#define DS1302_DDR                DDRC 
#define DS1302_PIN                PINC 
#define DS1302_CLK                7 
#define DS1302_IO                6 
#define DS1302_RST                5 

#define set_ds1302_rst_ddr()                DS1302_DDR|=1<<DS1302_RST 
#define set_ds1302_rst()                        DS1302_PORT|=1<<DS1302_RST 
#define clr_ds1302_rst()                        DS1302_PORT&=~(1<<DS1302_RST) 

#define set_ds1302_io_ddr()                        DS1302_DDR|=1<<DS1302_IO  
#define clr_ds1302_io_ddr()                        DS1302_DDR&=~(1<<DS1302_IO)  
#define set_ds1302_io()                                DS1302_PORT|=1<<DS1302_IO 
#define clr_ds1302_io()                                DS1302_PORT&=~(1<<DS1302_IO)  
#define in_ds1302_io()                                DS1302_PIN&(1<<DS1302_IO) 

#define set_ds1302_sclk_ddr()                DS1302_DDR|=1<<DS1302_CLK  
#define set_ds1302_sclk()                        DS1302_PORT|=1<<DS1302_CLK  
#define clr_ds1302_sclk()                        DS1302_PORT&=~(1<<DS1302_CLK) 

#define ds1302_sec_reg                                0x80  
#define ds1302_min_reg                                0x82  
#define ds1302_hr_reg                                0x84  
#define ds1302_date_reg                                0x86  
#define ds1302_month_reg                        0x88  
#define ds1302_week_reg                                0x8a  
#define ds1302_year_reg                                0x8c  
#define ds1302_control_reg                        0x8e  
#define ds1302_charger_reg                        0x90  
#define ds1302_clkburst_reg                        0xbe 

向DS1302写一个字节 
void DS1302InputByte(unsigned char reg)         //实时时钟写入一字节(内部函数) 
{  
    unsigned char i; 
        for (i = 0; i < 8; i++)  
    { 
                if (reg & (1<<i)) set_ds1302_io(); 
                else clr_ds1302_io(); 
                set_ds1302_sclk();//上升沿写入数据 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                clr_ds1302_sclk(); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                 
        }  
} 
读一个字节 
unsigned char DS1302OutputByte(void)         //实时时钟读取一字节(内部函数) 
{  
    unsigned char i,data = 0; 
        for (i = 0; i < 8; i++)  
        {  
                data >>= 1; 

                if (in_ds1302_io()) data |= 0x80; 
                else data &= 0x7f; 
                set_ds1302_sclk(); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                clr_ds1302_sclk(); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
                asm("nop"); 
        } 
    return data;  
} 
写命令 
void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据 
{  
        clr_ds1302_rst(); 
        clr_ds1302_sclk(); 
        set_ds1302_rst(); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
    DS1302InputByte(ucAddr);                
    DS1302InputByte(ucDa);                
        set_ds1302_sclk(); 
        clr_ds1302_rst(); 
}  
读地址内容 
unsigned char Read1302(unsigned char ucAddr)        //读取DS1302某地址的数据 
{ 
    unsigned char ucData; 
        clr_ds1302_rst(); 
        clr_ds1302_sclk(); 
        set_ds1302_rst(); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
    DS1302InputByte(ucAddr|0x01);        // 地址,命令  
        clr_ds1302_io_ddr(); 
        clr_ds1302_io(); 
    ucData = DS1302OutputByte();      // 读1Byte数据 
        set_ds1302_sclk(); 
        clr_ds1302_rst(); 
        set_ds1302_io_ddr();  
    return(ucData); 
} 
初始化IO口 
void IO_Init(void) 
{ 
        set_ds1302_rst_ddr(); 
        set_ds1302_io_ddr(); 
        set_ds1302_sclk_ddr(); 
} 
初始化DS1302 
void Initial_DS1302()   //时钟芯片初始化 
{ 
        unsigned char Second=Read1302(ds1302_sec_reg); 
        if(Second&0x80)              //判断时钟芯片是否关闭           
    {                 
                Write1302(ds1302_control_reg,0x00); //写入允许 
                Write1302(ds1302_year_reg,0x08); //2008/03/19 星期3 07:12:05 
                Write1302(ds1302_month_reg,0x03); 
                Write1302(ds1302_date_reg,0x19); 
                Write1302(ds1302_week_reg,0x03); 
                Write1302(ds1302_hr_reg,0x07); 
                Write1302(ds1302_min_reg,0x12); 
                Write1302(ds1302_sec_reg,0x05); 
                Write1302(ds1302_charger_reg,0x16);        //充电  
                Write1302(ds1302_control_reg,0x80); //禁止写入 
        } 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -