电子时钟基于AT89c51单片机设计电路图及程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子时钟基于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
#define uchar unsigned char //预定义一下
#define uint unsigned int
uchar table[]="JD12102Class--21"; //显示内容
sbit lcden=P3^4; //寄存器EN片选引脚
sbit lcdrs=P3^5; //寄存器RS选择引脚
sbit beep=P3^6; //接蜂鸣器
extern void key1();
extern void key2();
extern void key3();
uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com; //送出指令,写指令时序
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date; //送出数据,写指令程序
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_add(uchar add,uchar date)
{
uchar aa,bb;
aa=date/10;
bb=date%10;
write_com(0x80+add);
write_data(0x30+aa);
write_data(0x30+bb);
}
void init() //初始化
{lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵
write_com(0x0c); //开显示,不显示光标
write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏
write_com(0x80); //起点为第一行第一个字符开始
}
void display(uchar h,uchar m,uchar s) //显示设计程序
{{
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(' ');
} }
void main()
{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);
}
}
void timer0() interrupt 1 //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