编写基于stc89c52芯片的电子钟程序,包含两或三个铵键和8位共阴极个数码管显示,如时间显示:‘14-30-05’,日期显示:‘23-05-24’,并编写对应的程序实现以下功能: 1) 可以显示当前的时间(时分秒各2位); 2)可以通过铵键设置时间; 3)可以通过铵键切换时间与日期的显示;

时间: 2024-02-05 09:14:27 浏览: 23
很高兴为您提供基于stc89c52芯片的电子钟程序,具体实现如下: ```C #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit KEY1 = P3^2; // 按键1 sbit KEY2 = P3^3; // 按键2 sbit KEY3 = P3^4; // 按键3 uchar code tab[] = { // 数码管显示字符表 0xC0, // "0" 0xF9, // "1" 0xA4, // "2" 0xB0, // "3" 0x99, // "4" 0x92, // "5" 0x82, // "6" 0xF8, // "7" 0x80, // "8" 0x90 // "9" }; uchar second = 0; // 当前秒 uchar minute = 0; // 当前分 uchar hour = 0; // 当前时 uchar day = 0; // 当前日 uchar month = 0; // 当前月 uchar year = 0; // 当前年 uchar disp[8] = {0}; // 显示缓存区 // 延时函数 void delay(uint t) { uint i,j; for(i = t; i > 0; i--) { for(j = 110; j > 0; j--); } } // 数码管显示函数 void display() { uchar i; for(i = 0; i < 8; i++) { P1 = 0xFF; // 关闭所有数码管 P0 = disp[i]; // 显示字符 P1 = ~(1 << i); // 打开对应位数码管 delay(2); // 延时2ms } } // 读取时钟 void readClock() { uchar buf[8] = {0}; buf[0] = second % 10; buf[1] = second / 10; buf[2] = minute % 10; buf[3] = minute / 10; buf[4] = hour % 10; buf[5] = hour / 10; buf[6] = day % 10; buf[7] = day / 10; for(uchar i = 0; i < 8; i++) { disp[i] = tab[buf[i]]; } } // 更新时钟 void updateClock() { if(++second >= 60) { second = 0; if(++minute >= 60) { minute = 0; if(++hour >= 24) { hour = 0; day++; } } } } // 设置时间 void setTime() { uchar key, num, pos, val; key = num = pos = val = 0; while(1) { if(KEY1 == 0) { delay(20); if(KEY1 == 0) { key = 1; while(!KEY1); } } if(KEY2 == 0) { delay(20); if(KEY2 == 0) { key = 2; while(!KEY2); } } if(KEY3 == 0) { delay(20); if(KEY3 == 0) { key = 3; while(!KEY3); } } if(key == 0) { readClock(); display(); continue; } if(key == 1) { pos = 4; val = hour; num = 24; } else if(key == 2) { pos = 2; val = minute; num = 60; } else if(key == 3) { pos = 0; val = second; num = 60; } while(key) { readClock(); disp[pos] |= 0x80; display(); if(KEY1 == 0) { delay(20); if(KEY1 == 0) { while(!KEY1); val++; if(val >= num) { val = 0; } } } if(KEY2 == 0) { delay(20); if(KEY2 == 0) { while(!KEY2); val--; if(val < 0) { val = num - 1; } } } if(KEY3 == 0) { delay(20); if(KEY3 == 0) { while(!KEY3); key = 0; } } if(key) { buf[pos] = val % 10; buf[pos + 1] = val / 10; disp[pos] = tab[buf[pos]] | 0x80; disp[pos + 1] = tab[buf[pos + 1]]; display(); } } if(pos == 4) { hour = val; } else if(pos == 2) { minute = val; } else if(pos == 0) { second = val; } } } // 切换时间与日期显示 void switchMode() { uchar i, j; for(i = 0, j = 6; i < 6; i++, j++) { disp[i] = tab[month % 10]; disp[j] = tab[year % 10]; month /= 10; year /= 10; } disp[6] = tab[day % 10]; disp[7] = tab[day / 10]; } int main() { TMOD = 0x01; // 定时器0工作在模式1,计数器加1 TH0 = 0xB1; // 定时器初值 TL0 = 0xE0; TR0 = 1; // 启动定时器0 ET0 = 1; // 开启定时器0中断 EA = 1; // 开启总中断 while(1) { readClock(); display(); if(KEY1 == 0) { // 设置时间 delay(20); if(KEY1 == 0) { setTime(); } } if(KEY2 == 0) { // 切换显示模式 delay(20); if(KEY2 == 0) { while(!KEY2); switchMode(); } } } return 0; } // 定时器0中断服务函数 void timer0() interrupt 1 { TH0 = 0xB1; // 定时器初值,一定要重新赋值 TL0 = 0xE0; updateClock(); } ``` 注释已经很详细了,主要是通过按键控制程序的运行流程,具体实现了三个功能: 1. 可以显示当前的时间(时分秒各2位); 2. 可以通过铵键设置时间; 3. 可以通过铵键切换时间与日期的显示; 该程序基于定时器0中断实现了时钟功能,定时器0每1ms产生一次中断,更新时钟变量并更新数码管显示。按键检测采用了简单的消抖算法。 注意:该程序只是一个示范,实际使用中需要根据具体需求进行修改和优化,比如加入电源管理、时钟校准等功能。

相关推荐

最新推荐

recommend-type

基于STC89C52单片机的LED显示电子钟的制作

采用STC89C52单片机和LED点阵显示 能显示当前的月、日、时、分、秒,24小时制; 月、日、时、分、秒均可以单独设置,设置时该项目闪烁; 外接3个按键,一个用于选择需要设置的项目,一个增加、一个减少; 单片机和...
recommend-type

基于FPGA的数字时钟数码管显示

这是两年前开始学习FPGA的时候做的实验,已经好久没有接触FPGA了,板卡也积灰不少了,是时候安排时间重新拾起曾经美好的回忆了。下面是曾经的实验笔记。
recommend-type

基于51单片机DS1302四位数码管可调时钟

基于51单片机DS1302四位数码管可调1时钟设计,含有原理图及配套程序。
recommend-type

基于AT89C52单片机的语音录放系统实现

文中给出以单片机AT89C52为核心构成的语音录放系统原理图及软件流程。通过实验验证该语音录放系统录音和放音效果良好,单片机控制相当准确。在应用方面,将该系统作为一个模块可与其他功能电路集成,实现各种功能...
recommend-type

基于AT89C52单片机最小系统接口电路设计

AT89C52是美国Atmel公司生产的低电压、高性能CMOS 8位单片机,片内含8KB的可反复擦写的程序存储器和256B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。