基于avr单片机的 DS1302 驱动c程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar disp[]="0123456789";
#define RD 0x01 //读
#define WR 0x00 //写
#define SECOND 0x80 //秒
#define MINUTE 0x82 //分
#define HOUR 0x84 //时
#define DAY 0x86 //日
#define MONTH 0x88 //月
#define WEEK 0x8A //星期 DATE
#define YEAR 0x8C //年
#define WR_PROTECT 0x8E //控制(写保护)
#define UPROTECT 0x00 //写保护控制位
#define PROTECT 0x80 //写保护控制位
uchar Get_Time[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar s1,s2,m1,m2,h1,h2,d1,d2,mo1,mo2,y1,y2;
//端口状态初始化设置函数
void port_init()
{
DDRD|=(1<<1);//PD0为接收端口,置为输入口,PD1为发送端口,置为输出口
DDRB|=(1<<2)|(1<<3)|(1<<4);//DS1302的SCLK,I/O,RST引脚设为输出
}
//从DS1302读一个字节数据
uchar DS1302_ReadByte()
{
uchar i,dat=0; //dat存放读出的数据,初始化为0
PORTC&=~(1<
{
dat>>=1; //读出的数据右移一位
PORTC|=(1<
PORTC&=~(1<
if(PINC&(1<
dat|=0x80; //如果数据端口位高,相应数据位置1
}
}
DDRC|=(1<
}
//向DS1302写一个字节数据
void DS1302_WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++) //写8位,低位在前
{
PORTC&=~(1<
{ PORTC|=(1<
{ PORTC&=~(1<
PORTC|=(1<
}
}
//从DS1302的指定地址读一个字节数据
uchar DS1302_ReadData(uchar addr)
{
uchar data;
PORTC&=~(1<
PORTC|=(1<
DS1302_WriteByte(addr);//写入操作命令(地址)
Delayus(10);
data=DS1302_ReadByte();//读出数据
Delayus(10);
PORTC&=~(1 << PC3); //拉低时钟端
PORTC&=~(1 << PC2); //拉低片选端
return data;
}
//向DS1302的指定地址写一个字节数据
void DS1302_WriteData(uchar addr,uchar data)
{
PORTC&=~(1<
PORTC|=(1<
DS1302_WriteByte(addr);//写入操作命令(地址)
Delayus(10);
PORTC&=~(1<
us(10);
DS1302_WriteByte(data);//写入数据
////////////
PORTC&=~(1<
PORTC&=~(1<
//对DS1302设置时间
void DS1302_SetTime(uchar *time)
{
uchar i;
uchar addr=0x80;//写入地址从秒寄存器开始
DS1302_WriteData(WR_PROTECT|WR,UPROTECT);//控制命令,WP位为0,允许写操作
Delayms(5);
for(i=0;i<7;i++)
{
DS1302_WriteData(addr|WR,time[i]);// 秒 分 时 日 月 星期 年
addr+=2;
Delayms(1);
}
DS1302_WriteData(WR_PROTECT|WR,PROTECT);//控制命令,WP位为1,不允许写操作
}
//从DS1302读取时间
void DS1302_GetTime()
{
uchar i;
PORTC&=~(1<
PORTC|=(1<
DS1302_WriteByte(0xbf);
for(i=0;i<8;i++)
{
Get_Time[i]=DS1302_ReadByte();
}
PORTC&=~(1<
void time_pros2()
{
s1=Set_Time[6]/16;
s2=Set_Time[6]%16;
m1=Set_Time[5]/16;
m2=Set_Time[5]%16;
h1=Set_Time[4]/16;
h2=Set_Time[4]%16;
d1=Set_Time[3]/16;
d2=Set_Time[3]%16;
mo1=Set_Time[2]/16;
mo2=Set_Time[2]%16;
w1=Set_Time[1]/16;
w2=Set_Time[1]%16;
y1=Set_Time[0]/16;
y2=Set_Time[0]%16;
}
void time_pros()
{
s1=Get_Time[6]/16;
s2=Get_Time[6]%16;
m1=Get_Time[5]/16;
m2=Get_Time[5]%16;
h1=Get_Time[4]/16;
h2=Get_Time[4]%16;
d1=Get_Time[3]/16;
d2=Get_Time[3]%16;
mo1=Get_Time[2]/16;
mo2=Get_Time[2]%16;
w1=Get_Time[1]/16;
w2=Get_Time[1]%16;
y1=Get_Time[0]/16;
y2=Get_Time[0]%16;
}
void display()
{
disp[11]='-';
disp[12]='.';
write_com(0x80+0x00);
write_date(disp[h1]);
write_com(0x80+0x01);
write_date(disp[h2]);
write_com(0x80+0x02);
write_date(disp[11]);
write_com(0x80+0x03);
write_date(disp[m1]);
write_com(0x80+0x04);
write_date(disp[m2]);
write_com(0x80+0x05);
write_date(disp[11]);
write_com(0x80+0x06);
write_date(disp[s1]);
write_com(0x80+0x07);
write_date(disp[s2]);
/************************我是华丽的分割线*********************************/
write_com(0x80+0x09);
write_date(disp[t1]);
write_com(0x80+0x0a);
write_date(disp[t2]);
write_com(0x80+0x0b);
write_date(disp[12]);
write_com(0x80+0x0c);
write_date(disp[t3]);
/************************我是华丽的分割线*********************************/
write_com(0x80+0x40);
write_date(disp[d1]);
write_com(0x80+0x41);
write_date(disp[d2]);
write_com(0x80+0x42);
write_date(disp[11]);
write_com(0x80+0x43);
write_date(disp[mo1]);
write_com(0x80+0x44);
write_date(disp[mo2]);
write_com(0x80+0x45);
write_date(disp[11]);
write_com(0x80+0x46);
write_date(disp[y1]);
write_com(0x80+0x47);
write_date(disp[y2]);
}
//DS1302初始化
void DS1302_Init(void)
{
DS1302_WriteData(WR_PROTECT|WR,UPROTECT); //写入写允许命令
//DS1302_WriteData(SECOND|WR,CLK_START); //启动振荡器,DS1302开始工作
DS1302_WriteData( WR_PROTECT|WR,PROTECT);//控制命令,WP位为1,
不允许写操作
}
int main()
{
void port_init();
void DS1302_Init();
uchar Set_Time[7]={0x59,0x59,0x15,0x05,0x12,0x05,0x08};
//设置秒,分,时,日,月,星期,年
DS1302_SetTime(Set_Time);
void time_pros2();
void display();
while(1)
{
void DS1302_GetTime();
void time_pros();
void display();
}
}