原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序
#include
#define w_second 0x80 //秒写入地址
#define w_minute 0x82 //分写入地址
#define w_hour 0x84 //时写入地址
#define w_day 0x86 //日写入地址
#define w_month 0x88 //月写入地址
#define w_week 0x8a //星期写入地址
#define w_year 0x8c //年写入地址
#define r_second 0x81 //秒读出地址
#define r_minute 0x83 //分读出地址
#define r_hour 0x85 //时读出地址
#define r_day 0x87 //日读出地址
#define r_month 0x89 //月读出地址
#define r_week 0x8b //星期读出地址
#define r_year 0x8d //年读出地址
#define w_wp 0x8e //指令写允许端地址
#define uchar unsigned char
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//7段数码管编码
uchar second; // 秒指针
uchar minute; // 分指针
uchar hour; // 时指针
uchar day; // 日指针
uchar month; // 月指针
uchar week; // 星期指针
uchar year; // 年指针
uchar cc;
uchar h_clock,m_clock,h,m;
sbit change=P1^0; // 选择按钮
sbit ok=P1^2; // 确定更改按钮
sbit crrect=P1^1; // 更改按钮
sbit look=P1^3; // 时间和年月日查看切换按钮
sbit clock=P1^7; //闹钟设定
sbit ce=P3^0; // ds1302 片选端
sbit sclk=P3^1; // ds1302 时控端
sbit io=P3^2; // ds1302 串口端
sbit clock_beef=P3^7; //蜂鸣器控制端
sbit clock_button=P3^6; //闹钟启停按钮
void delay()
{ int i,j;
j=10;
while(j--)
for(i=0;i<=123;i++);
}
void write_ds1302(uchar addr,uchar dat) //写程序
{ uchar i,temp;
ce=0;sclk=0;ce=1;
for(i=0;i<8;i++)
{ sclk=0;
temp=addr;
io=(bit)(temp&0x01); //每一次只传送一位数据
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{ sclk=0;
temp=dat;
io=(bit)(temp&0x01);
dat>>=1;
sclk=1;
}
ce=0;
}
uchar read_ds1302(uchar addr) //读程序
{ uchar i,temp;
ce=0;sclk=0;ce=1;
for(i=0;i<8;i++)
{ sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{ temp>>=1;
sclk=0;
if(io) temp=temp|0x80;
else temp=temp&0x7f;
sclk=1;
}
return temp;
}
void set_ds1302() //初始化ds1302
{ write_ds1302(w_wp,0x00);
write_ds1302(w_second,second);
write_ds1302(w_minute,minute);
write_ds1302(w_hour,hour);
write_ds1302(w_day,day);
write_ds1302(w_month,month);
write_ds1302(w_week,week);
write_ds1302(w_year,year);
write_ds1302(w_wp,0x80);
}
void view1() //时间显示
{ uchar i;
P2=0;
P0=table[second]; //秒显示
P2=0x01;
for(i=0;i<=123;i++);
P2=0;
P0=table[second/16];
P2=0x02;
for(i=0;i<=123;i++);
P2=0;
P0=table[minute]-0x80; //分显示,(-0x80表示dp点亮)
P2=0x04;
for(i=0;i<=123;i++);
P2=0;
P0=table[minute/16];
P2=0x08;
for(i=0;i<=123;i++);
P2=0;
P0=table[hour]-0x80;//时显示
P2=0x10;
for(i=0;i<=123;i++);
P2=0;
P0=table[hour/16];
P2=0x20;
for(i=0;i<=123;i++);
void change_ds1302() //更改设定选择
{ uchar i;
cc=0;
while(ok)
{ if(cc==6) cc=0;
cc++;
while(change&&ok)
{ if(i==320) i=0;
else i++;
switch(cc)
{
case 1: if(i<160) minute=read_ds1302(r_minute);
else {minute=0xaa; year=read_ds1302(r_year);}
view1();
break;
case 2: if(i<160) hour=read_ds1302(r_hour);
else {hour=0xaa; minute=read_ds1302(r_minute);}
view1();
break;
case 3: if(i<160) week=read_ds1302(r_week);
else {week=0xaa;hour=read_ds1302(r_hour);}
view2();
break;
case 4: if(i<160) day=read_ds1302(r_day);
else {day=0xaa; week=read_ds1302(r_week);}
view2();
break;
case 5: if(i<160) month=read_ds1302(r_month);
else {month=0xaa; day=read_ds1302(r_day);}
view2();
break;
case 6: if(i<160) year=read_ds1302(r_year);
else {year=0xaa; month=read_ds1302(r_month);}
view2();
break;
default: {;}
}
if(~crrect)
{ delay();
if(~crrect)
crrect_ds1302(cc);
}
}
delay();
while( ~change );
}
}
void crrect_clock(uchar i) //设定定时程序
{ switch(i)
{ case 0: if(m_clock==0x59) m_clock=0x00;
else { if(m_clock==9) { m_clock=m_clock/16;m_clock=(m_clock+1)*16;}
else m_clock=m_clock+1;
}
break;
case 1: if(h_clock==0x23) h_clock=0x00;
else { if(h_clock<0x20)
{ if(h_clock==9) {h_clock=h_clock/16;h_clock=(h_clock+1)*16;}
else h_clock=h_clock+1;
}
else h_clock=h_clock+1;
}
break;
default:{;}
}
}
void set_clock() //分、时设定选择程序
{ uchar i,j;
while(ok)
{
while(clock && ok)
{
if(j==320) j=0;
else j++;
switch(i)
{
case 0: if(j<160) m=m_clock;
else {m=0xaa; h=h_clock;}
view3();
break;
case 1: if(j<160) h=h_clock;
else {h=0xaa; m=m_clock;}
view3();
break;
default:{;}
}
if(~crrect) {while(~crrect);crrect_clock(i);}
}
delay();
if(~clock )
{
while(~clock);
if(i==0) i++;
else i=0;
}
}
}
void main()
{ uchar i;
cc=0;m_clock=0x00;h_clock=0x00;clock_beef=0;
set_ds1302(); //初始化ds1302
while(1)
{ if(~look) { delay(); //去抖
if(~look)
i=~i;while(~look);}
if(i==0) display1();
if(i) display2();
if(~change) { delay();
if(~change)
{while(~change);change_ds1302();}
}
if(~clock) { delay();
if(~clock)
{while(~clock);set_clock();}
}
}
责任编辑: