基于51单片机的电子时钟
立即下载
资源介绍:
基于51单片机设计一个电子时钟是一个常见的学习项目,可以帮助你了解单片机的基本操作以及如何与外部设备进行交互。
软件实现:
初始化:设置定时器/计数器模式,通常使用定时中断来实现秒的计数。
显示时间:编写函数来更新LCD上的时间显示。
用户输入处理:编写代码来响应按钮按下事件,允许用户设置时间或切换显示模式。
时间计算:使用定时器中断来增加时间值,并且要考虑到进位问题(例如秒到分钟、分钟到小时等)。
#include "reg52.h"
#include "lcd.h"
sbit set_but_s=P3^1;
sbit set_but_m=P3^0;
sbit set_but_h=P3^2;
sbit set_but_Zero=P3^3;
sbit led=P2^0;
sbit beep_l=P1^0;
unsigned int time_ms,time_s=6,time_m=6,time_h=6,time_ms_1;
unsigned int set_time_ms,set_time_s,set_time_m,set_time_h,set,beepa;
void lcd_display();
void delay_us(unsigned long us) //延时子程序 us
{
while(us--);
}
void Init() //中断初始化
{
TMOD=0X11;
TH0=0XEE; //5ms中断一次
TL0=0X00;
TH1=0XEE; //5ms中断一次
TL1=0X00;
EA=1;//全开 =0关中断
ET0=1;
TR0=1;
ET1=1;
TR1=1;
}
void time_s_m_h() //时分秒计算
{
if(time_s>=60) //秒
{
time_s=0;
time_m=time_m+1;
}
else if(time_m>=60) //分
{
time_m=0;
time_h=time_h+1;
}
else if(time_h>=24) //时
{
time_h=0;
}
}
void set_time() //设置时间子程序
{
if(set==1)
{
if(set_but_s==0) //设置秒
{
delay_us(2);
if(set_but_s==0)
{
time_s=time_s+1;
if(time_s>=60)
{
time_s=0;
}
while(set_but_s==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
else if(set_but_m==0) //设置分
{
delay_us(2);
if(set_but_m==0)
{
time_m=time_m+1;
if(time_m>=60)
{
time_m=0;
}
while(set_but_m==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
else if(set_but_h==0) //设置时
{
delay_us(2);
if(set_but_h==0)
{
time_h=time_h+1;
if(time_h>=24)
{
time_h=0;
}
while(set_but_h==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
}
else if(set==2)
{
if(set_but_s==0) //设置秒
{
delay_us(2);
if(set_but_s==0)
{
set_time_s=set_time_s+1;
if(set_time_s>=60)
{
set_time_s=0;
}
while(set_but_s==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
else if(set_but_m==0) //设置分
{
delay_us(2);
if(set_but_m==0)
{
set_time_m=set_time_m+1;
if(set_time_m>=60)
{
set_time_m=0;
}
while(set_but_m==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
else if(set_but_h==0) //设置时
{
delay_us(2);
if(set_but_h==0)
{
set_time_h=set_time_h+1;
if(set_time_h>=24)
{
set_time_h=0;
}
while(set_but_h==0)
{
lcd_display();
if(time_ms>=200)
{
break;
}
}
}
}
}
}
void lcd_display() //时间显示
{
LCD_Write_Char(0,0,set%10+'0');
LCD_Write_String(1,0,"--:");
LCD_Write_Char(4,0,time_h/10+'0');
LCD_Write_Char(5,0,time_h%10+'0');
LCD_Write_String(6,0,":");
LCD_Write_Char(7,0,time_m/10+'0');
LCD_Write_Char(8,0,time_m%10+'0');
LCD_Write_String(9,0,":");
LCD_Write_Char(10,0,time_s/10+'0');
LCD_Write_Char(11,0,time_s%10+'0');
LCD_Write_String(0,1,"set:");
LCD_Write_Char(4,1,set_time_h/10+'0');
LCD_Write_Char(5,1,set_time_h%10+'0');
LCD_Write_String(6,1,":");
LCD_Write_Char(7,1,set_time_m/10+'0');
LCD_Write_Char(8,1,set_time_m%10+'0');
LCD_Write_String(9,1,":");
LCD_Write_Char(10,1,set_time_s/10+'0');
LCD_Write_Char(11,1,set_time_s%10+'0');
}
void beep_led()
{
if(set_time_s==time_s&&set_time_m==time_m&&set_time_h==time_h)
{
beepa=1;
led=0;
beep_l=1;
}
else if(beepa==1)
{
beep_l=1;
if(time_ms<=100)
{
led=0;
}
else if(time_ms>=100&&time_ms<=200)
{
led=1;
}
}
else if(beepa==0)
{
beep_l=0;
led=1;
}
}
void qingling()
{
if(set_but_Zero==0)
{
delay_us(10);
if(set_but_Zero==0)
{
if(time_ms_1>=100)
{
set=set+1;
time_ms_1=0;
if(set>=3)
{
set=0;
}
}
if(time_ms_1<=100&&beepa==1)
{
beepa=0;
set_time_s=set_time_m=set_time_h=0;
}
}
}
else if (set==0||set==2)
{
TR1=1;
}
else if (set==1)
{
TR1=0;
}
}
void main()
{
LCD_Init(); //显示器初始化
LCD_Clear();//清屏
Init();
while(1)
{
lcd_display();
set_time();
beep_led();
qingling();
}
}
void Time_Delay1_1ms() interrupt 1 //定时器 50ms
{
TH0=0XEE; //5ms中断一次
TL0=0X00;
if(set_but_Zero==0)
{
time_ms_1++;
}
else if(set_but_Zero==1)
{
time_ms_1=0;
}
else if(beepa==1)
{
beep_l=~beep_l;
}
}
void Time_Delay_5ms() interrupt 3 //定时器 50ms
{
TH1=0XEE; //5ms中断一次
TL1=0X00;
time_ms++; //5ms累计一次
if(time_ms>=200)
{
time_ms=0;
time_s=time_s+1;
time_s_m_h();
}
}