基于51单片机的倒计时秒表proteus仿真设计

这篇具有很好参考价值的文章主要介绍了基于51单片机的倒计时秒表proteus仿真设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序


一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于单片机的数字电子秒表倒计时设计,倒计时精度达0.05s了,解决了传统的由于倒计时精度不够造成的误差和不公平性,是各种体育竞赛的必备设备之一。本设计的数字电子秒表倒计时系统采用51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计倒计时器。将软、硬件有机地结合起来,使得系统能够实现六位LED显示,倒计时精度为0.05秒,能正确地进行倒计时,倒计时精度为0.05秒,能正确地进行倒计时,复位后倒计时重新回到初始状态。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种可调倒计时秒表。整个系统包括MCU、晶振电路、时钟电路、功能按键以及数码管显示。该系统利用共阳数码管实时显示时、分、秒倒计时,通过独立按键键盘设计控制倒计时秒表的启停、定时时间的设计。可具体实现以下功能:

(1) 按下设置键后,在数字闪烁的过程中,采用启动外部中断,能对增、减按键产生响应,。

(2) 按下启动键后,启动定时器;按下暂停键后,停止定时器。

(3)·定时器定时50ms,20次定时可产生1秒钟计时。

(4) 倒计时结束后,停止定时器。

(5) 最大定时99时59分59秒。

三、仿真演示

 初始化定时时间0时0分0秒。

基于51单片机的倒计时秒表proteus仿真设计
按下时间设置按键可以设置倒计时时间,通过连续按下时间设置按键可在时、分、秒设置来回切换,利用闪烁效果提示当前设置单位。

基于51单片机的倒计时秒表proteus仿真设计

 设置好倒计时时间后,利用启动键和停止键实现倒计时秒表的启停。

基于51单片机的倒计时秒表proteus仿真设计

四、源程序

#include <reg51.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 start_key = P3^0;	//启动按钮
sbit pause_key = P3^1;	//停止按钮
sbit set_key = P3^6;	//停止按钮

uchar disCode[10] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管段码 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

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;	//数码管闪烁标志


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;	//总中断开启
}
/******************************************************************************* 
* 函 数 名          : T0_INT
* 函数功能         : T0定时器中断函数10ms
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/ 
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;
			}
		}
	}
}

/******************************************************************************* 
* 函 数 名          : T0_INT1
* 函数功能         : T0定时器中断函数50ms
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/ 
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--;}
	 }
}

/******************************************************************************* 
* 函 数 名          : main
* 函数功能         : 主函数
* 输      入         : 无
* 输      出         : 无 
*******************************************************************************/  
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();	//防止按键重复检测
			}
		}
	}
}

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

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

/******************************************************************************* 
* 函 数 名          : Delay1ms (多个) 
* 函数功能         : 延时函数,延时n*1ms 
* 输      入         : 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++);	
}

链接:https://pan.baidu.com/s/1geHUYam9Q1vYHOVoBJWeyw 
提取码:b4fy 
 文章来源地址https://www.toymoban.com/news/detail-431867.html

到了这里,关于基于51单片机的倒计时秒表proteus仿真设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初学51单片机(STC89C52)一个倒计时显示器和大家分享

      想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。   通过加一,减一,乘2三个操作,

    2024年02月10日
    浏览(58)
  • 51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

    51单片机的简易篮球计分器倒计时仿真设计( proteus仿真+程序+原理图+报告+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0048 本设计旨在设计一个基于51单片机的篮球比赛计分器仿真设计,下面是设计的功能要求 1.可以在比赛期间随时更

    2024年02月09日
    浏览(50)
  • 单片机C51计时器秒表

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 单片机C51(或称8051)计时器秒表的实现原理如下: 原理解释: C51微控制器通常包括多个计时器/计数器,可

    2024年02月03日
    浏览(52)
  • 单片机STC89C52倒计时、数码管和蜂鸣器控制

    鱼弦:CSDN内容合伙人、CSDN新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 单片机选用STC89C52,实现倒计时60秒,控制两个数码管分别显示时间的十位和个位;当计时完毕时,显示\\\"-”,

    2024年02月04日
    浏览(45)
  • 基于51单片机的自制秒表

            基于LCD1602显示屏的自制秒表,可完成计时,暂停,继续,清零功能 1.1、实现功能 输入参数为延时时间长度,单位为毫秒,用于短暂延时 1.2、设计原理 从STC-ISP 中生成的延时1ms的代码修改得到的延时任意时间的函数 1.3、代码实现 2.1、实现功能 检测四个独立按键

    2024年02月09日
    浏览(40)
  • Verilog设计倒计时秒表

    目录 一.设计要求 二.模块总和 三.模块设计      1.顶层模块      2.分频模块      3.计数模块      4.倒计时模块      5.数码显示模块      6.管脚约束代码 四.引脚分配 五.演示视频 ①.用基于NEXY4 DDR开发板自带的时钟驱动电路,要求计时精确; ②.用开发板上的低 7 个开

    2024年02月05日
    浏览(44)
  • 基于AT89C51单片机的电子秒表设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87775018添加链接描述 源码获取 主要内容: 设计一个电子秒表,至少具有以下功能:开始/暂停、记录、复位等。设计方案主要分为实验的系统分析,具体的设计方案,以及最终的测试,最终完成实

    2024年02月16日
    浏览(58)
  • 基于AT89C51单片机的倒数计时器设计

    1.设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的数字电压表,设计的系统实用性强、操作简单,实现了智能化、数字化。 本设计采用单片机为主控芯片,结合 周边 电路组成 LED 彩灯的 闪烁 控制系统器,用来控制 红色 的LED 闪烁 发光,实现 LED灯在倒计时结束后

    2024年02月03日
    浏览(64)
  • 51单片机——秒表(定时器扫描独立按键和数码管)

            这次实验主要是用定时器来定时扫描独立按键和数码管,代替两个模块函数中的延时函数。用定时器定时扫描的好处就是,主函数中的延时并不会影响按键的检测和数码管的扫描,只会影响响应速度。因为定时器是溢出就会执行中断程序,是定时的扫描。 改进的

    2024年02月10日
    浏览(64)
  • 单片机AT89C51六位数码管秒表

    详细代码讨论加我QQ:1271370903   本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时

    2024年02月03日
    浏览(124)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包