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

📄 ds1305._c

📁 DS1305程序代码,在网上很少,一般不容易找到.现上传一个给大家分享.
💻 _C
字号:
/*DS1302时钟显示*/

#include <iom8v.h>
#include <macros.h>
#include <stdio.h>

/*串口波特率设置*/
#define fosc 7372800  //晶振7.3728M
#define baud 9600    //波特率设置

#define ds1305_rst   PC0 
#define ds1305_sclk   PC1  
#define ds1305_io   PC2
#define set_ds1305_rst_ddr()   DDRC|=1<<ds1305_rst 
#define set_ds1305_rst()     PORTC|=1<<ds1305_rst 
#define clr_ds1305_rst()     PORTC&=~(1<<ds1305_rst) 
#define set_ds1305_io_ddr()     DDRC|=1<<ds1305_io 
#define set_ds1305_io()       PORTC|=1<<ds1305_io 
#define clr_ds1305_io()       PORTC&=~(1<<ds1305_io) 
#define clr_ds1305_io_ddr()     DDRC&=~(1<<ds1305_io) 
#define in_ds1305_io()       PINC&(1<<ds1305_io) 
#define set_ds1305_sclk_ddr()   DDRC|=1<<ds1305_sclk 
#define set_ds1305_sclk()     PORTC|=1<<ds1305_sclk 
#define clr_ds1305_sclk()     PORTC&=~(1<<ds1305_sclk) 

#define ds1305_sec_reg     0x00 
#define ds1305_min_reg     0x01 
#define ds1305_hr_reg      0x02 
#define ds1305_date_reg    0x04 
#define ds1305_month_reg   0x05 
#define ds1305_day_reg     0x03 
#define ds1305_year_reg    0x06 
#define alarm0_sec_reg     0x07
#define alarm0_min_reg     0x08
#define alarm0_hr_reg      0x09
#define alarm0_day_reg     0x0a
#define alarm1_sec_reg     0x0b
#define alarm1_min_reg     0x0c
#define alarm1_hr_reg      0x0d
#define alarm1_day_reg     0x0e
#define ds1305_control_reg   0x0f 
#define ds1305_status_reg   0x10 
#define ds1305_charger_reg   0x11 


unsigned char month,week,day,hour,minute,second;
unsigned int year;
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
PORTB^=0X01;

}

void main(void)
{ unsigned char j,shu,jia,jian,tuichu,queren,jia1,jian1,tuichu1,queren1,she_zhi,tuichu_zhi,jian_zhi,jia_zhi,queren_zhi,tuichu_zhi1,jian_zhi1,jia_zhi1,queren_zhi1,guangbiao;
  //guangbiao=0;
  CLI();
  DDRC=0XFF;
  PORTC|=0x07;
  DDRB=0XFF;
  PORTB=0x00;
  PORTD=0XFF;
  DDRD=0X00;
  MCUCR=0x00;
  GICR=0X40;
  //uart_init();
  ds1305_init();
  SEI();

while(1)
{  	
    //delay_nms(500);
	ds1305_read_time();
	printf("当前的时间是:  %d年%d月%d日  星期%d %d:%d:%d\n",year,month,day,week,hour,minute,second);
	putchar(0x0a);
	putchar(0x0d);
}

}

