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

📄 ds1302.c

📁 AVR典型实例.rar
💻 C
字号:
#define F_CPU 4000000UL
#include <avr/io.h>
#define uchar unsigned char

#define ds1302_rst PA0 
#define ds1302_io PA1 
#define ds1302_sclk PA2 
#define set_ds1302_rst_ddr() DDRA|=1<<ds1302_rst 
#define set_ds1302_rst() PORTA|=1<<ds1302_rst 
#define clr_ds1302_rst() PORTA&=~(1<<ds1302_rst) 
#define set_ds1302_io_ddr() DDRA|=1<<ds1302_io 
#define set_ds1302_io() PORTA|=1<<ds1302_io 
#define clr_ds1302_io() PORTA&=~(1<<ds1302_io) 
#define clr_ds1302_io_ddr() DDRA&=~(1<<ds1302_io) 
#define in_ds1302_io() PINA&(1<<ds1302_io) 
#define set_ds1302_sclk_ddr() DDRA|=1<<ds1302_sclk 
#define set_ds1302_sclk() PORTA|=1<<ds1302_sclk 
#define clr_ds1302_sclk() PORTA&=~(1<<ds1302_sclk) 

#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_day_reg 0x8a 
#define ds1302_year_reg 0x8c 
#define ds1302_control_reg 0x8e 
#define ds1302_charger_reg 0x90 
#define ds1302_clkburst_reg 0xbe 

uchar year,month,week,day,hour,minute,second;
const uchar LedNum[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void ds1302_write(uchar reg,uchar data) 
{ 
    uchar i=0; 
    set_ds1302_io_ddr(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1302_sclk(); 
    asm("nop"); 
    asm("nop"); 
    set_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    for(i=8;i>0;i--) 
    { 
        if(reg&0x01) set_ds1302_io(); 
        else clr_ds1302_io(); 
        asm("nop"); 
        asm("nop"); 
        set_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        clr_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        reg>>=1; 
    } 
    for(i=8;i>0;i--) 
    { 
        if(data&0x01) set_ds1302_io(); 
        else clr_ds1302_io(); 
        asm("nop"); 
        asm("nop"); 
        set_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        clr_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        data>>=1; 
    } 
    clr_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1302_io_ddr(); 
    asm("nop"); 
    asm("nop"); 
} 
uchar ds1302_read(uchar reg) 
{ 
    uchar data=0; 
    uchar i=0; 
    reg+=1;//读标志 
    set_ds1302_io_ddr(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1302_sclk(); 
    asm("nop"); 
    asm("nop"); 
    set_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    for(i=8;i>0;i--) 
    { 
        if(reg&0x01) set_ds1302_io(); 
        else clr_ds1302_io(); 
        asm("nop"); 
        asm("nop"); 
        set_ds1302_sclk(); 
        asm("nop"); 
        asm("nop");  
        clr_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        reg>>=1; 
    } 
    clr_ds1302_io_ddr(); 
    asm("nop"); 
    asm("nop"); 
    for(i=8;i>0;i--) 
    { 
        data>>=1; 
        if(in_ds1302_io()) data|=0x80; 
        asm("nop"); 
        asm("nop"); 
        set_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
        clr_ds1302_sclk(); 
        asm("nop"); 
        asm("nop"); 
    } 
    clr_ds1302_rst(); 
    asm("nop"); 
    asm("nop"); 
    return(data); 
} 
uchar check_ds1302(void) 
{ 
    ds1302_write(ds1302_control_reg,0x80); 
    if(ds1302_read(ds1302_control_reg)==0x80) return 1; 
    return 0; 
} 
void ds1302_read_time(void) 
{ 
    year=ds1302_read(ds1302_year_reg); //年 
    month=ds1302_read(ds1302_month_reg);//月 
    day=ds1302_read(ds1302_date_reg); //日 
    week=ds1302_read(ds1302_day_reg); //周 
    hour=ds1302_read(ds1302_hr_reg); //时 
    minute=ds1302_read(ds1302_min_reg); //分 
    second=ds1302_read(ds1302_sec_reg); //秒 
} 
void ds1302_write_time(void) 
{ 
    ds1302_write(ds1302_control_reg,0x00); //关闭写保护 
    ds1302_write(ds1302_sec_reg,0x80); //暂停 
    ds1302_write(ds1302_charger_reg,0xa9); //涓流充电 
    ds1302_write(ds1302_year_reg,year); //年 
    ds1302_write(ds1302_month_reg,month); //月 
    ds1302_write(ds1302_date_reg,day); //日 
    ds1302_write(ds1302_day_reg,week); //周 
    ds1302_write(ds1302_hr_reg,hour); //时 
    ds1302_write(ds1302_min_reg,minute); //分 
    ds1302_write(ds1302_sec_reg,second); //秒 
    ds1302_write(ds1302_control_reg,0x80); //打开写保护 
} 


void delay()
{
    int i;
    for(i=0;i<600;i++)
	;
}

void LEDShow(int num)
{
    uchar i,tmp,curnum;
    int tmpnum;
    tmp = 0xef;
    tmpnum = num;
    for(i=0;i<4;i++)
    {	
        curnum = tmpnum % 10;
	tmpnum = tmpnum / 10;
	PORTA = tmp;
	PORTD = LedNum[curnum];
	delay();
	tmp = (tmp << 1) + 0x1;
    }

}
int main(void)
{
    unsigned int num;
    uchar tmpsec,tmpmin;
    DDRD = 0xff;
    DDRA = 0xff;

   for(;;)
    {
	ds1302_read_time();
	tmpsec = second&0x0f;
	tmpsec = tmpsec+((second>>4)*10);
	tmpmin = minute&0x0f;
	tmpmin = tmpmin+((minute>>4)*10);
	num = tmpsec + (tmpmin*100);
	LEDShow(num);
    }
    return 0;
}

⌨️ 快捷键说明

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