电子时钟基于AT89c51单片机设计电路图及程序

发布时间:2020-06-10 04:10:18

电子时钟基于AT89c51单片机的设计

电子时钟原理图

开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:1200:04

电子时钟调时间仿真图:当按下K11次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。

当按下K12次时,光标直接跳到电子时钟的分,可以按下K2进行调节。

当按下K13次时,光标直接跳到电子时钟的时,可以按下K2进行调节。

当按下K14次时,光标直接跳完,电子时钟可以进行正常计时。

电子时钟闹钟调节仿真:当按下K31次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。

当按下K32次时,可以调到分,按下K2可以对闹钟的分进行调节。

当按下K33次时,可以调到时,按下K2可以对闹钟的时进行调节。

当按下K34次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。

#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) //K1K3按下次数为零就直接显示时分秒

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 //调时间程序

#define uchar unsigned char

#define uint unsigned int

sbit k1=P1^0; //定义3个变量

sbit k2=P1^1;

sbit k3=P1^2;

extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量

extern void write_com(uchar com);

extern void write_add(uchar add,uchar date);

extern void display(uchar h,uchar m,uchar s);

void delay_key(int i)

{while(i--);}

void key1()

{

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);

}

void key2()

{

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);

}

}

}

}

void key3()

{

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);

}

}

}

电子时钟基于AT89c51单片机设计电路图及程序

相关推荐