2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 用单片机用c语言做闹钟 基于单片机与ds1302时钟芯片的电子闹钟C程序

用单片机用c语言做闹钟 基于单片机与ds1302时钟芯片的电子闹钟C程序

时间:2023-07-06 12:11:58

相关推荐

用单片机用c语言做闹钟 基于单片机与ds1302时钟芯片的电子闹钟C程序

原标题:基于单片机与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();}

}

}

责任编辑:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。