📄 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 + -