"显示当前时间(LCD 或数码管)。 用户通过独立/矩阵按键设置闹钟时间。 到点蜂鸣器响起,任意键停止。" RTC读取、定时判断、蜂鸣器控制、按键扫描。


以下是一个基于51单片机实现上述功能的示例代码,这里假设使用LCD1602显示时间,独立按键设置闹钟,蜂鸣器在闹钟时间到点响起。 ```c #include <reg51.h> // 定义LCD引脚 sbit LCD_RS = P2^6; sbit LCD_RW = P2^5; sbit LCD_E = P2^7; #define LCD_DATAPORT P0 // 定义按键引脚 sbit KEY_SET = P3^2; // 设置键 sbit KEY_UP = P3^3; // 加键 sbit KEY_DOWN = P3^4; // 减键 // 定义蜂鸣器引脚 sbit BUZZER = P1^5; // 定义全局变量 unsigned char hour, minute, second; // 当前时间 unsigned char alarm_hour, alarm_minute; // 闹钟时间 bit set_flag = 0; // 设置标志位 bit alarm_flag = 0; // 闹钟标志位 // 延时函数 void delay(unsigned int time) { unsigned int i, j; for(i = 0; i < time; i++) for(j = 0; j < 123; j++); } // LCD写命令函数 void LCD_WriteCommand(unsigned char command) { LCD_RS = 0; LCD_RW = 0; LCD_DATAPORT = command; delay(5); LCD_E = 1; delay(5); LCD_E = 0; } // LCD写数据函数 void LCD_WriteData(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATAPORT = dat; delay(5); LCD_E = 1; delay(5); LCD_E = 0; } // LCD初始化函数 void LCD_Init() { LCD_WriteCommand(0x38); // 8位数据总线,2行显示,5x7点阵字符 delay(5); LCD_WriteCommand(0x0C); // 显示开,光标关 delay(5); LCD_WriteCommand(0x06); // 文字不动,地址自动加1 delay(5); LCD_WriteCommand(0x01); // 清屏 delay(5); } // 显示时间函数 void DisplayTime() { LCD_WriteCommand(0x80); // 设置显示地址为第一行第一个字符 LCD_WriteData(hour / 10 + '0'); LCD_WriteData(hour % 10 + '0'); LCD_WriteData(':'); LCD_WriteData(minute / 10 + '0'); LCD_WriteData(minute % 10 + '0'); LCD_WriteData(':'); LCD_WriteData(second / 10 + '0'); LCD_WriteData(second % 10 + '0'); LCD_WriteCommand(0xC0); // 设置显示地址为第二行第一个字符 LCD_WriteData('A'); LCD_WriteData('l'); LCD_WriteData('a'); LCD_WriteData('r'); LCD_WriteData('m'); LCD_WriteData(':'); LCD_WriteData(alarm_hour / 10 + '0'); LCD_WriteData(alarm_hour % 10 + '0'); LCD_WriteData(':'); LCD_WriteData(alarm_minute / 10 + '0'); LCD_WriteData(alarm_minute % 10 + '0'); } // 按键扫描函数 void KeyScan() { if(KEY_SET == 0) { delay(20); // 消抖 if(KEY_SET == 0) { set_flag = ~set_flag; // 切换设置标志位 while(KEY_SET == 0); // 等待按键释放 } } if(set_flag) { if(KEY_UP == 0) { delay(20); // 消抖 if(KEY_UP == 0) { if(alarm_hour < 23) alarm_hour++; else alarm_hour = 0; while(KEY_UP == 0); // 等待按键释放 } } if(KEY_DOWN == 0) { delay(20); // 消抖 if(KEY_DOWN == 0) { if(alarm_hour > 0) alarm_hour--; else alarm_hour = 23; while(KEY_DOWN == 0); // 等待按键释放 } } } } // 闹钟判断函数 void AlarmJudge() { if(hour == alarm_hour && minute == alarm_minute) { alarm_flag = 1; } } // 蜂鸣器控制函数 void BuzzerControl() { if(alarm_flag) { BUZZER = ~BUZZER; // 蜂鸣器响 if(KEY_SET == 0 || KEY_UP == 0 || KEY_DOWN == 0) { delay(20); // 消抖 if(KEY_SET == 0 || KEY_UP == 0 || KEY_DOWN == 0) { alarm_flag = 0; // 关闭闹钟 BUZZER = 1; // 关闭蜂鸣器 while(KEY_SET == 0 || KEY_UP == 0 || KEY_DOWN == 0); // 等待按键释放 } } } } // 定时器0初始化函数 void Timer0_Init() { TMOD |= 0x01; // 设置定时器0为模式1 TH0 = (65536 - 50000) / 256; // 定时50ms TL0 = (65536 - 50000) % 256; ET0 = 1; // 使能定时器0中断 EA = 1; // 全局中断使能 TR0 = 1; // 启动定时器0 } // 定时器0中断服务函数 void Timer0_ISR() interrupt 1 { static unsigned int count = 0; TH0 = (65536 - 50000) / 256; // 重新加载初值 TL0 = (65536 - 50000) % 256; count++; if(count >= 20) { // 1s count = 0; second++; if(second >= 60) { second = 0; minute++; if(minute >= 60) { minute = 0; hour++; if(hour >= 24) { hour = 0; } } } } } // 主函数 void main() { hour = 0; minute = 0; second = 0; alarm_hour = 0; alarm_minute = 0; BUZZER = 1; // 关闭蜂鸣器 LCD_Init(); Timer0_Init(); while(1) { DisplayTime(); KeyScan(); AlarmJudge(); BuzzerControl(); } } ``` 代码说明: 1. 延时函数:`delay` 函数用于产生一定的延时,用于消抖和LCD操作的延时。 2. LCD相关函数:包括 `LCD_WriteCommand`、`LCD_WriteData` 和 `LCD_Init` 函数,用于LCD的初始化和数据显示。 3. 显示时间函数:`DisplayTime` 函数将当前时间和闹钟时间显示在LCD上。 4. 按键扫描函数:`KeyScan` 函数用于检测按键是否按下,并根据按键状态进行相应的操作。 5. 闹钟判断函数:`AlarmJudge` 函数用于判断当前时间是否到达闹钟时间,如果到达则设置闹钟标志位。 6. 蜂鸣器控制函数:`BuzzerControl` 函数用于控制蜂鸣器的开关,当闹钟标志位为1时,蜂鸣器响,按下任意键关闭闹钟。 7. 定时器0初始化函数:`Timer0_Init` 函数用于初始化定时器0,用于定时更新时间。 8. 定时器0中断服务函数:`Timer0_ISR` 函数用于定时更新时间,每1秒更新一次。 9. 主函数:初始化变量和外设,然后进入主循环,不断显示时间、扫描按键、判断闹钟和控制蜂鸣器。 额外需要注意的逻辑点: 1. 按键消抖:在按键扫描时,需要进行消抖处理,避免按键抖动导致误触发。 2. 中断优先级:如果系统中有多个中断,需要注意中断优先级的设置,避免中断冲突。 3. 时间更新:在定时器中断服务函数中更新时间时,需要注意时间的进位问题,确保时间的准确性。 [2025-06-06 14:25:37 | AI写代码神器 | 2150点数解答]
- - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内 (571点数解答 | 2025-08-23 20:54:40)91
- - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内,并且可以增加新的一样的文本(1317点数解答 | 2025-08-23 20:58:40)106
- 题目:按照以下步骤在 pycharm 中进行自动化测试脚本编写,并执行脚本。 步骤: (1)从 selenium 中引入 webdriver; (2)使用 selenium 模块的 webdriver 打开谷歌浏览器; (3)在谷歌浏览器中通过 get 方法发送网址eshop测试平台登录页面; (4)增加智能时间等待 5 秒; (5)查看登录页面中的用户名输入框元素,通过 css_selector 属性定位用户名输入框,并输入用户名(用自己注册的用户); (6)查看登录页面中的密码输入框元素,通过 xpath 属性定位密码输入框,并输入密码(用自己注册的用户对应密码) ; (7)查看登录页面中的登录按钮元素,通过 class_name 方法定位登录按钮,使用 click()方法点击登录按钮进入eshop测试平台首页; (8)在eshop测试平台首页通过 link_text 方法对“我的订单”按钮进行定位,使用 click()方法点击“我的订单”(304点数解答 | 2024-11-06 15:38:30)314
- #include<stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/mman.h> #include "font.h" #include <linux/input.h> struct lcddevice* lcd; font *f; // 新增:用于存储输入数字的字符数组 char input_numbers[50] = {0}; int num_count = 0; // 记录已输入数字的个数 #define digital_spacing 22 int unlocked = 0; int wrong_count = 0; // 新增变量,用于记录密码错误次数 void font_init(int size) { //初始化lcd lcd = init_lcd("/dev/fb0"); //打开字体 f = fo(45点数解答 | 2024-12-05 20:37:20)151
- #include<stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/mman.h> #include "font.h" #include <linux/input.h> struct lcddevice* lcd; font *f; // 新增:用于存储输入数字的字符数组 char input_numbers[50] = {0}; int num_count = 0; // 记录已输入数字的个数 #define digital_spacing 22 int unlocked = 0; int wrong_count = 0; // 新增变量,用于记录密码错误次数 void font_init(int size) { //初始化lcd lcd = init_lcd("/dev/fb0"); //打开字体 f = fo(864点数解答 | 2024-12-05 20:39:28)154
- 使用继承,实现“剪刀石头布的游戏”。 小时候很喜欢玩一个游戏,“剪刀石头布”,可以是出拳的形式,或跳格子的形式。现在我们用计算机来玩这个游戏。 电脑用随机数产生剪刀石头布,游戏玩家用输入1,2,3的方式出拳。 游戏玩家输入1或2或3,分别 代表剪刀(1)石头(2)布(3)。 电脑胜出时,显示"winner is computerplayer." 游戏玩家胜出时,显示“winner is personplayer.” 平局时显示"a draw." 函数接口定义: 根据主方法内容,实现三个类的定义,分别是是computerplayer、personplayer、game类。 其中computerplayer、personplayer要继承player类。 根据主方法中的用法,实现game类。 裁判测试程序样例: import java.util.scanner; class player{ string name; player(string name){ this.name = name; } int show() { //出拳方法(451点数解答 | 2024-10-20 19:57:58)324
- 5.对数据data作统计分析(1)统计分析各城市**数量分布图(2)**学历占比图 **学历占比图(3)通过**学历分析图,给出你对**发布情况的分析结论.(4)统计每一天发布的**数量图,按天来统计(提示:需要先将时间按每天来统计,去除时分秒)(5)通过**发布时间分析图,给出你对**发布情况的分析结论。 (6)仔细观察data数据,firsttype内容的最后一项如下图红色框中内容,是**工作大类,请将其剥离,对其进行统计,统计结果如下图蓝色框,将统计结果以柱状图展示。(704点数解答 | 2024-06-30 15:54:38)224
- 在android开发中,alarmmanager //闹钟(379点数解答 | 2023-11-07 22:47:39)154
- 综合gpio应用的led灯、数码管、按键与lcd屏,设计实现基于stc51单片机如图电路结构,其中led灯8个,独立按键4个,4位数码管一个,lcd显示屏一个,编程实现按键控制流水灯,数码管数字变化,lcd显示学号和姓名等功能。具体功能如下:(1)四个按键分别为key1,key2,key3,key4,其中key1按键次数决定模式,按下1次模式1,第二次模式2,第三次模式3,第四次模式4,第五次返回模式1。 (2)开机进入初始状态,led灯全灭,数码管显示00,lcd显示屏显示hello。 (3)按下key2按键,如果是模式1下,流水灯左移循环点亮,如果是模式2,数码管显示数字加1(最大99,如最大返回0),如果是模式3,lcd第一行显示学号。 (4)按下key3按键,如果是模式1下,流水灯右移循环点亮,如果是模式2,数码管显示数字减1(最小为0,如最小返回99),如果是模式3,lcd第二行显示姓名拼音。 (5)按下key4按键,恢复初始状态。(1974点数解答 | 2024-10-27 15:42:41)266
- 作为linux开发,简述linux /etc/inittab 设置(修改)系统默认运行级别 ?(281点数解答 | 2023-11-09 18:42:13)233
- 字典基本操作(映射类型),是包含若干键:值得无序可变序列,表示一种映射或对应关系。参考课本p631) 用dict方法创建一个空字典, 存储在 adict变量中。 2) 设置 keys=["物联网",“电子”,“通信”,“计算机”], values=[84,78,66,98], 根据以上数据使用dict 方法创建字典, 存储在 bdict 变量中。 3)判断字典bdict 变量中是否存在键“数媒”,如果存在则返回对应的值,不存在则返回“不存在” 4) 用for<变量名>in <字典名>, 对 adict中元素进行遍历, 分别输出键内容 和 值内容,完整的字典的内容。(313点数解答 | 2024-05-06 09:52:01)280
- 用易语言改写以下代码 <?php header('Content-Type: text/html; charset=GBK'); //网页编码 ?> <?php // API地址 $apiUrl = "http://api.mairui.club/hsrl/ssjy/113044/F6A66457-8F2E-4838-B08E-5C6E97383DDC"; // 密匙 $apiKey = "F6A66457-8F2E-4838-B08E-5C6E97383DDC"; //初始化 cURL $curl = curl_init(); // 设置 cURL选项 curl_setopt($curl, CURLOPT_URL, $apiUrl); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: $apiKey" )); // 执行 cURL 并获取结果 $response = curl_exec($curl); /(532点数解答 | 2025-01-29 23:05:04)251