一课一得——电子时钟

89C51 单片机电子时钟的制作
大家好!今天我要和大家分享一个基于 89C51 单片机的电子时钟项目。这个项目将帮助你了解如何使用单片机来控制和显示时间。
89C51 单片机是一款非常经典的微控制器,广泛应用于各种嵌入式系统中。它具有低成本、高性能和易于学习的特点,非常适合初学者学习单片机编程。
在这个项目中,我们将使用 89C51 单片机来控制一个数码管显示时间。数码管是一种常见的显示器件,可以显示数字和字母。我们将使用单片机的定时器来产生时钟信号,并使用数码管来显示小时、分钟和秒钟。
下面是这个项目的硬件部分:
    1.    89C51 单片机
    2.    数码管
    3.    电阻
    4.    电容
    5.    晶振
接下来是软件部分:
    1.    首先,我们需要编写一个单片机程序来控制数码管显示时间。这个程序将使用 C 语言编写,并使用 Keil uVision 集成开发环境进行编译和调试。
    2.    在程序中,我们将使用单片机的定时器来产生时钟信号,并使用数码管的显示功能来显示时间。
    3.    为了使数码管能够正常工作,我们还需要设置合适的引脚连接和电阻值。
最后,我们将硬件和软件部分结合起来,将单片机程序下载到单片机中,并将硬件连接好。这样,我们就可以看到数码管显示的时间了。
这个项目不仅可以帮助你学习单片机编程,还可以让你了解如何使用数码管来显示信息。如果你对电子时钟感兴趣,不妨试试这个项目!

原代码

#include <reg51.h>

#define display_port P1 // Seven segment display connected to port 1

sbit rs = P3^0;  // Register select (RS) pin
sbit rw = P3^1;  // Read/Write (RW) pin
sbit e =  P3^2;  // Enable (E) pin

void delay(unsigned int count) {
    unsigned int i, j;
    for (i = 0; i < count; i++)
        for (j = 0; j < 1275; j++);
}

void lcd_command(unsigned char command) {
    display_port = command;
    rs = 0;
    rw = 0;
    e = 1;
    delay(1);
    e = 0;
    delay(1);
}

void lcd_data(unsigned char data) {
    display_port = data;
    rs = 1;
    rw = 0;
    e = 1;
    delay(1);
    e = 0;
    delay(1);
}

void lcd_init() {
    lcd_command(0x38);  // Initialize LCD in 8-bit mode
    lcd_command(0x0C);  // Display on, cursor off
    lcd_command(0x01);  // Clear LCD
    lcd_command(0x80);  // Move cursor to starting position of first line
}

void lcd_display_time(unsigned char hour, unsigned char min, unsigned char sec) {
    lcd_command(0xC6);  // Move cursor to the starting position of second line
    lcd_data((hour / 10) + 0x30);  // Display tens digit of hour
    lcd_data((hour % 10) + 0x30);  // Display ones digit of hour
    lcd_data(':');
    lcd_data((min / 10) + 0x30);  // Display tens digit of minute
    lcd_data((min % 10) + 0x30);  // Display ones digit of minute
    lcd_data(':');
    lcd_data((sec / 10) + 0x30);  // Display tens digit of second
    lcd_data((sec % 10) + 0x30);  // Display ones digit of second
}

void main() {
    unsigned char hour = 0, min = 0, sec = 0;

    lcd_init();  // Initialize LCD

    while (1) {
        lcd_display_time(hour, min, sec);  // Display current time on LCD
        delay(1000);  // Delay of 1 second

        sec++;  // Increment second

        if (sec == 60) {
            sec = 0;
            min++;  // Increment minute

            if (min == 60) {
                min = 0;
                hour++;  // Increment hour

                if (hour == 24) {
                    hour = 0;
                }
            }
        }
    }
}
 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值