Pl3
FD1-
PM
P(M-
Pl*
POS-
P't
PM-
Fl?
FOT-
mt
咖・
LKTO
¥2i-
T】F""
709031胃;;
H/w
賂卜
l丄
PH
12
Y2?
fttsrr
UD
r>
T1D
PSEli
22
)9
4
AH:
畑
■h:
~r
ne_
MC
1;r
13s
nUJ
ADJ
tr]x
NCiflQ
TJ"
1!
AU®
ADJ
構os.
T3T
CTORC
2L,pis.
DS12C3&7
14
⑴以STC89C52为核心制作出单片机最小系统。
⑵1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,符合本作品需要。
⑶DS12C887具有闹铃以及外部掉电自身继续走时功能,为理想的时钟芯片。
⑷选择蜂鸣器,通过用三极管对其放大,实现所想要的功能。
⑸选择RS232,使得计算机的9.6V的电压能够与该系统5V得以匹配,与此同时也实现了我们直接用电脑直接对其系统直接拷贝程序。
三程序流程说明
初始化
按键检查
从DS12C887读取数据
液晶显示数据
图主程序流程图
附件1
#include
#defineucharunsignedchar#defineuintunsignedintsbitrs=P3八5;
sbitIcden=P3A4;
sbits仁P3A6;〃功能键
sbits2=P3A1;//增大键
sbits3=P3A2;//减小键
sbitbeep二P2A3;〃蜂鸣器
sbitdscs=P1A4;
sbitdsas=P1A5;
sbitdsrw=P1A6;
sbitdsds=P1A7;
sbitdsirq二卩3八3;
ucharcount,s1num,flag;
bitflag1;
charmiao,shi,fen,nian,yue,ri,week;
液晶固定显示
ucharcodetable[]="20--”;〃
ucharcodetable1[]=":
:
";
ucharcodetable2[]="Helloeveryone!
";
ucharcodetable3[]="Nicetomeetyou!
";voidwrite_ds(uchar,uchar);
voidset_alarm(uchar,uchar,uchar);ucharread_ds(uchar);voidset_time();
ucharamiao,ashi,afen;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x二z;x>0;x--)
for(y=110;y>0;y--);
}
voiddi()//按键时蜂鸣器发音
{
beep=0;
delay(IOO);
beep=1;
}
voiddidi()//闹钟时蜂鸣器发音
{
beep=0;
delay(50);
beep=1;
delay(IOO);
beep=0;
delay(50);
beep=1;
voidwrite_com(ucharcom)//写液晶命令函数
{
rs=0;
leden=0;
P0=com;
delay(5);
Icden=1;
delay(5);
Icden=0;
}
voidwrite_date(uchardate)//写液晶具体数据函数
{
rs=1;
Icden=0;
PO二date;
delay(5);
Icden=1;
delay(5);
lcden=0;
{
ucharnum;
EA=1;〃打开总中断
EX1=1;〃开外部中断1
IT1=1;〃设置负跳变沿触发方式
lcden=0;
week=1;
//set_time();〃给DS12C887设置时间函数
set_alarm(2,2,10);〃设置闹铃函数
write_ds(0x0B,0x26);〃设置DS12C88724小时模式write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;num++)〃写入液晶平移内容
{
write_date(table2[num]);
delay(5);
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_date(table3[num]);
delay(5);
}
write_com(0x80+0x10);〃写入液晶固定内容
for(num=0;num<16;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x50);
for(num=0;num<16;num++)
{
write_date(table1[num]);
delay(5);
}
}
voidwrite_sfm(ucharadd,uchardate)//在液晶上写入时分秒
{
ucharshi,ge;
shi二date/10;
ge=date%10;
write_com(0x80+0x50+add);
write_date(0x30+shi);
write_date(0x30+ge);
在液晶上写入年月日
}
voidwrite_sfm1(ucharadd,uchardate)//
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x10+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_week(ucharwe)//星期函数
{
write_com(0x80+0x10+13);
switch(we)
case1:
write_date('M');delay(5);
write_date('0');delay(5);write_date('N');
break;
case2:
write_date('T');delay(5);write_date('U');delay(5);write_date('E');
break;
case3:
write_date('W');delay(5);write_date('E');delay(5);write_date('D');
break;
case4:
write_date('T');delay(5);write_date('H');delay(5);write_date('U');
break;
case5:
write_date('F');delay(5);
write_date('R');delay(5);
write_date(T);
break;
case6:
write_date('S');delay(5);
write_date('A');delay(5);
write_date(T);
break;
case7:
write_date('S');delay(5);
write_date('U');delay(5);
write_date('N');
break;
}
}
voidkeyscan()
{
if(flag仁=1)//闹铃响
{
if(s2==0)
delay(5);
if(s2==0)
中断闹铃
中断闹铃
{while(!
s2);
di();
flag仁0;//
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
di();
flag仁0;//
}
}
}
if(s1==0)
delay(5);
if(s仁=0)
{slnum++;flag=1;flag1=0;while(!
s1);
di();
if(s1num==1)
{
write_com(0x80+0x50+10);
write_com(0x0f);〃光标停止位置不断闪烁
if(s1num==2)
{
write_com(0x80+0x50+7);
}
if(s1num==3)
{
write_com(0x80+0x10+13);
}
if(s1num==5)
{
write_com(0x80+0x10+10);
}
if(s1num==6)
{
write_com(0x80+0x10+7);
}
if(s1num==7)
{
write_com(0x80+0x10+4);
}
if(s1num==8)
{
s1num=0;
write_com(OxOc);〃光标停止闪烁
write_ds(2,fen);
write_ds(4,shi);write_ds(6,week);write_ds(7,ri);write_ds(8,yue);write_ds(9,nian);flag=O;
}
}
}
if(s1num!
=O)
{
if(s2==0)
{
delay
(1);
if(s2==0)
{
while(!
s2);
di();
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);〃将变化后的时间写入液晶
write_com(0x80+0x50+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x50+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_com(0x80+0x50+4);
}
{
week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+0x10+13);
}
if(s1num==5)
{
ri++;
if(ri==32)
ri=1;
write_sfm1(10,ri);
write_com(0x80+0x10+10);
}
if(s1num==6)
yue++;
yue=1;
write_sfm1(7,yue);
write_com(0x80+0x10+7);
}
if(s1num==7)
{
nian++;
if(nian==100)
nian=0;
write_sfm1(4,nian);
write_com(0x80+0x10+4);
}
}
}
if(s3==0)
{
delay
(1);
if(s3==0)
di();
if(s1num==1)
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);write_com(0x80+0x50+10);
}
if(s1num==2)
{
fen--;
if(fen二=-1)
fen二59;
write_sfm(7,fen);
write_com(0x80+0x50+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_com(0x80+0x50+4);
}
if(s1num==4)
{
week--;
if(week==O)
week=7;
write_week(week);
write_com(0x80+0x10+13);
}
if(s1num==5)
{
ri--;
if(ri==0)
ri=31;
write_sfm1(10,ri);write_com(0x80+0x10+10);
}
if(s1num==6)
yue--;
yue=12;
write_sfm1(7,yue);
write_com(0x80+0x10+7);
}
if(s1num==7)
{
nian--;
if(nian二=-1)
yue=99;
write_sfm1(4,nian);write_com(0x80+0x10+4);
}
}
}
}
}
写入程序函数
voidwrite_ds(ucharadd,uchardate)//DS12C887{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0二add;
dsas=O;
dsrw=0;
PO二date;
dsrw=1;
dsas=1;
dscs=1;
从DS12C88冲读取数据
}
ucharread_ds(ucharadd)//
{
uchards_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=O;
PO=add;
dsas=O;
dsds=O;
PO=Oxff;
ds_date=PO;
dsds=1;
dsas=1;
dscs=1;
returnds_date;
}
voidset_time()〃设置时间
{
write_ds(4,1);
write_ds(2,2);
write_ds(6,3);
write_ds(7,4);
write_ds(8,5);
write_ds(9,6);
设置闹铃
}
voidset_alarm(ucharashi,ucharafen,ucharamiao)//
{
write_ds(1,amiao);
write_ds(3,afen);
write_ds(5,ashi);
voidmain()
{
ucharnum,bo=0;
init();delay(4000);
for(num=0;num<16;num++)
{
{
平移函数
write_com(0x18);//1602
delay(600);
}
keyscan();〃按键检测
if(flag1==1)
didi();
if(flag==0)
miao=read_ds(0);//平移时从时钟芯片中读取时间
fen二read_ds
(2);
shi二read_ds(4);
week二read_ds(6);
ri=read_ds(7);
yue=read_ds(8);
nian二read_ds(9);
write_sfm(10,miao);〃平移时将读取的时间写到液晶
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_sfm1(10,ri);
write_sfm1(7,yue);
write_sfm1(4,nian);
}
}
while
(1)
{
keyscan();
if(flag1==1)
didi();
读取数据
写入数据
if(flag==O)
{
miao二read_ds(O);〃fen二read_ds
(2);shi=read_ds(4);
week二read_ds(6);ri=read_ds(7);
yue=read_ds(8);nian二read_ds(9);
write_sfm(10,miao);〃write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_sfm1(10,ri);
write_sfm1(7,yue);write_sfm1(4,nian);
}
}
voidexter()interrupt2{ucharc;
flag仁1;c=read_ds(0x0c);
}