51单片机(普中)八位数码管实现计时,闹钟开关,定时,代码和原理图,如果闹钟时间到了且闹钟打开蜂鸣器响,可以通过按键更改时间
2条回答 默认 最新
- 噼里啪啦啦 2023-11-17 15:59关注
代码:
#include <reg51.h> // 定义按键和LED引脚 sbit start_stop = P2^0; // 开始/停止按键 sbit reset = P2^1; // 复位按键 sbit alarm = P2^2; // 闹钟开关 sbit led = P2^3; // LED指示灯 // 闹钟参数,以BCD格式存储 unsigned char alarm_hour = 0x12; // 闹钟小时 unsigned char alarm_minute = 0x30; // 闹钟分钟 // 定时参数 unsigned char timer_hour = 0x00; // 定时小时 unsigned char timer_minute = 0x05; // 定时分钟 unsigned char timer_second = 0x00; // 定时秒钟 // 定义全局变量 unsigned char hour = 0x00; // 当前小时 unsigned char minute = 0x00; // 当前分钟 unsigned char second = 0x00; // 当前秒钟 bit is_running = 0; // 计时器是否在运行 // 1ms延时函数 void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) { for(j = 0; j < 110; j++); } } // 显示时间函数 void display_time() { // 显示小时 P1 = (hour / 10) << 4 | (hour % 10); P0 = 0xFE; // 第一位数码管亮 delay_ms(1); // 显示分钟 P1 = (minute / 10) << 4 | (minute % 10); P0 = 0xFD; // 第二位数码管亮 delay_ms(1); // 显示秒钟 P1 = (second / 10) << 4 | (second % 10); P0 = 0xFB; // 第三位数码管亮 delay_ms(1); } // 更新时间函数 void update_time() { second++; if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; } } } } // 闹钟检测函数 void check_alarm() { if(alarm_hour == hour && alarm_minute == minute && alarm == 1) { led = 1; // 如果闹钟时间到了且闹钟开关打开,LED亮 } else { led = 0; // 其他情况下LED灭 } } // 定时器中断处理函数 void timer_interrupt() interrupt 1 { if(is_running) { TH0 = 0xFC; // 定时器初值 TL0 = 0x67; update_time(); display_time(); check_alarm(); } } void main() { // 初始化定时器 TMOD = 0x01; // 定时器0,工作方式1 TH0 = 0xFC; // 初始值 TL0 = 0x67; TR0 = 1; // 启动定时器 ET0 = 1; // 允许定时器中断 EA = 1; // 打开总中断 // 主循环 while(1) { // 开始/停止按键 if(start_stop == 0) { is_running = ~is_running; // 切换计时器运行状态 delay_ms(50); // 延时去抖动 } // 复位按键 if(reset == 0) { hour = 0x00; minute = 0x00; second = 0x00; is_running = 0; led = 0; delay_ms(50); // 延时去抖动 } } }
原理图:
+----[P2.0]---- 开始/停止按键 | +----[P2.1]---- 复位按键 | +----[P2.2]---- 闹钟开关 | +----[P2.3]---- LED指示灯 | +----|----+ | | +---|--------[P0]--------+ | | | | [P1.0] [P1.1] [P1.2] [P1.3] 十位 个位 十位 个位 数字 数字 数字 数字 显示 显示 显示 显示 0~9 0~9 0~9 0~9
解决 无用评论 打赏 举报
悬赏问题
- ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
- ¥30 STM32 INMP441无法读取数据
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error