51单片机通过级联74HC595实现倒计时秒表Protues仿真设计

news2024/10/6 3:24:25

一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了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——4294967295
	

sbit SDA1 = P3^6;    //串行数据输入,对应595的14脚SER
sbit SCL1 = P3^7;     //移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2 = P2^4;     //存储寄存器时钟输入,对应595的12脚RCK

sbit 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;
		else
			SDA1 =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;		// 50ms
    TH1= (65536-50000)/256;
	TL1= (65536-50000)%256;		// 50ms
	
	TR0=1;		//开启T0
	TR1=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.coloradmin.cn/o/1420114.html

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

相关文章

一家企业需要CRM,通常有以下这些迹象

CRM软件是一个集成的套件——通常是——云应用程序&#xff0c;例如营销云、销售云和服务云&#xff0c;用于收集和存储客户数据。它为销售团队提供了一个集中的平台来管理客户交互并确定活动的优先级&#xff0c;这样客户就不会感到被忽视&#xff0c;从而提升了他们的客户体验…

Flask使用Jinja2渲染模版使用变量实战

前言&#xff1a; Flask 使用 Jinja2 作为其默认模板引擎&#xff0c;这意味着您可以直接在 Flask 应用程序中使用 Jinja2 模板。您可以创建模板文件&#xff0c;然后在视图函数中渲染这些模板&#xff0c;将动态数据传递给模板进行渲染&#xff0c;并最终生成最终的 HTML 页面…

mcu专用看门狗复位芯片(如MAX706)

mcu专用看门狗复位芯片&#xff08;如MAX706&#xff09; 为什么要使用电压复位芯片RESET引脚WDO引脚MR引脚WDI引脚 国产替代型号应用电路1 推荐电路&#xff08;用一个跳线帽使能/关闭看门狗功能&#xff0c;调试MCU时防止看门狗芯片随便触发复位功能&#xff09;&#xff0c;…

ChatGPT PLUS升级步骤--支付宝、微信

AI伴随着我们已经有一年多了&#xff0c;这一年多里我使用ChatGPT做ppt、生成绘画、写文案、做旅游攻略&#xff0c;还有一些医学知识&#xff0c;医学知识我感觉没有回答的很好&#xff0c;对比于医生给的建议我个人觉得还是医生的比较好&#xff0c;Chat GPT回答的比较官方 …

【极数系列】Flink集成DataSource读取文件数据(08)

文章目录 01 引言02 简介概述03 基于文件读取数据3.1 readTextFile(path)3.2 readFile(fileInputFormat, path)3.3 readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo)3.4 实现原理3.5 注意事项3.6 支持读取的文件形式 04 源码实战demo4.1 pom.xml依…

ROS学习笔记11——ROS中的重名问题

一、ros功能包重名——ros工作空间覆盖 功能包重名时&#xff0c;会按照 ROS_PACKAGE_PATH 查找&#xff0c;在前的会优先执行。ROS 会解析 .bashrc 文件&#xff0c;并生成 ROS_PACKAGE_PATH ROS包路径&#xff0c;即调用功能包的顺序&#xff0c;该变量中按照 .bashrc 中配置…

leetcode—跳跃游戏—贪心算法

1 跳跃游戏1 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…

图像畸变校正(2)

畸变校正是一种用于矫正图像或视频中的失真或畸变的技术。这种失真通常是由摄像头镜头的特性或角度造成的&#xff0c;可能会导致图像中的对象形状、大小或位置不准确。以下是畸变校正的一般方法&#xff1a; 摄像头模型建立&#xff1a; 首先&#xff0c;需要建立摄像头的模型…

【React教程】(1) React简介、React核心概念、React初始化

目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…

海外云手机为什么吸引用户?

近年来&#xff0c;随着全球化的飞速发展&#xff0c;海外云手机逐渐成为各行各业关注的焦点。那么&#xff0c;究竟是什么让海外云手机如此吸引用户呢&#xff1f;本文将深入探讨海外云手机的三大吸引力&#xff0c;揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

Android 13以上版本读写SD卡权限适配

如题&#xff0c;最近工作上处理的问题&#xff0c;把解决方案简单逻列出来&#xff0c;供有需要的朋友参考之 解决方案&#xff1a; 1、配置权限 <uses-permission android:name"android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name&q…

PyQt5零基础入门(八)——按钮控件(QPushButton、QToolButton)

前言 按钮控件是图形用户界面(GUI)中常用的交互元素&#xff0c;用于触发特定的事件或行为。在Qt框架中&#xff0c;QPushButton和QToolButton是两种常用的按钮控件。 后边我们将以test.png为按钮图标&#xff0c;对比使用两种按钮控件。 普通按钮控件(QPushButton) QPushB…

禁止 ios H5 中 bounces 滑动回弹效果

在开发面向 iOS 设备的 HTML5 应用时&#xff0c;控制页面的滚动行为至关重要&#xff0c;特别是禁用在 Safari 中默认的滑动回弹效果。本文旨在提供一个简洁明了的解决方案&#xff0c;帮助开发者在特定的 Web 应用中禁用这一效果。 1. 什么是滑动回弹效果&#xff1f; 在 iO…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

【高效开发工具系列】Wolfram Alpha

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【RT-DETR有效改进】2024.1最新MFDS-DETR的HS-FPN改进特征融合层(降低100W参数,全网独家首发)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征…

“全”实力认可 | 美创科技领跑CCSIP 2023全景图数据安全领域

近日&#xff0c;FreeBuf咨询正式发布《CCSIP&#xff08;China Cyber Security Industry Panorama&#xff09;2023中国网络安全行业全景册&#xff08;第六版&#xff09;》。本次全景册面向广大国内安全厂商&#xff0c;由厂商自主申报并填写信息征集表&#xff0c;经FreeBu…

【俄乌之战】乌克兰声称280台俄罗斯服务器被毁,损失数据超2 PB

乌克兰报告针对俄罗斯政府关键基础设施和私营公司的多次网络攻击&#xff0c;导致全国范围内的中断和大量数据丢失。 乌克兰 HUR&#xff08;乌克兰国防部主要情报局&#xff09;的网络安全专家声称对IPL Consulting进行了成功的网络攻击。据报道&#xff0c;他们摧毁了整个IT…

uniapp H5 实现上拉刷新 以及 下拉加载

uniapp H5 实现上拉刷新 以及 下拉加载 1. 先上图 下拉加载 2. 上代码 <script>import DragableList from "/components/dragable-list/dragable-list.vue";import {FridApi} from /api/warn.jsexport default {data() {return {tableList: [],loadingHi…

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。同时它可以外接一个30W的无源副音箱&#xff0c;用在面积较大的场所。5寸进口全频低音喇…