文档视界 最新最全的文档下载
当前位置:文档视界 › 基于c51功能最全的电子钟程序lcd1602

基于c51功能最全的电子钟程序lcd1602

基于c51功能最全的电子钟程序lcd1602
基于c51功能最全的电子钟程序lcd1602

功能最全的电子钟

【单片机】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的设置

{

相关文档