51单片机电子时钟keil5
时间: 2023-11-22 18:04:50 浏览: 391
51单片机电子时钟
以下是基于51单片机的电子时钟设计的步骤:
1. 硬件设计:选择合适的晶振和LCD显示屏,连接好电路。
2. 软件设计:使用Keil5编写C语言程序,实现以下功能:
(1)初始化:设置定时器、中断、端口等参数。
(2)获取时间:通过定时器中断获取当前时间,并将其转换为时、分、秒的形式。
(3)显示时间:将获取到的时间显示在LCD屏幕上。
(4)调整时间:通过按键控制,可以调整时、分、秒的值。
(5)闹钟功能:设置闹钟时间,到达闹钟时间时,发出蜂鸣器提示。
3. 调试:将程序下载到单片机上,通过调试工具进行调试,确保程序正常运行。
```c
// 以下是基于51单片机的电子时钟设计的C语言程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6; // LCD1602的RS引脚
sbit RW = P2^5; // LCD1602的RW引脚
sbit EN = P2^7; // LCD1602的EN引脚
uchar code table[] = "20123456789"; // 数码管显示表
uchar hour = 0, minute = 0, second = 0; // 时、分、秒
uchar alarm_hour = 0, alarm_minute = 0; // 闹钟时、分
bit alarm_flag = 0; // 闹钟标志位
void delay(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void LCD_WriteCommand(uchar com) // 写命令函数
{
RS = 0;
RW = 0;
P0 = com;
EN = 1;
_nop_();
EN = 0;
delay(5);
}
void LCD_WriteData(uchar dat) // 写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
_nop_();
EN = 0;
delay(5);
}
void LCD_Init() // LCD1602初始化函数
{
LCD_WriteCommand(0x38); // 显示模式设置:16*2显示,5*7点阵,8位数据接口
LCD_WriteCommand(0x0c); // 显示开关控制:显示开,光标关,光标闪烁关
LCD_WriteCommand(0x06); // 光标/显示移位:光标右移,字符不移动
LCD_WriteCommand(0x01); // 显示清屏
}
void Timer0_Init() // 定时器0初始化函数
{
TMOD &= 0xf0;
TMOD |= 0x01; // 定时器0工作在模式1:16位定时器
TH0 = 0xfc; // 定时器初值,1ms
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void Timer0_ISR() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xfc; // 定时器初值,1ms
TL0 = 0x18;
second++; // 秒加1
if (second == 60) // 分钟加1
{
second = 0;
minute++;
if (minute == 60) // 小时加1
{
minute = 0;
hour++;
if (hour == 24) // 一天结束,从头开始
{
hour = 0;
}
}
}
}
void Key_Scan() // 按键扫描函数
{
if (P3 != 0xff) // 检测到按键按下
{
delay(10); // 延时去抖
if (P3 != 0xff) // 再次检测按键是否按下
{
if (P3 == 0xfe) // K1按下,调整小时
{
hour++;
if (hour == 24)
{
hour = 0;
}
}
else if (P3 == 0xfd) // K2按下,调整分钟
{
minute++;
if (minute == 60)
{
minute = 0;
}
}
else if (P3 == 0xfb) // K3按下,调整闹钟小时
{
alarm_hour++;
if (alarm_hour == 24)
{
alarm_hour = 0;
}
}
else if (P3 == 0xf7) // K4按下,调整闹钟分钟
{
alarm_minute++;
if (alarm_minute == 60)
{
alarm_minute = 0;
}
}
}
while (P3 != 0xff); // 等待按键释放
}
}
void Display_Time() // 显示时间函数
{
uchar shiwei, gewei;
shiwei = hour / 10; // 获取小时的十位数
gewei = hour % 10; // 获取小时的个位数
LCD_WriteCommand(0x80); // 光标移动到第一行第一列
LCD_WriteData(table[shiwei]); // 显示小时的十位数
LCD_WriteData(table[gewei]); // 显示小时的个位数
LCD_WriteData(':'); // 显示冒号
shiwei = minute / 10; // 获取分钟的十位数
gewei = minute % 10; // 获取分钟的个位数
LCD_WriteData(table[shiwei]); // 显示分钟的十位数
LCD_WriteData(table[gewei]); // 显示分钟的个位数
LCD_WriteData(':'); // 显示冒号
shiwei = second / 10; // 获取秒的十位数
gewei = second % 10; // 获取秒的个位数
LCD_WriteData(table[shiwei]); // 显示秒的十位数
LCD_WriteData(table[gewei]); // 显示秒的个位数
}
void Alarm() // 闹钟函数
{
if (hour == alarm_hour && minute == alarm_minute && alarm_flag == 0) // 到达闹钟时间
{
alarm_flag = 1; // 设置闹钟标志位
P1 = 0x00; // 发出蜂鸣器提示
}
}
void main()
{
LCD_Init(); // LCD1602初始化
Timer0_Init(); // 定时器0初始化
EA = 1; // 允许中断
while (1)
{
Display_Time(); // 显示时间
Key_Scan(); // 按键扫描
Alarm(); // 闹钟
}
}
```
阅读全文