基于51单片机的电子秒表Protues仿真设计

news2024/11/25 8:21:11

目录

一、设计背景

二、实现功能

三、仿真结果

四、源程序


一、设计背景

      随着科技的不断发展,电子设备在我们生活中扮演着愈加重要的角色。这些电子设备不仅使我们的生活更加便利,还帮助我们提高工作效率和精确度。其中,电子秒表是常用的计时设备之一,用于精确测量时间的消逝。本设计的数字电子秒表系统采用51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计电子秒表。将软、硬件有机地结合起来,使得系统能够实现三位LED显示,倒计时精度为0.1秒,能正确地进行计时,复位后重新回到初始状态。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

         本设计以51单片机为核心,,采用常用电子器件设计,两个按键、三个数码管显示,开机后显示0,每秒循环左移一位,即“口口0->”口0口”->”0口口”,按A键开始显计时,实时显示所经历的时间,按B键停止计时并显示从开始到当前的时间,按键采用中断方式,按键A接INT0,按键B接INT1,要求精确到0.1秒,量程为0-99.9秒.

三、仿真结果

开机显示0。

 每秒循环左移一位。

按A键开始显计时,实时显示所经历的时间,按B键停止计时。

四、源程序

#include <reg51.h>

#define uchar unsigned char	 //0——255
#define uint unsigned int	 		//0——65535
#define ulong unsigned long	//0——4294967295


uchar disCode[10] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管段码 0~9
uchar disDotCode[10] = {0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08}; //数码管段码 0~9(无数码管)
uchar locCode[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};					//位码

void displayTime(void);	 //刷新时间显示
void disPlay(uchar num, uchar loc);	 //数码管、led显示函数
void Exint_Init(void);
void Timer_Init(void);
void Delay1ms(unsigned int n);	//延时1ms
void Delay_us(unsigned int t);
	
ulong ms = 0;	//存储毫秒值
uchar miao = 0;	//秒数
uchar set_flag = 0;

uchar smg_c = 0;	//数码管闪烁时间计数
uchar smg_f = 0;	//数码管闪烁标志
uchar smg_b = 0;	

void Timer_Init(void)
{
	TMOD=0x11; //0110 0001	//方式一
	
	TH0= (65536-100000)/256;
	TL0= (65536-100000)%256;		// 100ms
    TH1= (65536-50000)/256;
	TL1= (65536-50000)%256;		// 50ms
	
	TR0=1;		//开启T0
	TR1=1;		//开启T1
	//ET0=1;		//T0中断允许
    ET1=1;		//T1中断允许
	EA=1;	//总中断开启
}
/******************************************************************************* 
* 函 数 名          : T0_INT
* 函数功能         : T0定时器中断函数10ms
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/ 
void T0_INT0(void)  interrupt 1
{ 
	ms++;
	if(ms == 10)  //1s时间到
	{
		ms = 0;
		miao++;
		if(miao == 100)    //秒数计时为0
		{
			miao=0;
		}
	}
	displayTime();
}

/******************************************************************************* 
* 函 数 名          : T0_INT1
* 函数功能         : T0定时器中断函数50ms
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/ 
void T0_INT1(void)  interrupt 3
{ 
	smg_c++;
	if(smg_c == 20)
	{
		smg_b++;
		smg_f=smg_b%3;
		smg_c = 0;
	}
	displayTime();
}

/*********外部中断0、1初始化***********/
void Exint_Init()
{
	IT0 = 1;
	IT1 = 1;    //下降沿触发
	EX0 = 1;
	EX1 = 1;
	PX0 = 1;    // 中断优先级设置
	PX1 = 0;
}

/*********外部中断0服务函数***********/
void Exint0_Service() interrupt 0
{
	ET0 = 1;		//T0中断允许打开,开始计时
	set_flag = 1;
	smg_b=0;
	smg_f=0;
	ms=0;
	miao=0;
}

/*********外部中断1服务函数***********/
void Exint1_Service() interrupt 2
{
	ET0 = 0;	
}

