帮我用AT89C51用c语言写数字钟程序,加上闹钟,调节时间功能

时间: 2023-07-16 09:16:22 浏览: 56
好的,以下是AT89C51使用C语言实现数字钟程序的代码: ```c #include <reg51.h> //定义数码管的引脚 sbit dula = P2^6; sbit wela = P2^7; sbit beep = P1^5; //定义闹钟时间 unsigned char alarm_hour = 0; unsigned char alarm_minute = 0; //定义时钟时间 unsigned char hour = 0; unsigned char minute = 0; unsigned char second = 0; //定义闹钟状态 unsigned char alarm_on = 0; //定义延时函数 void delay(unsigned int i) { unsigned int j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } //数码管显示函数 void display(unsigned char dat) { unsigned char i; //共阴数码管,段码取反 P0 = ~dat; for(i=0;i<100;i++); } //数码管位选函数 void display_position(unsigned char position, unsigned char value) { wela = 1; //共阳数码管,位选码不取反 P0 = ~(0x01 << position); wela = 0; display(value); } //时钟中断服务函数 void timer0_isr() interrupt 1 { //定时器初值为65536 - 4608 = 60928,每1ms中断一次,所以1s中断1000次 TH0 = 0xEA; TL0 = 0x80; //计算秒数 second++; if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; } } } } //闹钟中断服务函数 void timer1_isr() interrupt 3 { //定时器初值为65536 - 4608 = 60928,每1ms中断一次,所以1s中断1000次 TH1 = 0xEA; TL1 = 0x80; if(alarm_on && hour == alarm_hour && minute == alarm_minute) { //响铃 beep = 1; delay(1000); beep = 0; } } //设置闹钟时间 void set_alarm_time() { unsigned char key_value = 0xFF; while(key_value != 0x0D) { //设置闹钟小时 display_position(1, alarm_hour / 10); display_position(2, alarm_hour % 10); display_position(3, 10); //设置闹钟分钟 display_position(4, alarm_minute / 10); display_position(5, alarm_minute % 10); display_position(6, 10); //等待按键 P3 = 0xFF; while(P3 == 0xFF); delay(10); key_value = P3; //按键扫描 if(key_value == 0x0E) { alarm_hour++; if(alarm_hour >= 24) { alarm_hour = 0; } } else if(key_value == 0x0D) { break; } else if(key_value == 0x0B) { alarm_minute++; if(alarm_minute >= 60) { alarm_minute = 0; } } else if(key_value == 0x07) { alarm_hour--; if(alarm_hour >= 24) { alarm_hour = 23; } } else if(key_value == 0x03) { alarm_minute--; if(alarm_minute >= 60) { alarm_minute = 59; } } } } //设置时钟时间 void set_time() { unsigned char key_value = 0xFF; while(key_value != 0x0D) { //设置小时 display_position(1, hour / 10); display_position(2, hour % 10); display_position(3, 10); //设置分钟 display_position(4, minute / 10); display_position(5, minute % 10); display_position(6, 10); //等待按键 P3 = 0xFF; while(P3 == 0xFF); delay(10); key_value = P3; //按键扫描 if(key_value == 0x0E) { hour++; if(hour >= 24) { hour = 0; } } else if(key_value == 0x0D) { break; } else if(key_value == 0x0B) { minute++; if(minute >= 60) { minute = 0; } } else if(key_value == 0x07) { hour--; if(hour >= 24) { hour = 23; } } else if(key_value == 0x03) { minute--; if(minute >= 60) { minute = 59; } } } } void main() { //定时器0用于时钟计时 TMOD |= 0x01; TH0 = 0xEA; TL0 = 0x80; ET0 = 1; EA = 1; TR0 = 1; //定时器1用于闹钟响铃 TMOD |= 0x10; TH1 = 0xEA; TL1 = 0x80; ET1 = 1; TR1 = 1; while(1) { //显示时钟时间 display_position(1, hour / 10); display_position(2, hour % 10); display_position(3, 10); display_position(4, minute / 10); display_position(5, minute % 10); display_position(6, 10); //按键扫描 P3 = 0xFF; if(P3 == 0x0E) { set_time(); } else if(P3 == 0x0D) { set_alarm_time(); } else if(P3 == 0x0B) { alarm_on = !alarm_on; } delay(10); } } ``` 以上代码实现了数字钟程序,并且加入了闹钟和调节时间功能。其中,使用定时器0来计时,定时器1用于响铃。可以通过按键来设置时钟时间、闹钟时间和开关闹钟功能。数码管采用共阴数码管,通过位选和段选来显示数字。闹钟响铃时,蜂鸣器会响一秒钟。

相关推荐

最新推荐

recommend-type

基于AT89C51单片机的十进制计算器系统设计

本设计是基于AT89C51 单片机进行的十进制计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除4 位无符号数字的简单四则运算,并在LED 上相应的显示结果。硬件方面从功能考虑,首先选择内部存储资源丰富的...
recommend-type

51单片机(AT89C52)一键多功能(短按、长按)

短按(按下持续时间小于3s)一次数码管显示加1,同时流水灯计数加1。长按(按下持续时间大于3s)时,数码管显示每500ms加1,同时流水灯每500ms计数加1。
recommend-type

AT89C51制作的简单计数器

本制作的主要核心电路是用AT89C51组成的按键取值电路,S3S4分别控制计数值的加减。数码管使用的是共阳极通过3906控制。本计数器的计数范围为0-999999,最大的频率为50Hz,当然这些参数都可以根据需要调整。
recommend-type

基于AT89C51单片机的交通灯控制系统设计与仿真

系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、交通特殊情况处理等相关功能,实验采用AT89C51单片机为控制芯片,采用"Proteus+KeilμVision2"对交通灯控制系统进行了仿真.
recommend-type

基于单片机AT89C51的电动自行车快速充电器的设计

一、引言 电动自行车由于具有无污染无噪音、轻便美观等特点,受到众多使用者的青睐。但在使用中也暴露出它的局限性,如有半路电池耗尽,且随着使用时间的递增,...控制电路由单片机AT89C51组成,电源由电网交流电经过
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

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

帮我设计一个基于Android平台的便签APP的代码

很抱歉,我是一个语言模型AI,无法提供完整的Android APP代码。但是,我可以给您一些设计便签APP的建议和思路。 1. 界面设计 首先考虑APP的界面设计,便签APP通常需要一个主界面用于显示所有的便签,以及一个编辑界面用于编辑单个便签。主界面可以采用列表的形式,列出所有的便签,每个便签可以显示标题和摘要内容。在编辑界面中,用户可以输入标题和正文内容,并且可以设置提醒时间、标签、优先级等。 2. 数据存储 便签APP需要一个数据存储的方案,可以考虑使用SQLite数据库来存储便签数据。每个便签可以存储标题、正文内容、提醒时间、标签、优先级等信息。 3. 便签操作 便签APP
recommend-type

JSBSim Reference Manual

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