功能最全的电子钟
【单片机】c51数字时钟(带年月日显
示)
摘要:本设计以单片机为核心,lcd1602显示。采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能
主程序:
/**************************************************************************************** **********
***************************************************************************************** **********
********************** lcd1602电子钟***************************************************
***************************************************************************************** **********
***************************************************************************************** **********/
# include
# include "lcd16024.h"
sbit key1 = P2^0; //调整
sbit key2 = P2^1; //加1
sbit key3 = P2^2; //减1
sbit speaker = P2^3; //蜂鸣器
sbit key4 = P2^4; //闹钟设计
bit cal_year = 1; //进入判断闰年标志位bit leap_year; //闰年标志位
bit calculate = 0; //日加一标记
bit run = 0; //闹钟标志
bit beep = 0; //整点报时标志//uint8 num = 0; //调整是给的脉冲uint8 code str1[] = "D: ";
uint8 code str2[] = "T: ";
uint8 code str3[] = "Wek";
uint8 daystr[]="2013-07-29 "; //年月日格式uint8 timestr[]="21:30:59 N"; //时分秒格式
uint8 daystr1[]="2013-07-29 "; //闹钟年月日格式uint8 timestr1[]="21:30:59 N"; //闹钟时分秒格式uint8 numweek = 0; //星期加1标记char week = 1; //星期
char sec = 53; //秒
char min = 50; //分
char hour = 23; //时
uint8 day = 30; // 日
uint8 month = 9; //月
uint16 year = 2013; //年
char week1 = 1; //闹钟星期
char sec1 = 58; //闹钟秒
char min1 = 50; //闹钟分
char hour1 = 23; //闹钟时uint8 day1 = 30; //闹钟日
uint8 month1 = 9; //闹钟月
uint16 year1 = 2013; //闹钟年
uint8 WeekData1; //闹钟星期标记uint8 number = 0; //定时
uint8 WeekData; //星期标记uint8 speaker_num; //整点报时次数
uint8 scan_key(void); //函数声名
/************************************************************************************* ********************** 更新LCD时间分离读取************************************
**************************************************************************************/ void TimeChange()
{
//时分秒
timestr[7] = sec%10+'0';
timestr[6] = sec/10+'0';
timestr[4] = min%10+'0';
timestr[3] = min/10+'0';
timestr[1] = hour%10+'0';
timestr[0] = hour/10+'0';
//年月日
daystr[9] = day%10+'0';
daystr[8] = day/10+'0';
daystr[6] = month%10+'0';
daystr[5] = month/10+'0';
daystr[3] = year%10+'0';
daystr[2] = year/10%10+'0';
daystr[1] = year/100%10+'0';
daystr[0] = year/1000+'0';
//星期
WeekData = week+'0';
}
/************************************************************************************* ********************** 闹钟更新LCD时间分离读取************************************
**************************************************************************************/ void TimeChange1()
{
//时分秒
timestr1[7] = sec1%10+'0';
timestr1[6] = sec1/10+'0';
timestr1[4] = min1%10+'0';
timestr1[3] = min1/10+'0';
timestr1[1] = hour1%10+'0';
timestr1[0] = hour1/10+'0';
//年月日
daystr1[9] = day1%10+'0';
daystr1[8] = day1/10+'0';
daystr1[6] = month1%10+'0';
daystr1[5] = month1/10+'0';
daystr1[3] = year1%10+'0';
daystr1[2] = year1/10%10+'0';
daystr1[1] = year1/100%10+'0';
daystr1[0] = year1/1000+'0';
//星期
WeekData1 = week1+'0';
}
/*************************************************************************************
********************** 初始化系统定时器0 ************************************
**************************************************************************************/ void systimer0_init(void)
{
TMOD |=0x01;//设置为1时用或(|)
TMOD &=0xfd;//设置为0时用与(&)
TH0 = 0xDC; // 定时10ms
TL0 = 0x00;
EA = 1;
ET0=1;
TR0=1;
EX0 = 1;
}
/*************************************************************************************
********************** 闹钟时间设置********************************
**************************************************************************************/ void naozhong()
{
uint8 number = 1;
uint8 a = 0;
uint8 b = 0;
if(0 == key4)
{
Delay1Ms(5);
if(0 == key4)
{
a = 1;
LCD_write_command(0xc0+9);
LCD_write_command(0x0f);
}
while(!key4);
}
while(a)
{
if(0 == key4)
{
Delay1Ms(5);
if(0 == key4)
{
a = 0;
run = ~run;
while(!key4);
}
}
if(run)
{
timestr[9] = 'Y';
}
else
{
timestr[9] = 'N';
}
if(0 == key1)
{
Delay1Ms(5);
if(0 == key1)
{
b = 1;
}
while(!key1);
}
while(b)
{
if(0 == key1)
{
Delay1Ms(5);
if(0 == key1)
{
number++;
if(4 == number)
{
b = 0;
}
while(!key1);
if(number == 1)
{
LCD_write_command(0xc0+9);
LCD_write_command(0x0f);
}
if(number == 2)
{
LCD_write_command(0xc0+6);
LCD_write_command(0x0f);
}
if(number == 3)
{
LCD_write_command(0xc0+3);
LCD_write_command(0x0f);
}
}
}
switch(number)
{
case 1:
if(0 == key2) //闹钟秒加1的设置
{
Delay1Ms(5);
if(0 == key2)
{
sec1++;
if(60 == sec1)
{
sec1 = 0;
}
while(!key2);
timestr1[7] = sec1%10+'0';
timestr1[6] = sec1/10+'0';
LCD_write_char(8,1,timestr1[6]);
LCD_write_char(9,1,timestr1[7]);
LCD_write_command(0xc0+9);
}
}
if(0 == key3) //闹钟秒减1的设置
{