电子时钟基于AT89c51单片机设计电路图和程序文件.docx
《电子时钟基于AT89c51单片机设计电路图和程序文件.docx》由会员分享,可在线阅读,更多相关《电子时钟基于AT89c51单片机设计电路图和程序文件.docx(13页珍藏版)》请在冰豆网上搜索。
电子时钟基于AT89c51单片机设计电路图和程序文件
电子时钟基于AT89c51单片机的设计
电子时钟原理图
开机显示仿真图:
当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:
12:
00:
04。
电子时钟调时间仿真图:
当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。
当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。
当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。
当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。
电子时钟闹钟调节仿真:
当按下K3为1次时,直接跳到闹钟显示界面00:
00:
00,按下K2可以对闹钟的秒进行调节。
当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。
当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。
当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。
#include
#defineucharunsignedchar//预定义一下
#defineuintunsignedint
uchartable[]="JD12102Class--21";//显示内容
sbitlcden=P3^4;//寄存器EN片选引脚
sbitlcdrs=P3^5;//寄存器RS选择引脚
sbitbeep=P3^6;//接蜂鸣器
externvoidkey1();
externvoidkey2();
externvoidkey3();
ucharnum,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3;//定义变量
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;//送出指令,写指令时序
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;//送出数据,写指令程序
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_add(ucharadd,uchardate)
{
ucharaa,bb;
aa=date/10;
bb=date%10;
write_com(0x80+add);
write_data(0x30+aa);
write_data(0x30+bb);
}
voidinit()//初始化
{lcden=0;
write_com(0x38);//设置16*2显示,5*7点阵
write_com(0x0c);//开显示,不显示光标
write_com(0x06);//地址加1,写入数据是光标右移1位
write_com(0x01);//清屏
write_com(0x80);//起点为第一行第一个字符开始
}
voiddisplay(ucharh,ucharm,uchars)//显示设计程序
{{
write_com(0x80+0x16);}
{write_com(0xC0+0x00);
write_data('T');
write_data('I');
write_data('M');
write_data('E');
write_data(':
');
write_data(0x30+(h/10));
write_data(0x30+(h%10));
write_data(':
');
write_data(0x30+(m/10));
write_data(0x30+(m%10));
write_data(':
');
write_data(0x30+(s/10));
write_data(0x30+(s%10));
write_data('');
write_data('');
write_data('');
}}
voidmain()
{init();
TMOD=0X01;//设置T0定时方式1
TH0=(65535-50000)/256;//设置初值
TL0=(65535-50000)%256;
EA=1;//开总中断
TR0=1;//启动T0
ET0=1;
for(num=0;num<16;num++)//依次读出数据
{
write_data(table[num]);
}
while
(1)
{
key1();
key2();
key3();
if(ahour==hour&&aminite==minite&&second<10)//时间到闹钟响
{
beep=~beep;
}
if(F_k1==0&F_k3==0)//K1和K3按下次数为零就直接显示时分秒
display(hour,minite,second);
}
}
voidtimer0()interrupt1//T0中断函数
{
TH0=(65535-50000)/256;//装载计数器初值
TL0=(65535-50000)%256;
a++;
if(a==20)
{//进位设置60秒进1分,60分进1时,24时进0时
a=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
#include//调时间程序
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P1^0;//定义3个变量
sbitk2=P1^1;
sbitk3=P1^2;
externucharF_k1,F_k3,second,minite,hour,ahour,aminite,asecond;//预定义变量
externvoidwrite_com(ucharcom);
externvoidwrite_add(ucharadd,uchardate);
externvoiddisplay(ucharh,ucharm,uchars);
voiddelay_key(inti)
{while(i--);}
voidkey1()
{
if(k1==0)//按下K1零次时,直接计时与开机显示
{
delay_key(100);
if(k1==0)
{
TR0=0;
while(!
k1);
F_k1++;
if(F_k1==4)
{
F_k1=0;
write_com(0x0c);
TR0=1;
}
}
}
if(F_k1==1|F_k3==1)
{
write_com(0xC0+0x0c);
write_com(0x0f);
}
if(F_k1==2|F_k3==2)
write_com(0xC0+0x09);
if(F_k1==3|F_k3==3)
write_com(0xC0+0x06);
}
voidkey2()
{
if(k2==0)
{
delay_key(100);
{
while(!
k2);
if(F_k1==1)//按下K1一次时设置闹钟的秒
{
second++;
if(second==60)
second=0;
write_add(0x4b,second);
}
if(F_k1==2)//按下K3两次时设置闹钟的分
{
minite++;
if(minite==60)
minite=0;
write_add(0x48,minite);
}
if(F_k1==3)//按下K1三次时设置闹钟的时
{
hour++;
if(hour==24)
hour=0;
write_add(0x45,hour);
}
if(F_k3==1)//按下K3一次时设置闹钟的秒
{
asecond++;
if(asecond==60)
asecond=0;
write_add(0x4b,asecond);
}
if(F_k3==2)//按下K3两次时设置闹钟的分
{
aminite++;
if(aminite==60)
aminite=0;
write_add(0x48,aminite);
}
if(F_k3==3)//按下K3三次时设置闹钟的时
{
ahour++;
if(ahour==24)
ahour=0;
write_add(0x45,ahour);
}
}
}
}
voidkey3()
{
if(k3==0)
{
delay_key(100);
if(k3==0)
{
while(!
k3);
F_k3++;
if(F_k3==4)//K3等于四次时直接跳入闹钟显示
{
F_k3=0;
write_com(0x0c);
}
if(F_k3==1)
display(ahour,aminite,asecond);
}
}
}