/******************************************************************************* 
* 函 数 名          : main
* 函数功能         : 主函数
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/  
void main(void)
{
    Timer_Init();
	Exint_Init();
	P1=0xff;
	while(1)
	{
		displayTime();	 //刷新时间显示
	}
}

void displayTime(void)	 //刷新时间显示
{
   if((smg_f == 2)||set_flag==1)
	{
		disPlay(miao/10, 3);	 //显示秒数的个位
	}
   if((smg_f == 1)||set_flag==1)
	{
		disPlay(miao%10, 4);	 //显示秒数的十位
	}
   if((smg_f == 0)||set_flag==1)
	{
		disPlay(ms%10, 5);	 //显示秒数的个位
	}

}

void disPlay(uchar num, uchar loc)	 //数码管、led显示函数
{
	P0 = 0xff;	//消除重影
	P2 = locCode[loc];	//位码输出
	if((loc==4)&&(set_flag==1)){ P0 = disDotCode[num];}	//段码输出
	else{P0 = disCode[num];}
	Delay_us(200);	//增加显示时间,防止显示过暗
}

void Delay_us(unsigned int t)
{
  while(t--);
}


keil源码工程及Protues源文件百度网盘链接:https://pan.baidu.com/s/1WeaZmNS1-RsRYijD65EQHQ     提取码:77xd 

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

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

相关文章

如何配置JDK的环境变量(简单灵活易懂)

前言&#xff1a; 开始学习java的小伙伴们一定都备一件事困扰过&#xff0c;那就是jdk的环境变量的配置&#xff0c;搞不懂为啥要配置环境变量&#xff0c;到底有啥子用&#xff1f;接下来小编带大家配置一下 配置环境变量的作用&#xff1f; Path&#xff1a;当用javac、jav…

redis 缓存击穿问题(互斥锁,逻辑过期)

1、缓存击穿问题 缓存击穿问题:一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 场景:假设线程1在查询缓存之后&#xff0c;本来应该去查询数据库&#xff0c;然后把这个数据重新加…

Java学习笔记002——类的修饰符

在Java语言中&#xff0c;类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符&#xff0c;在创建类时用于类的声明&#xff1a; 1、public: 当一个类被声明为public时&#xff0c;它可以从任何其他类中被访问&#xff0c;无论这些类位于哪个包中。通常&am…

探索设计模式的魅力:深入解析解释器模式-学习、实现与高效使用的全指南

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 探索设计模式的魅力&#xff1a;解析解释器模式学习、实现与高效使用全指南 文章目录 一、案…

2024大厂Java面试最火问题,1200页文档笔记

前言 ⽂章有点⻓&#xff0c;请耐⼼看完&#xff0c;绝对有收获&#xff01;不想听我BB直接进⼊⾯试分享&#xff1a; 准备过程蚂蚁⾦服⾯试分享拼多多⾯试分享字节跳动⾯试分享最后总结个人所得&#xff08;供大家参考学习&#xff09; 当时我⾃⼰也准备出去看看机会&#…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 3 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

工业网关、物联网网关与PLC网关是什么?

网关是什么&#xff1f; 网关是一种用于连接不同网络的网络设备&#xff0c;其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络&#xff0c;并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间&#xff0c;可以是硬件设备或者软…

Jenkins如何做到parameter页面里2个参数的联动

在Jenkins中&#xff0c;参数化构建是一种非常有用的功能&#xff0c;它可以让用户在构建过程中输入参数&#xff0c;从而实现更灵活的构建流程。有时候&#xff0c;我们希望两个参数之间能够实现联动&#xff0c;即一个参数的取值会影响另一个参数的取值。要实现这样的功能&am…

蚂蚁感冒c++

题目 思路 “两蚂蚁碰面会掉头&#xff0c;若其中一只蚂蚁感冒了&#xff0c;会把感冒传染给碰到的蚂蚁”&#xff0c;这句话看作是“两蚂蚁碰面会互相穿过&#xff0c;只是把感冒的状态传给了另一只蚂蚁”&#xff0c;因为哪只蚂蚁感冒了并不是题目的重点&#xff0c;重点是有…

iview碰到的一些问题总结

iview tabs嵌套使用问题 tabs嵌套使用的时候不是直接套用行了&#xff0c;直接套用会出现内层tab都集成到一级tab去&#xff0c;需要设置该属性指向对应 Tabs 的 name 字段(需要版本大于3.3.1) <Tabs name"tab1" ><TabPane label"标签1" tab&qu…

springboot基于java的中医院门诊挂号诊断就诊系统ssm+jsp

主要研究内容&#xff1a; 医院门诊挂号系统分为护士&#xff0c;医生&#xff0c;药房&#xff0c;收费&#xff0c;管理员等权限。 护士&#xff1a;挂号、退号、查询病人。挂号——就诊科室(发热门诊、骨科、妇科等等)&#xff0c;就诊医生数据库获取&#xff0c;挂号类型—…

【vue.js】文档解读【day 1】 | 模板语法1

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 模板语法前言文本插值原始HTML属性Attribute绑定动态绑定多个值 模板语法 前言 Vue 使用一种基于 HTML…

CAN总线的拓扑类型和CAN收发器(原理讲解)

1&#xff1a;CAN收发器&#xff08;原理讲解&#xff09; 从原理上来讲CAN_H拉升电压&#xff0c;或CAN_L拉低电压的原理。 以上是TJA1145AT的俯瞰图&#xff0c;此芯片是NXP比较先进的CAN收发器&#xff0c;带SPI总线系统。 回到正题&#xff0c;CAN_H和CAN_L收发器是通过内…

大模型日报|今日必读的9篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.Cognition is All You Need 最近对如由大型语言模型&#xff08;LLMs&#xff09;驱动的聊天机器人等对话式人工智能&#xff08;AI&#xff09;工具在复杂的现实世界知识工作中的应用进行的研究表明&#xff0c;这…

MySQL NDB Cluster 分布式架构搭建 自定义启动、重启和关闭集群Shell脚本

此次NDB Cluster使用三台虚拟机进行搭建&#xff0c;一台作为管理节点&#xff1b;而对于另外两台服务器&#xff0c;每一台都充当着数据节点和SQL节点的角色。注意不是MGR主从复制架构&#xff0c;而是分布式MySQL架构。 创建 /var/lib/mysql-cluster/config.ini Cluster全局…

uniapp iOS 真机调试

一、下载爱思助手 二、打开爱思助手&#xff0c;把你的 苹果手机 用原装数据线连接至电脑&#xff1a; 找到 工具箱 > 搜索IPA > 打开IAP签名 三、添加 IPA 文件 mac&#xff1a;finder 》应用程序 》右键 HbuilderX 》显示包内容 》HbuilderX / plugins/ lau…

seata服务器集群搭建

搭建seata-server-1.3服务器对应SpringBoot2.3.12&#xff0c;springcloud2.2.3 <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version> 首先你安装了nacos 1解压文件 2修改cong/file.conf 让seata集群信息可以共享&#xff0c;我们应该…

基于 HBase Phoenix 构建实时数仓(1)—— Hadoop HA 安装部署

目录 一、主机规划 二、环境准备 1. 启动 NTP 时钟同步 2. 修改 hosts 文件 3. 配置所有主机间 ssh 免密 4. 修改用户可打开文件数与进程数&#xff08;可选&#xff09; 三、安装 JDK 四、安装部署 Zookeeper 集群 1. 解压、配置环境变量 2. 创建配置文件 3. 创建新…

【视频转码】基于RK3588的视频转码探索

传统的视频转码服务基本都是基于X86下CPU、GPU转码&#xff0c;对硬件性能、功耗、成本来说都比较高。从技术角度来说现有视频转码技术有&#xff1a; 视频编码转变&#xff1a; 1. H.264 > H.265 保持视频分辨率、清晰度不变情况下&#xff0c;更改视频压缩方式&#xff0…

【Redis】Redis持久化模式AOF

目录 引言 AOF持久化模式​编辑​编辑 AOF与RDB的混合持久化(4.x后的新特性) AOF的优缺点 修复破损aof文件 到底用RDB还是AOF 引言 AOF就相当于上面的日志形式。是追加式备份。所有发生的写操作&#xff0c;新增啊&#xff0c;修改啊&#xff0c;删除啊&#xff0c;这些命…