void ds1305_write(unsigned char reg,unsigned char data) 
{ 
  unsigned char i=0; 
   reg+=0x80;//写标志
  set_ds1305_io_ddr(); 
  //asm("nop"); 
  //asm("nop"); 
  clr_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  clr_ds1305_sclk(); 
  asm("nop"); 
  asm("nop"); 
  set_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  for(i=8;i>0;i--) 
  {     
    if(reg&0x01) set_ds1305_io(); 
    else clr_ds1305_io(); 
    asm("nop"); 
    asm("nop"); 
    set_ds1305_sclk();   
    asm("nop"); 
    asm("nop"); 
    clr_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    reg>>=1; 
  } 
  for(i=8;i>0;i--) 
  {     
    if(data&0x01) set_ds1305_io(); 
    else clr_ds1305_io(); 
    asm("nop"); 
    asm("nop"); 
    set_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    data>>=1; 
  } 
  clr_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  clr_ds1305_io_ddr(); 
  asm("nop"); 
  asm("nop"); 
} 
unsigned char ds1305_read(unsigned char reg) 
{ 
  unsigned char data=0; 
  unsigned char i=0; 
  
  set_ds1305_io_ddr();   
  //asm("nop"); 
  //asm("nop"); 
  clr_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  clr_ds1305_sclk(); 
  asm("nop"); 
  asm("nop"); 
  set_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  for(i=8;i>0;i--) 
  { 
    
    if(reg&0x01) set_ds1305_io(); 
    else clr_ds1305_io(); 
    asm("nop"); 
    asm("nop"); 
    set_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    reg>>=1; 
  } 
  clr_ds1305_io_ddr(); 
  asm("nop"); 
  asm("nop"); 
  for(i=8;i>0;i--) 
  {   
    data>>=1; 
    if(in_ds1305_io()) data|=0x80; 
    asm("nop"); 
    asm("nop"); 
    set_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
    clr_ds1305_sclk(); 
    asm("nop"); 
    asm("nop"); 
  } 
  clr_ds1305_rst(); 
  asm("nop"); 
  asm("nop"); 
  return(data); 
} 
unsigned char check_ds1305(void) 
{ 
  ds1305_write(ds1305_control_reg,0x40); 
  if(ds1305_read(ds1305_control_reg)==0x40) return 1; 
  return 0; 
} 
void ds1305_read_time(void) 
{ 
  year=ds1305_read(ds1305_year_reg);   //年
  year=((year&0xf0)>>4)*10+(year&0x0F)+2000; 
  month=ds1305_read(ds1305_month_reg);//月 
  month=((month&0xf0)>>4)*10+(month&0x0F);
  day=ds1305_read(ds1305_date_reg);   //日
  day=((day&0xf0)>>4)*10+(day&0x0F); 
  week=ds1305_read(ds1305_day_reg);   //周 
  week=((week&0xf0)>>4)*10+(week&0x0F);
  hour=ds1305_read(ds1305_hr_reg);   //时 
  hour=((hour&0xf0)>>4)*10+(hour&0x0F);
  minute=ds1305_read(ds1305_min_reg);   //分 
  minute=((minute&0xf0)>>4)*10+(minute&0x0F);
  second=ds1305_read(ds1305_sec_reg);   //秒 
  second=((second&0xf0)>>4)*10+(second&0x0F);
} 
void ds1305_write_time(void) 
{ 
  ds1305_write(ds1305_control_reg,0x80);   //停止振荡器,关闭写保护,关闭闹铃中断       
  ds1305_write(ds1305_charger_reg,0xa9);   //涓流充电 
  //ds1305_write(ds1305_year_reg,year);     //年 
  //ds1305_write(ds1305_month_reg,month);   //月 
  //ds1305_write(ds1305_date_reg,day);     //日 
  //ds1305_write(ds1305_day_reg,week);     //周 
  //ds1305_write(ds1305_hr_reg,hour);     //时 
  minute=((minute/10)<<4)+minute%10; 
  ds1305_write(ds1305_min_reg,minute);   //分
  second=((second/10)<<4)+second%10; 
  ds1305_write(ds1305_sec_reg,second);   //秒   
  ds1305_write(ds1305_control_reg,0x41);   //打开写保护 
}

void ds1305_init(void)
{
  ds1305_write(ds1305_control_reg,0x80);   //停止振荡器,关闭写保护,关闭闹铃中断       
  ds1305_write(ds1305_charger_reg,0xa9);   //涓流充电 
  ds1305_write(ds1305_year_reg,0x05);     //年 
  ds1305_write(ds1305_month_reg,0x12);   //月 
  ds1305_write(ds1305_date_reg,0x23);     //日 
  ds1305_write(ds1305_day_reg,0x05);     //周 
  ds1305_write(ds1305_hr_reg,0x10);     //时 
  ds1305_write(ds1305_min_reg,0x56);   //分 
  ds1305_write(ds1305_sec_reg,0x00);   //秒
  ds1305_write(alarm0_sec_reg,0x20);  
  ds1305_write(alarm0_min_reg,0x80); 
  ds1305_write(alarm0_hr_reg,0x80); 
  ds1305_write(alarm0_day_reg,0x80);  
  ds1305_write(ds1305_control_reg,45);   //打开写保护 
}
/*void delay_1us(void)//1u延时函数
{
  asm("nop"); 
}

void delay_1ms(void)//1ms延时函数
{
  unsigned int i;
  for (i=0;i<1034;i++)
  {
  } 
}

void delay_nus(unsigned int n)//nus延时函数
{
  unsigned int i;
  for (i=0;i<n;i++)//执行n次1微秒延时
  delay_1us();
}

void delay_nms(unsigned int n)//延时n毫秒
{
  unsigned int i;
  for (i=0;i<n;i++)//执行n次1毫秒延时
  delay_1ms(); 
}

void uart_init(void)
{
//UCSRB=(1<<RXEN)|(1<<TXEN); //允许发送和接收
UBRRL=(fosc/16/baud-1)%256; //设置波特率寄存器低位字节
UBRRH=(fosc/16/baud-1)/256; //设置波特率寄存器高位字节
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位STOP位
UCSRB=(1<<RXEN)|(1<<TXEN); //允许发送和接收
}*/

⌨️ 快捷键说明

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