📄 ds1302.c
字号:
#include <iom16v.h>
#include <macros.h>
extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
#define dion PORTB |=BIT(1); //数据高
#define dioff PORTB &=~BIT(1);
#define DS1302_CLK_Low PORTB &=~BIT(0);
#define DS1302_CLK_High PORTB |=BIT(0);
#define DS1302_IO_Low PORTB &=~BIT(6);
#define DS1302_IO_High PORTB |=BIT(6);
#define DS1302_RST_High PORTB |=BIT(7);
#define DS1302_RST_Low PORTB &=~BIT(7);
#define SomeNOP() NOP();NOP();NOP();NOP();
unsigned char second,minute,hour,day,month,year;
void dataOUT(unsigned char temp)
{
unsigned char i,temp1;
temp1 = tab[temp];
for(i = 0;i < 8;i++ )
{
DS1302_CLK_Low;
if((temp1&0x80)!= 0x80)
{
dioff;
}
else
{
dion;
}
DS1302_CLK_High;
temp1 <<=1;
DS1302_CLK_Low;
}
}
void delay(void)
{
int i;
for(i=0;i<200;i++)
;
}
void display(unsigned int k)
{
dataOUT(k/1000);
PORTB &=0xC7; //DIG1
delay();
dataOUT(k/100%10);
PORTB |=0x08;
PORTB &=0xCF; //DIG2
delay();
dataOUT(k/10%10);
PORTB &=0xD7; //DIG3
PORTB |=0x10;
delay();
dataOUT(k%10);
PORTB |=0x18;
PORTB &=0xDF; //DIG4
delay();
}
/***************向DS1302送一字节数据*************************/
void InputByte(unsigned char byte1)
{
char count=8;
do
{
DS1302_CLK_Low;
SomeNOP();
if(byte1&0x01)
{DS1302_IO_High;}
else
{DS1302_IO_Low;}
SomeNOP();
DS1302_CLK_High;
SomeNOP();
DS1302_CLK_Low;
byte1>>=1;
}while(--count);
}
/****************读DS1302一个字节************************/
unsigned char OutputByte(void)
{
char count=8;
unsigned char data=0;
DDRB &=0xBF; //PB6 input
do
{
data>>=1;
DS1302_CLK_Low;
SomeNOP();
if(PINB&0x40)
data|=0x80;
DS1302_CLK_High;
SomeNOP();
DS1302_CLK_Low;
}while(--count);
DDRB=0xff;
return(data);
}
/*******************向DS1302某地址写一字节数据****************/
void write_ds1302(unsigned char addr,unsigned char Dat)
{
DS1302_RST_Low;
SomeNOP();
DS1302_CLK_Low;
SomeNOP();
DS1302_RST_High;
InputByte(addr);
InputByte(Dat);
DS1302_CLK_High;
SomeNOP();
DS1302_RST_Low;
}
/*************读DS1302地址*******************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char Dat;
DS1302_RST_Low;
SomeNOP();
DS1302_CLK_Low;
SomeNOP();
DS1302_RST_High;
InputByte(addr);
Dat=OutputByte();
DS1302_CLK_High;
SomeNOP();
DS1302_RST_Low;
return(Dat);
}
/*************************初始化DS1302****************************/
void initial_ds1302()
{
write_ds1302(0x8e,0x00); //写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,0x06); //06年
write_ds1302(0x88,0x06); //6月
write_ds1302(0x86,0x21); //21日
write_ds1302(0x84,0x11); //11时
write_ds1302(0x82,0x30); //0分
write_ds1302(0x80,0x20); //0秒
write_ds1302(0x8e,0x80); //写保护寄存器
}
/*******************读DS1302时间*************************/
void read_time()
{
second=read_ds1302(0x81); //秒寄存器
minute=read_ds1302(0x83); //分
hour=read_ds1302(0x85); //时
day=read_ds1302(0x87); //日
month=read_ds1302(0x89); //月
year=read_ds1302(0x8d); //年
}
void main(void)
{
char second1;
DDRB=0xff;
dioff;
initial_ds1302();
while(1)
{
read_time();
delay();
delay();
delay();
second1=(second/16)*10+(second%16); //HEX to DEC
display(second1);
delay();
delay();
dioff;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -