C52LED电子时钟设计

时间: 2024-01-09 08:05:02 浏览: 40
以下是C52 LED电子时钟设计的相关信息: 1. 该电子时钟采用STC89C52单片机和LED点阵显示,能够显示当前的月、日、时、分、秒,24小时制。 2. 月、日、时、分、秒均可以单独设置,设置时该项目闪烁。 3. 外接3个按键,一个用于选择需要设置的项目,一个增加、一个减少。 4. 该电子时钟基于定时器实现时间的计时,利用按钮调节模式切换,设置闹钟,调节时间等功能。 以下是C52 LED电子时钟设计的代码演示: ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示0~9的编码 uchar sec = 0, min = 0, hour = 0, day = 1, month = 1, year = 20; // 定义秒、分、时、日、月、年 uchar alarm_hour = 0, alarm_min = 0; // 定义闹钟的小时和分钟 uchar mode = 0; // 定义模式,0为时间模式,1为设置模式,2为闹钟模式 uchar set_pos = 0; // 定义设置的位置,0为设置小时,1为设置分钟,2为设置月份,3为设置日期,4为设置年份 uchar key_value = 0; // 定义按键值,0为没有按键按下,1为K1按下,2为K2按下,3为K3按下 sbit LSA = P2^2; // 数码管LSA引脚 sbit LSB = P2^3; // 数码管LSB引脚 sbit LSC = P2^4; // 数码管LSC引脚 sbit SDA = P3^4; // IIC总线数据线 sbit SCL = P3^5; // IIC总线时钟线 void delay(uint i) // 延时函数 { while(i--); } void write_byte(uchar dat) // 向IIC总线写入一个字节 { uchar i; for(i = 0; i < 8; i++) { SDA = dat >> 7; // 先发送高位 dat <<= 1; SCL = 1; _nop_(); _nop_(); SCL = 0; } SDA = 1; // 释放数据线 } uchar read_byte() // 从IIC总线读取一个字节 { uchar i, dat = 0; SDA = 1; // 先释放数据线 for(i = 0; i < 8; i++) { dat <<= 1; SCL = 1; _nop_(); _nop_(); dat |= SDA; // 读取数据线上的数据 SCL = 0; } return dat; } void iic_start() // IIC总线起始信号 { SDA = 1; SCL = 1; _nop_(); _nop_(); SDA = 0; _nop_(); _nop_(); SCL = 0; } void iic_stop() // IIC总线停止信号 { SDA = 0; SCL = 1; _nop_(); _nop_(); SDA = 1; _nop_(); _nop_(); } void ds1307_write(uchar addr, uchar dat) // 向DS1307写入一个字节 { iic_start(); write_byte(0xd0); // 发送写地址 write_byte(addr); // 发送寄存器地址 write_byte(dat); // 发送数据 iic_stop(); } uchar ds1307_read(uchar addr) // 从DS1307读取一个字节 { uchar dat; iic_start(); write_byte(0xd0); // 发送写地址 write_byte(addr); // 发送寄存器地址 iic_start(); write_byte(0xd1); // 发送读地址 dat = read_byte(); // 读取数据 iic_stop(); return dat; } void init_ds1307() // 初始化DS1307 { ds1307_write(0x00, 0x00); // 秒清零 ds1307_write(0x01, 0x00); // 分钟清零 ds1307_write(0x02, 0x00); // 小时清零 ds1307_write(0x03, 0x01); // 星期一 ds1307_write(0x04, 0x01); // 1号 ds1307_write(0x05, 0x01); // 1月 ds1307_write(0x06, 0x21); // 2021年 } void display_time() // 显示时间 { uchar i; uchar dis_buf[8] = {0}; // 显示缓存 dis_buf[0] = table[hour / 10]; dis_buf[1] = table[hour % 10]; dis_buf[2] = 0x40; dis_buf[3] = table[min / 10]; dis_buf[4] = table[min % 10]; dis_buf[5] = 0x40; dis_buf[6] = table[sec / 10]; dis_buf[7] = table[sec % 10]; for(i = 0; i < 8; i++) { switch(i) { case(0): LSA = 0; LSB = 0; LSC = 0; break; case(1): LSA = 1; LSB = 0; LSC = 0; break; case(2): LSA = 0; LSB = 1; LSC = 0; break; case(3): LSA = 1; LSB = 1; LSC = 0; break; case(4): LSA = 0; LSB = 0; LSC = 1; break; case(5): LSA = 1; LSB = 0; LSC = 1; break; case(6): LSA = 0; LSB = 1; LSC = 1; break; case(7): LSA = 1; LSB = 1; LSC = 1; break; } P0 = dis_buf[i]; delay(100); P0 = 0x00; } } void key_scan() // 按键扫描 { if(K1 == 0) // K1按下 { delay(1000); if(K1 == 0) { key_value = 1; while(!K1); } } else if(K2 == 0) // K2按下 { delay(1000); if(K2 == 0) { key_value = 2; while(!K2); } } else if(K3 == 0) // K3按下 { delay(1000); if(K3 == 0) { key_value = 3; while(!K3); } } } void set_time() // 设置时间 { switch(set_pos) { case(0): // 设置小时 if(key_value == 1) // K1按下 { hour++; if(hour > 23) hour = 0; } else if(key_value == 2) // K2按下 { hour--; if(hour > 23) hour = 23; } break; case(1): // 设置分钟 if(key_value == 1) // K1按下 { min++; if(min > 59) min = 0; } else if(key_value == 2) // K2按下 { min--; if(min > 59) min = 59; } break; case(2): // 设置月份 if(key_value == 1) // K1按下 { month++; if(month > 12) month = 1; } else if(key_value == 2) // K2按下 { month--; if(month > 12) month = 12; } break; case(3): // 设置日期 if(key_value == 1) // K1按下 { day++; if(day > 31) day = 1; } else if(key_value == 2) // K2按下 { day--; if(day > 31) day = 31; } break; case(4): // 设置年份 if(key_value == 1) // K1按下 { year++; if(year > 99) year = 0; } else if(key_value == 2) // K2按下 { year--; if(year > 99) year = 99; } break; } } void set_alarm() // 设置闹钟 { if(key_value == 1) // K1按下 { alarm_hour++; if(alarm_hour > 23) alarm_hour = 0; } else if(key_value == 2) // K2按下 { alarm_min++; if(alarm_min > 59) alarm_min = 0; } } void main() { init_ds1307(); // 初始化DS1307 while(1) { key_scan(); // 按键扫描 if(mode == 0) // 时间模式 { sec = ds1307_read(0x00); // 读取秒 min = ds1307_read(0x01); // 读取分 hour = ds1307_read(0x02); // 读取时 display_time(); // 显示时间 if(key_value == 1) // K1按下,进入设置模式 { mode = 1; set_pos = 0; key_value = 0; } else if(key_value == 2) // K2按下,进入闹钟模式 { mode = 2; key_value = 0; } if(alarm_hour == hour && alarm_min == min) // 判断是否到达闹钟时间 { P1 = 0xff; // 发出警报 } else { P1 = 0x00; } } else if(mode == 1) // 设置模式 { set_time(); // 设置时间 display_time(); // 显示时间 if(key_value == 1) // K1按下,切换到下一个设置位置 { set_pos++; if(set_pos > 4) // 所有设置位置都设置完毕,退出设置模式 { mode = 0; ds1307_write(0x00, sec); // 写入秒 ds1307_write(0x01, min); // 写入分 ds1307_write(0x02, hour); // 写入时 ds1307_write(0x03, 0x01); // 星期一 ds1307_write(0x04, day); // 写入日 ds1307_write(0x05, month); // 写入月 ds1307_write(0x06, year); // 写入年 } key_value = 0; } else if(key_value == 2) // K2按下,退出设置模式 { mode = 0; key_value = 0; } } else if(mode == 2) // 闹钟模式 { set_alarm(); // 设置闹钟 P0 = table[alarm_hour / 10]; delay(100); P0 = table[alarm_hour % 10]; delay(100); P0 = 0x40; delay(100); P0 = table[alarm_min / 10]; delay(100); P0 = table[alarm_min % 10]; delay(100); P0 = 0x40; delay(100); if(key_value == 2) // K2按下,退出闹钟模式 { mode = 0; key_value = 0; } } } } ```

相关推荐

最新推荐

recommend-type

什么是mysql安装配置教程以及学习mysql安装配置教程的意义

mysql安装配置教程
recommend-type

【光伏预测】基于BP神经网络实现光伏发电功率预测附Matlab代码.zip

1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
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

【实战演练】增量式PID的simulink仿真实现

# 2.1 Simulink仿真环境简介 Simulink是MATLAB中用于建模、仿真和分析动态系统的图形化环境。它提供了一个直观的用户界面,允许用户使用块和连接线来创建系统模型。Simulink模型由以下元素组成: - **子系统:**将复杂系统分解成更小的、可管理的模块。 - **块:**代表系统中的组件,如传感器、执行器和控制器。 - **连接线:**表示信号在块之间的流动。 Simulink仿真环境提供了广泛的块库,涵盖了各种工程学科,包括控制系统、电子和机械工程。它还支持用户自定义块的创建,以满足特定仿真需求。 # 2. Simulink仿真环境的搭建和建模 ### 2.
recommend-type

训练集和测试集的准确率都99%,但是预测效果不好

即使训练集和测试集的准确率都很高,但是在实际的预测中表现不佳,可能会有以下几个原因: 1. 数据质量问题:模型训练和测试的数据可能存在问题,比如数据标签错误、数据集采样不均衡、数据集中存在异常值等问题,这些问题可能会导致模型在实际预测中表现不佳。 2. 特征工程问题:模型的特征工程可能存在问题,导致模型无法很好地捕捉数据的特征,从而影响预测效果。 3. 模型选择问题:模型的选择可能不合适,比如选择的模型太简单,无法很好地拟合数据,或者选择的模型太复杂,导致过拟合等问题。 4. 超参数调整问题:模型的超参数可能没有调整到最佳状态,需要进行调整。 针对以上可能的原因,可以采取相应的措施进
recommend-type

JSBSim Reference Manual

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

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

【实战演练】MATLAB simulink船舶动力定位模拟器

# 1. MATLAB Simulink 简介** MATLAB Simulink 是 MathWorks 公司开发的一款图形化建模和仿真软件,广泛应用于工程、科学和教育领域。它提供了丰富的模块库和仿真环境,使工程师能够快速构建和仿真复杂系统。 Simulink 的核心概念是基于块状图建模,其中每个模块代表一个特定的功能或组件。用户可以通过拖放模块并连接它们来创建系统模型。Simulink 提供了广泛的模块库,涵盖了信号处理、控制系统、动力学和通信等领域。 此外,Simulink 还支持自定义模块开发,允许用户创建自己的模块来扩展其功能。这使得 Simulink 成为一个高度灵活的仿真平
recommend-type

linux下RS485怎么实现

在Linux下实现RS485通信,需要做以下几个步骤: 1. 确认硬件支持:首先需要确认通信设备硬件是否支持RS485通信,如果不支持需要更换支持RS485通信的硬件设备。 2. 配置串口参数:在Linux下使用RS485通信,需要对串口进行一些特殊的配置。例如,需要将串口设置为半双工模式、开启硬件流控等。可以使用Linux提供的stty命令或者相关API接口进行配置。 3. 编写应用程序:通过Linux提供的串口API接口,编写应用程序实现RS485通信。在应用程序中需要设置对应的串口参数,以及发送和接收数据的逻辑。 4. 配置硬件电平转换器:在使用RS485通信时,需要将串口的逻辑