单片机:实现倒计时(附带源码)
使用单片机实现倒计时功能是一个常见的嵌入式应用,它能帮助你更好地理解如何进行时间控制和如何通过定时器实现精确的倒计时。通过该项目,你将学习如何使用单片机的定时器来进行时间计算,并通过LED或LCD显示倒计时的结果。
1. 项目概述
倒计时器是一个简单的计时系统,通常有如下功能:
- 显示倒计时的剩余时间。
- 当时间到达0时,可以触发某个动作,如点亮LED、蜂鸣器发声等。
- 允许用户设置倒计时的初始值。
2. 硬件需求
- 单片机:我们使用8051单片机作为控制器,可以选择其他单片机如STM32、AVR等。
- LCD:用来显示倒计时的剩余时间。
- 按键:用来设置倒计时的初始值,开始倒计时或重置倒计时。
- 蜂鸣器(可选):倒计时结束时发出提示音。
- 电源:为单片机、LCD和蜂鸣器提供电源。
3. 硬件连接
- LCD连接:假设使用16x2 LCD,通过4线模式与单片机连接。
- 按键连接:用两个按键,一个用于开始倒计时,另一个用于重置倒计时。按键连接到P1.0(开始/停止)和P1.1(重置)。
- 蜂鸣器连接(可选):蜂鸣器连接到P2.0,倒计时结束时触发。
4. 程序设计
本项目的基本原理是:使用定时器来生成一个固定时间间隔(例如1秒),每秒更新倒计时的剩余时间。倒计时结束时,可以触发一个事件,比如点亮一个LED灯或者响起蜂鸣器。
4.1 定时器配置
我们可以使用8051的定时器来实现倒计时的功能。定时器会以一定的时间间隔触发中断,每次中断时减少倒计时的数值。
4.2 倒计时逻辑
- 用户通过按键设置初始倒计时时间。
- 按下开始按钮后,倒计时开始,LCD显示剩余时间。
- 当时间到达0时,触发事件(如蜂鸣器发声)。
4.3 程序代码
#include <reg51.h> // 包含8051单片机的寄存器定义
#include "lcd.h" // 假设我们有LCD驱动程序#define START_BTN P1_0 // 开始按钮
#define RESET_BTN P1_1 // 重置按钮
#define BUZZER P2_0 // 蜂鸣器unsigned char seconds = 10; // 初始倒计时设为10秒
unsigned char minutes = 0; // 初始倒计时分钟为0
bit is_counting = 0; // 倒计时状态,1表示进行中,0表示停止// 定时器0中断服务程序
void timer0_ISR() interrupt 1 {if (is_counting) {// 倒计时减少1秒if (seconds == 0 && minutes > 0) {minutes--;seconds = 59; // 重新设置秒钟为59} else if (seconds > 0) {seconds--;}// 更新LCD显示update_lcd();// 当倒计时结束时触发蜂鸣器if (seconds == 0 && minutes == 0) {BUZZER = 1; // 打开蜂鸣器delay(1000); // 蜂鸣器响1秒BUZZER = 0; // 关闭蜂鸣器}}// 清除定时器中断标志TH0 = 0x3C; // 设置定时器初值TL0 = 0xB0;
}// 初始化定时器
void timer_init() {TMOD = 0x01; // 配置定时器0为模式1(16位计数)TH0 = 0x3C; // 设置定时器初值TL0 = 0xB0;IE = 0x82; // 启用定时器中断TR0 = 1; // 启动定时器0
}// 初始化LCD显示
void update_lcd() {lcd_clear();lcd_set_cursor(0, 0);lcd_print("Time: ");lcd_print_num(minutes);lcd_print(":");lcd_print_num(seconds);
}// 初始化按键
void key_init() {P1 = 0xFF; // 设置P1口为输入
}// 检查按键是否按下
bit check_key(unsigned char key) {if (key == START_BTN) {return (P1_0 == 0); // 按下返回1} else if (key == RESET_BTN) {return (P1_1 == 0); // 按下返回1}return 0;
}// 启动倒计时
void start_countdown() {is_counting = 1; // 开始倒计时
}// 停止倒计时
void stop_countdown() {is_counting = 0; // 停止倒计时
}// 重置倒计时
void reset_countdown() {seconds = 10; // 设置倒计时为初始值minutes = 0;update_lcd(); // 刷新LCD显示
}void delay(unsigned int time) {unsigned int i, j;for(i = 0; i < time; i++) {for(j = 0; j < 1275; j++) {// 空循环实现延时}}
}void main() {lcd_init(); // 初始化LCD显示timer_init(); // 初始化定时器key_init(); // 初始化按键update_lcd(); // 初始化时显示倒计时while(1) {// 检查是否按下开始按钮if (check_key(START_BTN)) {start_countdown();delay(300); // 防抖动延时}// 检查是否按下停止按钮if (check_key(RESET_BTN)) {reset_countdown();delay(300); // 防抖动延时}}
}
5. 程序说明
5.1 定时器中断
在timer0_ISR
函数中,我们使用定时器中断每秒触发一次,当is_counting
为1时,表示倒计时正在进行中。每次中断时,我们减少倒计时的秒数。如果秒数为0且分钟数大于0,则将秒数重置为59,分钟数减1。若秒数和分钟数都为0,表示倒计时结束,我们触发蜂鸣器。
5.2 LCD显示
update_lcd
函数用于刷新LCD,显示当前倒计时的分钟和秒数。每次倒计时更新时,我们都会调用此函数来显示剩余时间。
5.3 按键操作
通过check_key
函数检查是否按下了开始按钮或重置按钮。按下开始按钮时,调用start_countdown
函数启动倒计时;按下重置按钮时,调用reset_countdown
函数将倒计时重置为初始状态。
5.4 延时函数
delay
函数用于按键的防抖动处理。当按键被按下时,我们加入一定的延时,以避免因为按键抖动而导致的误触发。
6. 总结
通过本项目,我们实现了一个简单的倒计时功能,使用8051单片机、定时器、LCD和按键来实现倒计时的显示与控制。你可以进一步扩展此项目,例如增加多个倒计时、声音报警、更多的用户交互等。这个项目帮助你掌握了定时器中断、LCD显示、按键输入等基本应用,是一个非常适合入门嵌入式系统开发的项目。
相关文章:
单片机:实现倒计时(附带源码)
使用单片机实现倒计时功能是一个常见的嵌入式应用,它能帮助你更好地理解如何进行时间控制和如何通过定时器实现精确的倒计时。通过该项目,你将学习如何使用单片机的定时器来进行时间计算,并通过LED或LCD显示倒计时的结果。 1. 项目概述 倒计…...
什么是多线程中的上下文切换
什么是多线程中的上下文切换 回答 上下文切换是指CPU从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确地运行。 在多线程编程中,上下文切换是一种常…...
如何在windwos批量拉取go mod
golang go-zero微服务开发,分的rpc项目太多了,变更了公共包,需要手动去拉取,直接一键拉取就好了,创建一个windwos脚本文件 文件名 tidy_all_go_mod.ps1 代码 # 辅助工具拉取go mod tidy # 根目录v99main执行 ./tidy_all_go_mod.ps1 # 定义项目的根目录 $RootDir Get-Locat…...

【Three.js基础学习】29.Hologram Shader
前言 three.js 通过着色器如何实现全息影像,以及一些动态的效果。 一些难点的思维,代码目录 下面图是摄像机视角观看影响上的时候,如何实现光影的渐变,透视以及叠加等。 一、代码 1.index.html <!DOCTYPE html> <html …...

文件包含进阶玩法以及绕过姿态
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理文件包含漏洞的进阶玩法与绕过姿态 不涉及基础原理了 特殊玩法汇总 本地包含 文件包含上传文件 原理: php的文件包含有着把其他文件类型当做php代码执行的功效,文件上传一般会限制后缀&am…...

Markdown编辑器工具--Typora
下载链接...
PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语
中文版 PyTorch 的 torch.unbind 函数详解与进阶应用 在深度学习中,张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作,其中之一便是 torch.unbind。与常见的堆叠函数(如 torch.stack)相辅相成&am…...
四十六:如何使用Wireshark解密TLS/SSL报文?
TLS/SSL是保护网络通信的重要协议,其加密机制可以有效地防止敏感信息被窃取。然而,在调试网络应用或分析安全问题时,解密TLS/SSL流量是不可避免的需求。本文将介绍如何使用Wireshark解密TLS/SSL报文。 前提条件 在解密TLS/SSL报文之前&…...

【人工智能】OpenAI O1模型:超越GPT-4的长上下文RAG性能详解与优化指南
在人工智能(AI)领域,长上下文生成与检索(RAG) 已成为提升自然语言处理(NLP)模型性能的关键技术之一。随着数据规模与应用场景的不断扩展,如何高效地处理海量上下文信息,成…...

Ubuntu22.04搭建FTP服务器保姆级教程
在网络环境中,文件传输是一项至关重要的任务。FTP(文件传输协议)是一种基于客户端/服务器模式的协议,广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版,因其稳定性和易用性而广受开发者和系统管理员的喜爱…...

操作系统(4)操作系统的结构
一、无序结构(整体结构或模块组合结构) 1.特点: 以大型表格和队列为中心,操作系统的各部分程序围绕着这些表格进行。操作系统由许多标准的、可兼容的基本单位(称为模块)构成,模块之间通过规定的…...
Python数据分析(OpenCV视频处理)
处理视频我们引入的还是numpy 和 OpenCV 的包 引入方式如下: import numpy as np import cv2 我们使用OpenCV来加载本地视频,参数就是你视频的路径就可以 #加载视频 cap cv2.VideoCapture(./1.mp4) 下面我们进行读取视频 #读取视频 flag,frame cap.re…...
跨域 Cookie 共享
跨域请求经常遇到需要携带 cookie 的场景,为了确保跨域请求能够携带用户的认证信息或其他状态,浏览器提供了 withCredentials 这个属性。 如何在 Axios 中使用 withCredentials 为了在跨域请求中携带 cookie,需要在 Axios 配置中设置 withCr…...

【视频异常检测】Real-Time Anomaly Detection and Localization in Crowded Scenes 论文阅读
文章信息: 发表于:CVPR2015(workshop) 原文链接:https://www.cv-foundation.org/openaccess/content_cvpr_workshops_2015/W04/papers/Sabokrou_Real-Time_Anomaly_Detection_2015_CVPR_paper.pdf Real-Time Anomaly D…...
设计模式12:抽象工厂模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 参考: C设计模式:抽象工厂模式(风格切换案例)_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式(Abstract Factory Pattern)是软件设计…...

论文学习——多种变化环境下基于多种群进化的动态约束多目标优化
论文题目:Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化(Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …...

Jenkins参数化构建详解(This project is parameterized)
本文详细介绍了Jenkins中不同类型的参数化构建方法,包括字符串、选项、多行文本、布尔值和git分支参数的配置,以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…...

Cerebras 推出 CePO,填补推理与规划能力的关键空白
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
广东省食品销售中高级题库及答案
1.有关食品安全标准的说法正确的是(C)。 A.鼓励性标准 B.推荐性标准 C.强制性标准 D.引导性标准 2.食品经营许可证载明的许可事项发生变化的,食品经营者应当在变化后(D)个工作日内向原发证的食品药品监督管理部门申请变更经营许可。 A.3 B.5 C.7 D.10 3.食品销售经营者对食品…...

JAVA基础-深入理解Java内存模型(一)-- 重排序与先行发生原则(happens-before)
深入理解Java内存模型(一)-- 重排序 很棒的一个关于Java内存模型系列文章,首先感谢作者,转载自深入理解java内存模型系列文章 ,为了方便阅读,做了一些内容整合和重排版。 提纲 Java线程之间的通信对程序…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...