51单片机通过级联74HC595实现倒计时秒表Protues仿真设计
一、设计背景
近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计,倒计时精度达0.05s,解决了传统的由于倒计时精度不够造成的误差和不公平性,是各种体育竞赛的必备设备之一。本设计采用51单片机为中心器件,利用其定时器/计数器定时和记数的原理,使用两片74HC595级联实现LED数码管的控制以及利用外部中断来设计倒计时器。将软、硬件有机地结合起来,使得系统能够实现八位LED显示,倒计时精度为0.05秒,能正确地进行倒计时,复位后倒计时重新回到初始状态。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,并在KEIL5中调试运行,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。
二、实现功能
以51单片机为控制核心,设计一种可调倒计时秒表。整个系统包括51单片机芯片、晶振电路、时钟电路、功能按键以及74HC595数码管控制显示电路。该系统利用共阳数码管实时显示时、分、秒倒计时,通过独立按键键盘设计控制倒计时秒表的启停、定时时间的设计。可具体实现以下功能:
(1) 按下设置键后,在数字闪烁的过程中,采用启动外部中断,能对增、减按键产生响应,。
(2) 按下启动键后,启动定时器;按下暂停键后,停止定时器。
(3)·定时器定时50ms,20次定时可产生1秒钟计时。
(4) 倒计时结束后,停止定时器。
(5) 最大定时99时59分59秒。
三、仿真演示
初始化定时时间0时0分0秒。
按下时间设置按键可以设置倒计时时间,通过连续按下时间设置按键可在时、分、秒设置来回切换,利用闪烁效果提示当前设置单位。
设置好倒计时时间后,利用启动键和停止键实现倒计时秒表的启停。
四、源程序
#include <REGX52.H>
#include <intrins.h>#define false 0
#define true 1
#define uchar unsigned char //0——255
#define uint unsigned int //0——65535
#define ulong unsigned long //0——4294967295sbit SDA1 = P3^6; //串行数据输入,对应595的14脚SER
sbit SCL1 = P3^7; //移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2 = P2^4; //存储寄存器时钟输入,对应595的12脚RCKsbit start_key = P3^0; //启动按钮
sbit pause_key = P3^1; //停止按钮
sbit set_key = P3^5; //停止按钮uchar state; //状态:0-停止,1-启动,2-暂停
ulong ms = 0; //存储毫秒值uchar shi = 0; // 小时数
uchar fen = 0; //分钟数
uchar miao = 0; //秒数
uchar set_flag = 0;uchar smg_c = 0; //数码管闪烁时间计数
bit smg_f = 0; //数码管闪烁标志unsigned char code disp[17]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0x40}; /***数码***///0 1 2 3 4 5 6 7 8 9
unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void displayTime(void); //刷新时间显示
void disPlay(uchar num, uchar loc); //数码管、led显示函数
void Exint_Init(void);
void Timer_Init(void);
void delay2ms(void);
void Delay1ms(unsigned int n);void Delay1ms(unsigned int n)
{unsigned char i, j; for (; n>0; n--)for(i=0;i<10;i++)for(j=0;j<33;j++);
}void delay2ms(void)
{unsigned char i,j;for(i=133;i>0;i--)for(j=6;j>0;j--);
}void c595_in(unsigned char Data)
{unsigned char i;for(i = 0; i < 8; i++) //循环8次,刚好移完8位{SCL1 = 0; //先将移位寄存器控制引脚置为低 _nop_();if((Data & 0x80)== 0x80)SDA1 =1;elseSDA1 =0;Data <<= 1; //将数据的次高位移到最高位SCL1 = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位_nop_();}
}void c595_out(void)
{SCL2 = 0; //先将存储寄存器引脚置为低_nop_();SCL2 = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
}void Timer_Init(void)
{TMOD=0x11; //0110 0001 //方式一TH0= (65536-50000)/256;TL0= (65536-50000)%256; // 50msTH1= (65536-50000)/256;TL1= (65536-50000)%256; // 50msTR0=1; //开启T0TR1=1; //开启T1//ET0=1; //T0中断允许//ET1=1; //T1中断允许EA=1; //总中断开启
}void T0_INT0(void) interrupt 1
{ ms++;if(ms == 20) //1s时间到{ms = 0;if(miao > 0){miao--;}if(miao == 0) //秒数计时为0{if(fen == 0) //没有分钟数{if(shi == 0){TR0 = 0;} //判断是否还有时数,若没有,倒计时结束,停止计时 else{ shi--;fen = 60;}}if(fen > 0) //有分钟数{fen--;miao = 59;}}}
}void T0_INT1(void) interrupt 3
{ smg_c++;if(smg_c == 10){smg_c = 0;smg_f = ~smg_f;}
}/*********外部中断0、1初始化***********/
void Exint_Init()
{IT0 = 1;IT1 = 1; //下降沿触发EX0 = 1;EX1 = 1;PX0 = 1; // 中断优先级设置PX1 = 0;
}/*********外部中断0服务函数***********/
void Exint0_Service() interrupt 0
{if(set_flag == 3) {miao++;if(miao == 60){miao = 59;}}if(set_flag == 2) {fen++;if(fen == 60){fen = 59;} //按键加}if(set_flag == 1) {shi++;if(shi == 100) {shi = 99;}}
}/*********外部中断1服务函数***********/
void Exint1_Service() interrupt 2
{if(set_flag == 3) {if(miao > 0){miao--;}}if(set_flag == 2) {if(fen > 0){fen--;} //按键减}if(set_flag == 1) {if(shi > 0){shi--;}}
}void displayTime(void) //刷新时间显示
{if(((smg_f == 0) && (set_flag == 1))|| (set_flag == 0) || (set_flag == 2) || (set_flag == 3)){c595_in(wei[0]); //先传位码c595_in(disp[shi/10]); //再传段码c595_out();delay2ms();c595_in(wei[1]); //先传位码c595_in(disp[shi%10]); //再传段码 c595_out();delay2ms();} c595_in(wei[2]); //先传位码c595_in(disp[16]); //再传段码 c595_out();delay2ms();if(((smg_f == 0) && (set_flag == 2))|| (set_flag == 0) || (set_flag == 1) || (set_flag == 3)){c595_in(wei[3]); //先传位码c595_in(disp[fen/10]); //再传段码c595_out();delay2ms();c595_in(wei[4]); //先传位码c595_in(disp[fen%10]); //再传段码c595_out();delay2ms();}c595_in(wei[5]); //先传位码c595_in(disp[16]); //再传段码 c595_out();delay2ms();if(((smg_f == 6) && (set_flag == 3))|| (set_flag == 0) || (set_flag == 1) || (set_flag == 2)){c595_in(wei[6]); //先传位码c595_in(disp[miao/10]); //再传段码c595_out();delay2ms();c595_in(wei[7]); //先传位码c595_in(disp[miao%10]); //再传段码c595_out();delay2ms();}
}void main(void)
{Timer_Init();Exint_Init();while(1){displayTime(); //刷新时间显示//检测启动按钮if(start_key == 0) //按下了启动、停止按钮{Delay1ms(10); //延时消抖if(start_key == 0){ET0 = 1; //T0中断允许打开,开始计时set_flag = 0;TR0 = 1;while(start_key == 0) displayTime(); //防止按键重复检测}}//检测停止按钮if(pause_key == 0) //已启动计时,并且暂停按钮按下{Delay1ms(10); //延时消抖if(pause_key == 0){ET0 = 0; while(pause_key == 0) displayTime(); //防止按键重复检测}}if(set_key == 0) //已启动计时,并且暂停按钮按下{Delay1ms(10); //延时消抖if(set_key == 0){ET1=1; set_flag++;if(set_flag == 4){set_flag = 1;}while(set_key == 0) displayTime(); //防止按键重复检测}}}
}
仿真源文件与keil工程百度网盘链接:https://pan.baidu.com/s/1L-FwKgHhRAUiHs6nwD4cBA
提取码:fqjd
相关文章:

51单片机通过级联74HC595实现倒计时秒表Protues仿真设计
一、设计背景 近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计,倒计时精度达0.05s,解决了传统的由于倒计时精度不够造成的误差和不公平性,是各种体育竞赛的必备设…...

深信服技术认证“SCCA-C”划重点:深信服云计算关键技术
为帮助大家更加系统化地学习云计算知识,高效通过云计算工程师认证,深信服特推出“SCCA-C认证备考秘笈”,共十期内容。“考试重点”内容框架,帮助大家快速get重点知识。 划重点来啦 *点击图片放大展示 深信服云计算认证(…...

Redis stream特性了解
在发布订阅中我们了解到发布订阅模式存在的无法持久化保存消息和对于离线重连的客户端不能读取历史消息的缺陷,以下就来了解一下stream是如何解决这个问题的 steam是类似于仅添加log的数据结构,提供了以下基本命令 XADD: 添加新条目到stream # 语法xadd…...

苍穹外卖项目可以写的简历和如何优化简历
文章目录 重点写中规写添加自己个性的项目面试会问道的问题 我是一名双非大二计算机本科生,希望我的分享对你有帮助,点赞关注不迷路。 简历编写一直是很多人求职人的心病,我自己上学期有一门课程是去校内企业面试,当时我就感受出…...

C++:智能指针
C在用引用取缔掉指针的同时,模板的引入带给了指针新的发挥空间 智能指针简单的来说就是带有不同特性和内存管理的指针模板 unique_ptr 1.不能有多个对象指向一块内存 2.对象释放时内部指针指向地址也随之释放 3.对象内数据只能通过接口更改绑定 4.对象只能接收右值…...

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异
对一个应用程序而言,UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容,很多从业多年的设计师都分不…...

react 之 UseReducer
UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数,根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…...

C++:this隐藏参数
你是否有一个问题:C中成员函数中究竟是如何访问成员变量的? 其实了解后回答起来这个问题很简单,通过一个不受限的隐藏参数this,this是类的指针,通过它可以访问到类内的各种成员。 明白了这个问题就很好理解ÿ…...

MySQL事务原理-相关日志
文章目录 前言一、什么是事务?1.1 事务概念1.2 事务的四大特性1.3 事务的隔离级别 二、实现原理2.1 TODO2.2 TODO 前言 事务是由MySQL的引擎来实现的,通过show engines命令查看MySQL存储引擎类别,观察只有InnoDB存储引擎支持事务。 一、什么…...

内核Oops的几种定位方法
反汇编 报错信息 [ 1.826455] ------------[ cut here ]------------ [ 1.831091] Kernel BUG at c011fef0 [verbose debug info unavailable] [ 1.837344] Internal error: Oops - BUG: 0 [#1] PREEMPT THUMB2 [ 1.843108] Modules linked in: [ 1.846158] C…...

外包干了10个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

2024美赛C完整思路
首先,题目明确表示可以自行选择额外的玩家信息或其他数据。因此最好找一些其他选手的数据以扩大数据集,与其他选题人作出数据集上的区分。大数据集可以帮助后续的建模实验更准确。 第一问本质就是开发一个评价模型,主要针对运动员得分的时刻…...

Backtrader 文档学习- Broker - Cheat-On-Open
Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说,这似乎是一个必需的功能,用bar的收盘价后进行计算,希望与开盘价相匹配。 当开盘价差距(上涨或下跌,取…...

基于微信浙江杭州某停车场车位预约小程序系统设计与实现 研究背景和意义、国内外现状
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...

编程流程图
对于复杂流程,我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下: processOn: 这个是我之前 一直的选择,他可以画上面的这些,流程图,网页操作,但是他不是免费的,查过…...

2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)
从上周发现,一轮轮推就行,每轮多个时间片,每个时间片一门。周一到周五一轮,周六日多轮(比如上下午各一轮)。 周一: 7:09–9:20卫星导航定位(p3)&a…...

【python接口自动化】- 正则用例参数化
🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 …...

Java中的四种线程池详解及使用场景
前言 在Java并发编程中,JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法,这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…...

Google Chrome 常用的几个参数
1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…...

Keil软件某些汉字输出乱码,0xFD问题,51单片机
1. 问题 keil软件输入某些汉字的时候会输出乱码,例如:升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd,keil解析为0xc9数的GB2312编码为 0xcafd,keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …...

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人
如今,大模型层出不穷,这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是,普通人使用大模型还是有一…...

Android中 Gradle与 AGP 版本对应关系表
Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2.32.14.12.3.03.33.0.04.13.1.04.43.2.0 - 3.2.14.63.3.0 - 3.3.34.10.13.4.0 - 3.4.35.1.13.5.0 - 3.5.45.4.13.…...

Linux基础知识合集
整理了一下学习的一些关于Linux的一些基础知识,同学们也可以通过公众号菜单栏查看! 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…...

跟着pink老师前端入门教程-day13
品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称:品优购 项目描述:品优购是一个电商网站,我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合,里面需要大量的布…...

go语言基础之泛型
1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…...

Vue.js 中子组件向父组件传值的方法
Vue.js 是一款流行的 JavaScript 前端框架,它提供了一套完整的工具和 API,使得开发者可以更加高效地构建交互式的 Web 应用程序。其中,组件化是 Vue.js 的一个核心概念,通过组件化可以将一个复杂的应用程序拆分成多个独立的部分&a…...

数据可视化 pycharts实现地理数据可视化(全球地图)
自用版 紧急整理一点可能要用的可视化代码,略粗糙 以后有机会再改 requirements: python3.6及以上pycharts1.9 数据格式为: 运行结果为: import pandas as pd from pyecharts.charts import Map, Timeline from pyecharts im…...

Mac下查看、配置和使用环境变量
Mac下查看、配置和使用环境变量 一:Mac怎么查看环境变量命令 printenv一:这个命令会一次性列出所有环境变量的键值对,输出格式为: VAR1value1 VAR2value2 ...二: 也可以通过给这个命令加上环境变量名参数࿰…...

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆
虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆 快速全量克隆 特点:虚拟机启动快、拍平后数据独立 场景:快速发放独立的虚拟机,减少等待虚拟机部署完成时间,能够快速提供用户使用虚拟机。 实现方式:通过对…...

如何隐藏Selenium特征实现自动化网页采集
Selenium是一个流行的自动化网页测试工具,可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而,有些网站会检测浏览器是否由Selenium驱动,如果是,就会返回错误的结果或拒绝访问。为了避免这种情况,我们需要…...