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 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光学3D表面轮廓仪服务超精密抛光技术发展

随着技术的不断进步&#xff0c;精密制造领域对材料表面的处理要求越来越高&#xff0c;超精密抛光技术作为当下表面处理的尖端技术&#xff0c;对各种高精密产品的生产起到了至关重要的作用&#xff0c;已广泛应用于集成电路制造、医疗器械、航空航天、3C电子、汽车、精密模具…

Flutter 高级动画技术综合指南

在动画领域&#xff0c;Flutter 提供了一系列功能&#xff0c;包括基于物理的动画&#xff0c;可以模拟真实世界的动态&#xff0c;在应用程序中创建更逼真和自然的运动。 本文将深入研究 Flutter 动画&#xff0c;探索各种类型&#xff0c;并演示如何在项目中实现它们。 Flu…

Linux系统Shell脚本-----------正则表达式 、grep、 sed

一、正则表达式 1.前言 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板&…

vue实现跳转传参查询

vue实现跳转传参查询&#xff1a; 应用场景&#xff1a;外部链接携参跳转目标页时,避免多次输入查询信息查询 目标需求&#xff1a;登录及非登录状态均可跳转自动查询 避坑指南&#xff1a;token失效时需要重新缓存及路由导航缓存判断 简单实现&#xff1a;缓存信息&#xff0c…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

线程锁多线程的复习

线程 实现方式3种乐观锁&悲观锁线程池线程池总结 进程:是正在运行的程序 线程:是进程中的单个顺序控制流,是一条执行路径 实现方式3种 1.Thread //步骤一:定义一个继承Thread的类 //步骤二:再定义的类中重写run()方法 //步骤三:创建定义类对象 //步骤四:启动线程 class M…

Armv8-M的TrustZone技术之在安全状态和非安全状态之间切换

Armv8-M安全扩展允许在安全和非安全软件之间直接调用。 Armv8-M处理器提供了几条指令来处理状态转换: 下图显示了安全状态转换。 如果入口点的第一条指令是SG且位于非安全可调用内存位置中,则允许从非安全到安全软件的直接API函数调用。 当非安全程序调用安全API时,API通过…

vue中的vuex

在Windows的应用程序开发中&#xff0c;我们习惯了变量&#xff08;对象&#xff09;声明和使用方式&#xff0c;就是有全局和局部之分&#xff0c;定义好了全局变量&#xff08;对象&#xff09;以后在其他窗体中就可以使用&#xff0c;但是窗体之间的变量&#xff08;对象&am…

20240129收获

今天终于发现《八部金刚功》第五部我一直做的是错的&#xff0c;嗨。这里这个写法非常聪明&#xff0c;创立的数组&#xff0c;以及用obj[key] item[key]这样的写法&#xff0c;这个写法充分展示了js常规写法中只有等号右边会去参与运算&#xff0c;等号左边就是普通的键的写法…

项目实现网页分享QQ空间功能

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供“点击转发按钮&#x…

TensorFlow2实战-系列教程9:RNN文本分类1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、文本分类任务 1.1 文本分类 数据集构建&#xff1a;影评数据集进行情感分析&…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…

[PHP]严格类型

PHP: 类型声明 - Manual

【学网攻】 第(15)节 -- 标准ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…

Spring Boot导出EXCEL 文件

主要功能:实现java导出excel到本地 JDK版本&#xff1a;openJDK 20.0.1 依赖pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

Java 面试题之 IO(一)

字节流 文章目录 字节流InputStream&#xff08;字节输入流&#xff09;OutputStream&#xff08;字节输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 InputStream&#xff08;字节输入流&#xff09; InputStream用于从源头&#xff08;通常是…

Centos Cron设置定时任务

这本是很简单的问题&#xff0c;但是我服务器重装系统两次&#xff0c;遇到的问题都不一样&#xff0c;所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…

Xds (eXtensible Discovery Service)理解

Xds &#xff08;eXtensible Discovery Service&#xff09;理解 概念介绍 XDS&#xff1a;全称是 eXtensible Discovery Service&#xff0c;中文译为”可扩展的服务发现“。是一个扩展性的协议&#xff0c;可以用于配置和控制 Envoy 代理的各个方面&#xff0c;包括路由规则…

Leetcode 206 反转链表

反转链表 准备工作1&#xff09;ListNode基本结构2&#xff09;初始化ListNode集合 解法一&#xff1a;遍历创建新节点解法二&#xff1a;两组List&#xff0c;面向对象操作解法三&#xff1a;递归调用解法四&#xff1a;直接移动解法五&#xff1a;解法二的面向过程 Leetcode …