资源描述
实时电子闹钟52单片机源代码
———————————————————————————————— 作者:
———————————————————————————————— 日期:
25
个人收集整理 勿做商业用途
实时电子闹钟功能:可以在液晶上显示时间星期日期,并按秒实时更新,具有闹钟设定及到时闹钟报警提示功能,闹钟响铃时按任意键可以取消响铃,拓展了四个按键,用于功能选择,数值增大或减小及闹钟查看,每次按键均会有短“滴”声,断电时间不停,再次上电仍将准确显示在液晶上
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
照片描述:用开发板及自己焊接的部分电路板做的实时电子闹钟
实时电子闹钟程序
#include <reg52。h〉
#define uchar unsigned char
#define uint unsigned int
//按键
sbit s1=P3^4; //设置
sbit s2=P3^5; //减
sbit s3=P3^6; //增
sbit s4=P3^7; //闹钟
sbit beep=P2^4; //蜂鸣器
//1602位声明(实验板)
sbit rs1602=P2^5;
sbit rw1602=P2^6;
sbit en1602=P2^7;
/*
uchar code table0[9]={”2010—4-13"};
uchar code table1[8]={”11:03:05”};
*/
//定义全局变量
uchar shi,fen,miao,nian,yue,ri,week,s1num,num,flag,flag_di,flag1,amiao,afen,ashi;
//延时x*1ms
void delay(uint x)
{
uint a,b;
for(a=0;a<x;a++)
for(b=0;b<63;b++);
}
//转换函数
uchar Convert(uchar In_Date)
{
uchar i,Out_Date=0,temp=0;
for(i=0;i〈8;i++)
{
temp=(In_Date〉>i)&0x01;
Out_Date|=(temp<〈(7-i));
}
return Out_Date;
}
//1602写操作
//写指令
void write1602com(uchar com)
{
rs1602=0;
rw1602=0;
en1602=0;
P0=0xff;
P0=Convert(com);
delay(2);
en1602=1;
delay(2);
en1602=0;
delay(2);
rs1602=1;
}
//写数据
void write1602data(uchar adata)
{
rs1602=1;
rw1602=0;
en1602=0;
P0=0xff;
P0=Convert(adata);
delay(2);
en1602=1;
delay(2);
en1602=0;
delay(2);
rs1602=0;
}
//1602初始化设置
void init_1602()
{
rs1602=0;
rw1602=0;
en1602=0;
write1602com(0x38);
write1602com(0x0c);
write1602com(0x06);
write1602com(0x01);
write1602com(0x80);
//外部中断
EA=1;
EX0=1;
IT0=1;
//闹钟标志位
flag1=0;
flag=0;
flag_di=1;
s1num=0;
}
//在1602中显示时分秒
void lcd_sfm(uchar add,uchar adata)
{
uchar shiwei,gewei;
shiwei=adata/10;
gewei=adata%10;
write1602com(0x80+0x40+add); //在高位停留
// delay(10);
write1602data(shiwei+0x30);
write1602data(gewei+0x30);
}
//在1602中显示年月日
void lcd_nyr(uchar add,uchar adata)
{
uchar shiwei,gewei;
shiwei=adata/10;
gewei=adata%10;
write1602com(0x80+add); //在高位停留
// delay(10);
write1602data(shiwei+0x30);
write1602data(gewei+0x30);
}
//1602时钟横杠等字符的显示
void lcd1602showsign()
{
lcd_nyr(0,20);
write1602com(0x80+4);
write1602data('—’);
write1602com(0x80+7);
write1602data('-’);
write1602com(0x80+0x40+2);
write1602data(':');
write1602com(0x80+0x40+5);
write1602data(’:');
}
//DS12887部分程序
//位申明
sbit ds12887_ds=P2^3;
sbit ds12887_rw=P2^2;
sbit ds12887_as=P2^1;
sbit ds12887_cs=P2^0;
sbit ds12887_irq=P3^2;
//ds12887写数据及指令操作
void ds12887_write(uchar add,uchar adata)
{
ds12887_as=0;
ds12887_ds=1;
ds12887_rw=1;
ds12887_cs=0;
ds12887_as=1;
P1=add;
ds12887_as=0;
ds12887_rw=0;
P1=adata;
ds12887_rw=1;
ds12887_as=1;
}
//ds12887读数据操作
uchar ds12887_read(uchar add)
{
uchar k;
ds12887_ds=1;
ds12887_rw=1;
ds12887_as=1;
ds12887_cs=0;
P1=add;
ds12887_as=0;
ds12887_ds=0;
P1=0xff;
k=P1;
ds12887_ds=1;
ds12887_cs=1;
ds12887_as=1;
return k;
}
//设置ds12887初始时间
void set_time()
{
ds12887_write(0x00,50); //second
ds12887_write(0x02,59); //minute
ds12887_write(0x04,23); //hour
ds12887_write(0x06,3); //day
ds12887_write(0x07,16); //date
ds12887_write(0x08,4); //month
ds12887_write(0x09,10); //year
}
//闹钟滴滴响声
void didi()
{
beep=0;
delay(100);
beep=1;
delay(100);
beep=0;
delay(100);
beep=1;
}
//ds12887初始化
void init_ds12887()
{
ds12887_write(0x0a,0x20);
ds12887_write(0x0B,0x26);//SET置1还是置0??
set_time();
}
//闹钟设定
void set_alarm(uchar hour,uchar minute,uchar second)
{
ds12887_write(1,second);
ds12887_write(3,minute);
ds12887_write(5,hour);
}
//读取闹钟数据
void read_alarm()
{
amiao=ds12887_read(1);
afen=ds12887_read(3);
ashi=ds12887_read(5);
}
//显示星期
void show_week()
{
switch(week)
{
case 1:write1602com(0x80+11);
write1602data(’M');
write1602data('O');
write1602data('N’);
break;
case 2:write1602com(0x80+11);
write1602data(’T');
write1602data(’U');
write1602data('S’);
break;
case 3:write1602com(0x80+11);
write1602data(’W’);
write1602data(’E’);
write1602data('N');
break;
case 4:write1602com(0x80+11);
write1602data('T’);
write1602data(’H’);
write1602data('U');
break;
case 5:write1602com(0x80+11);
write1602data(’F');
write1602data('R');
write1602data(’I');
break;
case 6:write1602com(0x80+11);
write1602data(’S’);
write1602data(’A’);
write1602data('T’);
break;
case 7:write1602com(0x80+11);
write1602data('S');
write1602data('U’);
write1602data(’N');
break;
}
}本文为互联网收集,请勿用作商业用途文档为个人收集整理,来源于网络
//清除设置星期时的数字型显示
void clearnumofweek()
{
write1602com(0x80+14);
write1602data(’ ’);
write1602data(' ');
}
//按键扫描
void keyscan()
{
if(flag_di==0)
{
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
delay(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!(s1&&s2&&s3&&s4));
didi();
flag_di=1;
}
}
// flag_di=1;
}
if(s1==0)
{
delay(10);
if(s1==0)
{
s1num++;
if(flag1==1)
{
if(s1num==4)
{
s1num=1;
// write1602com(0x80+0x40+7);
// write1602com(0x0f);
}
}
// s1num++;
flag=1;
while(!s1);beep=0;delay(50);beep=1;
switch(s1num)
{
case 1:write1602com(0x80+0x40+7);
write1602com(0x0f);
break;
case 2:write1602com(0x80+0x40+4);
write1602com(0x0f);
break;
case 3:write1602com(0x80+0x40+1);
write1602com(0x0f);
break;
case 4:write1602com(0x80+15);
write1602com(0x0f);
break;
case 5:write1602com(0x80+9);
write1602com(0x0f);
break;
case 6:write1602com(0x80+6);
write1602com(0x0f);
break;
case 7:write1602com(0x80+3);
write1602com(0x0f);
break;
case 8:ds12887_write(0x00,miao); //second
ds12887_write(0x02,fen); //minute
ds12887_write(0x04,shi); //hour
ds12887_write(0x06,week); //day
ds12887_write(0x07,ri); //date
ds12887_write(0x08,yue); //month
ds12887_write(0x09,nian); //year
// delay(100);
flag=0;
s1num=0;
break;
}
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);beep=0;delay(50);beep=1;
switch(s1num)
{
case 1:miao++;
if(miao==60)
miao=0;
lcd_sfm(6,miao);
write1602com(0x80+0x40+7);
break;
case 2:fen++;
if(fen==60)
fen=0;
lcd_sfm(3,fen);
write1602com(0x80+0x40+4);
break;
case 3:shi++;
if(shi==24)
shi=0;
lcd_sfm(0,shi);
write1602com(0x80+0x40+1);
break;
case 4:week++;
if(week==8)
week=1;
lcd_nyr(14,week);
write1602com(0x80+15);
break;
case 5:ri++;
if(ri==32)
ri=1;
lcd_nyr(8,ri);
write1602com(0x80+9);
break;
case 6:yue++;
if(yue==13)
yue=1;
lcd_nyr(5,yue);
write1602com(0x80+6);
break;
case 7:nian++;
if(nian==100)
nian=0;
lcd_nyr(2,nian);
write1602com(0x80+3);
break;
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);beep=0;delay(50);beep=1;
switch(s1num)
{
case 1:miao--;
if(miao==-1)
miao=59;
lcd_sfm(6,miao);
write1602com(0x80+0x40+7);
break;
case 2:fen--;
if(fen==-1)
fen=59;
lcd_sfm(3,fen);
write1602com(0x80+0x40+4);
break;
case 3:shi--;
if(shi==—1)
shi=23;
lcd_sfm(0,shi);
write1602com(0x80+0x40+1);
break;
case 4:week——;
if(week==0)
week=7;
lcd_nyr(14,week);
write1602com(0x80+15);
break;
case 5:ri--;
if(ri==0)
ri=31;
lcd_nyr(8,ri);
write1602com(0x80+9);
break;
case 6:yue——;
if(yue==0)
yue=12;
lcd_nyr(5,yue);
write1602com(0x80+6);
break;
case 7:nian——;
if(nian==-1)
nian=99;
lcd_nyr(2,nian);
write1602com(0x80+3);
break;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
// while(!s4);beep=0;delay(50);beep=1;
num++;
while(!s4);beep=0;delay(50);beep=1;
// flag1=1;
// flag1=~flag1;
if(num==1)
// if(flag1==1) //设置闹钟
{
flag1=1;
write1602com(0x80+0x40+7);
write1602com(0x0f);
read_alarm();
miao=amiao;
fen=afen;
shi=ashi;
write1602com(0x80+0x40+9);
write1602data('D’);
write1602data(’i');
// write1602com(0x80+0x40+7);
// write1602com(0x0f);
lcd_sfm(0,ashi);
lcd_sfm(3,afen);
lcd_sfm(6,amiao);
}
// else //退出闹钟设置,并把设置的时间输入进DS12C887中 本文为互联网收集,请勿用作商业用途个人收集整理,勿做商业用途
if(num==2)
{
// delay(50);
num=0;
s1num=0;
write1602com(0x80+0x40+9);
write1602data(' ’);
write1602data(' ');
// write1602com(0x0c);
// ds12887_write(1,miao);
// ds12887_write(3,fen);
// ds12887_write(5,shi);
set_alarm(shi,fen,miao);
flag1=0;
flag=0;
}
}
}
}
}
void main()
{
/*
uchar i;
init_1602();
for(i=0;i〈9;i++)
{
write1602data(table0[i]);
delay(5);
}
delay(10);
write1602com(0x80+0x40);
for(i=0;i<8;i++)
{
write1602data(table1[i]);
delay(5);
}
while(1);
*/
init_1602();
lcd1602showsign();
init_ds12887();
while(1)
{
keyscan();
if(flag_di==0)
{
// delay(100);
didi();
// delay(200);
// flag_di=1;
}
// delay(10);
if((flag==0)&&(flag1==0))
{
keyscan();
// delay(10);
shi=ds12887_read(0x04);
fen=ds12887_read(0x02);
miao=ds12887_read(0x00);
nian=ds12887_read(0x09);
yue =ds12887_read(0x08);
ri =ds12887_read(0x07);
week=ds12887_read(0x06);
lcd_sfm(0,shi);
lcd_sfm(3,fen);
lcd_sfm(6,miao);
lcd_nyr(2,nian);
lcd_nyr(5,yue);
lcd_nyr(8,ri);
// lcd_nyr(14,week);
show_week();
clearnumofweek();
}
}
}
void exter0() interrupt 0
{
uchar c;
flag_di=0;
c=ds12887_read(0x0c);
}
展开阅读全文