编写使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。 定时闹钟的基本功能如下: 显示格式为“时时:分分”。 由LED闪动来做秒计数表示。 一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1~K4动作如下: (1) K1—设置现在的时间。 (2) K2—显示闹钟设置的时间。 (3) K3—设置闹铃的时间。 (4) K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。 设置当前时间或闹铃时间如下。 (1) K1—时调整。 (2) K2—分调整。(3) K3—设置完成。 (4) K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。
时间: 2024-02-23 20:58:20 浏览: 105
设计一个以AT89C51为核心的电子钟。可以实现时间显示和设置闹钟功能
4星 · 用户满意度95%
以下是一个基本的AT89C51单片机结合字符型LCD显示器设计的定时闹钟LCD时钟的程序,仅供参考:
```c
#include <reg51.h>
#include <stdio.h>
#define LCD_DATA P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit BELL=P1^0;
sbit RELAY=P1^1;
sbit LED=P1^2;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
unsigned char hour=0,minute=0,alarm_hour=0,alarm_minute=0;
unsigned char mode=0,state=0;
unsigned char time_buf[16];
void delayms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++);
}
void init_lcd()
{
delayms(15);
LCD_DATA=0x30;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x30;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x30;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x38;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x08;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x01;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x06;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
LCD_DATA=0x0C;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_DATA=cmd;
RS=0;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
}
void lcd_write_data(unsigned char dat)
{
LCD_DATA=dat;
RS=1;
RW=0;
EN=1;
delayms(5);
EN=0;
delayms(5);
}
void lcd_write_string(unsigned char *str)
{
while(*str!='\0')
{
lcd_write_data(*str);
str++;
}
}
void lcd_clear_screen()
{
lcd_write_cmd(0x01);
}
void lcd_set_cursor(unsigned char x,unsigned char y)
{
if(y==0)
lcd_write_cmd(0x80+x);
else
lcd_write_cmd(0xC0+x);
}
void show_time()
{
sprintf(time_buf,"%02d:%02d",hour,minute);
lcd_set_cursor(0,0);
lcd_write_string(time_buf);
lcd_set_cursor(0,1);
lcd_write_string(" ");
if(mode==2)
{
sprintf(time_buf,"%02d:%02d",alarm_hour,alarm_minute);
lcd_set_cursor(0,1);
lcd_write_string(time_buf);
}
}
void set_time()
{
state=0;
while(state==0)
{
lcd_set_cursor(0,1);
lcd_write_string("Set Time: ");
sprintf(time_buf,"%02d:%02d",hour,minute);
lcd_set_cursor(0,0);
lcd_write_string(time_buf);
if(K1==0)
{
while(K1==0);
hour++;
if(hour>=24)
hour=0;
}
if(K2==0)
{
while(K2==0);
minute++;
if(minute>=60)
minute=0;
}
if(K3==0)
{
while(K3==0);
state=1;
}
}
}
void show_alarm_time()
{
lcd_set_cursor(0,1);
lcd_write_string("Alarm Time: ");
sprintf(time_buf,"%02d:%02d",alarm_hour,alarm_minute);
lcd_set_cursor(0,1);
lcd_write_string(time_buf);
}
void set_alarm_time()
{
state=0;
while(state==0)
{
lcd_set_cursor(0,1);
lcd_write_string("Set Alarm Time: ");
sprintf(time_buf,"%02d:%02d",alarm_hour,alarm_minute);
lcd_set_cursor(0,0);
lcd_write_string(time_buf);
if(K1==0)
{
while(K1==0);
alarm_hour++;
if(alarm_hour>=24)
alarm_hour=0;
}
if(K2==0)
{
while(K2==0);
alarm_minute++;
if(alarm_minute>=60)
alarm_minute=0;
}
if(K3==0)
{
while(K3==0);
state=1;
}
}
}
void bell_on()
{
BELL=0;
delayms(100);
BELL=1;
}
void main()
{
init_lcd();
lcd_clear_screen();
lcd_set_cursor(0,0);
lcd_write_string("00:00");
LED=1;
while(1)
{
if(K1==0)
{
while(K1==0);
set_time();
}
if(K2==0)
{
while(K2==0);
mode=1;
show_time();
}
if(K3==0)
{
while(K3==0);
mode=2;
set_alarm_time();
show_time();
show_alarm_time();
}
if(K4==0)
{
while(K4==0);
if(mode==2)
{
mode=0;
lcd_set_cursor(0,1);
lcd_write_string(" ");
}
else
{
mode=2;
lcd_set_cursor(0,1);
show_alarm_time();
}
}
if(mode==0)
{
hour=0;
minute=0;
show_time();
}
else if(mode==1)
{
show_time();
}
else if(mode==2)
{
if(hour==alarm_hour && minute==alarm_minute)
{
RELAY=1;
bell_on();
delayms(1000);
bell_on();
delayms(1000);
bell_on();
delayms(1000);
RELAY=0;
}
show_time();
}
LED=!LED;
delayms(500);
}
}
```
这个程序使用了AT89C51单片机、字符型LCD显示器、LED、蜂鸣器和继电器模块。您需要根据您使用的硬件进行修改和调整。
程序包括以下功能:
1. 初始化LCD显示器并清空屏幕。
2. 在LCD上显示时间。LED闪烁表示秒数计数。
3. 按下K1键设置当前时间,K2键显示当前时间,K3键设置闹钟时间,K4键设置闹钟开关状态。
4. 在设置时间和闹钟时间时使用K1和K2键进行调整,使用K3键确认设置。
5. 当时间到达闹钟时间时,发出声音报警器并触发继电器。
6. 当设置闹钟开关状态时,使用K4键进行切换。
7. 工作指示灯LED闪烁表示程序开始执行。
请注意,这只是一个基本的程序,您需要根据自己的需要进行修改和调整。建议您查看更多的AT89C51单片机和LCD显示器编程示例,以便更好地了解如何编写和调试程序。
阅读全文