51单片机0-99秒表计数器+60秒倒计时(数码管两位数)

news/2024/11/7 9:20:06/

51秒表计数器+倒计时(数码管两位数)

一:简介
我们实践的效果是用数码管显示0~99并在按下“转换键”后,实现60秒倒计时,并用蜂鸣器报警提示,兼并计数器和倒计时两种功能。
主要内容包括:
1.认识数码管
2.进行按键扫描
3.利用计时器计算分秒,利用中断将计算结果显示在数码管上。

二.硬件介绍
在这里插入图片描述

  1. 数码管相当于多个发光二极管组合,设想用它拼成了一个“8”,使用类型分为共阴和共阳。
    (共阳,即高电平接在一起,需要其他管脚输出相应低电平,即可点亮),共阴反之。

三.仿真电路图
在这里插入图片描述
功能介绍:在这里插入图片描述
四,程序代码

#include "reg52.h"
#include "intrins.h"#define uint unsigned int
#define uchar unsigned charuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit L4=P2^3;
sbit L3=P2^2;sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P1^0;
sbit K5=P1^1;
sbit K6=P1^2;
sbit beep=P2^4;uchar num,mum,n=0,m=60,shi,ge,shiw,gew;void delay(uint xms)				//延时子函数
{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);
}void Init()							//初始化子函数
{TMOD=0X01;						//设定定时器0的工作方式为1TH0=(65536-50000)/256;			//定时器装初值一个周期50msTL0=(65536-50000)%256;TH1=(65536-50000)/256;			//定时器装初值一个周期50msTL1=(65536-50000)%256;EA=1;							//开总中断				
}
void scankey()                                                //键盘检测子函数
{if(K1==0) 			             //检测键是否被按下{ET0=1;TR0=1;}if(K2==0){ET0=0;TR0=0;}if(K3==0){ET0=0;TR0=0;n=0;num=0;ge=0;shi=0;P0=table[0];	}if(K5==0) 			             //检测键是否被按下{ET1=1;TR1=1;}if(K6==0){ET1=0;TR1=0;}}void main()         
{Init();          //初始化子函数调用    while(1)
{    scankey();			//不断键盘扫描			if(K4==1)			 //不断键盘扫描	{ L4=1;                          //打开数码管个位位选	P0=table[ge];				 //数码管个位赋值delay(1);					 //延时 送入数据的反应时间L4=0;						 //关闭数码管个位位选delay(1);L3=1;						  //打开数码管十位位选	P0=table[shi];				  //送入数据delay(1);					  L3=0;						  //关闭数码管十位位选delay(1);}else{   L4=1;                          //打开数码管个位位选	P0=table[gew];				 //数码管个位赋值delay(1);					 //延时 送入数据的反应时间L4=0;						 //关闭数码管个位位选delay(1);L3=1;						  //打开数码管十位位选	P0=table[shiw];				  //送入数据delay(1);					  L3=0;						  //关闭数码管十位位选delay(1);}}}
void Timer0()interrupt 1			   
{TH0=(65536-50000)/256;			   //定时器重装初值TL0=(65536-50000)%256;num++;if(num==20)						  //定时器每进行一个周期num加1,运行20个周期即为1s{num=0;						  //到1秒,num清0重新开始n++;						  //倒计时1秒if(n==99)n=0;shi=n/10;				  //两位数分离赋给数码管十位显示ge=n%10;					  //两位数分离赋给数码管个位显示}
}	void Timer1()interrupt 3			   
{TH1=(65536-50000)/256;			   //定时器重装初值TL1=(65536-50000)%256;mum++;if(mum==200)				  //之前的是20,运行不能实现,不过写200实测准确{mum=0;						  //到1秒,num清0重新开始m--;						  //倒计时1秒if(m==0){m=60;beep=0;delay(20);}shiw=m/10;				  //两位数分离赋给数码管十位显示gew=m%10;					  //两位数分离赋给数码管个位显示}
}	说明:1.代码并非最简,不过便于理解。
(详细工程已上传到下载中心,需要的可以自提)

http://www.ppmy.cn/news/615620.html

相关文章

使用定时器按键扫描数码管制作一个可存储数据的秒表

目录 1.前言 1.1实验现象 1.2 项目资源 2.主要程序及解释 2.1中断中进行按键扫描 2.2 中断中进行数码管扫描 2.3中断中进行秒表的驱动 2.4主函数 1.前言 1.1实验现象 实验现象:按下K1并松开按键秒表开始计时,按下K2并松开按键秒表停止计时&…

【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。

LCD1602显示字符和时间是最基本的实验,在综合前面所学知识并结合c语言程序设计,就可以通过独立按键,来对时间进行校准,计时等功能、或者通过矩阵键盘的按键进行输入,进而让LCD屏上显示的出我们想要的内容和效果。应实验…

KST-51单片机:c语言编程实现数码管动态显示秒表的倒计时

/*60S倒计时*/ /*个位每1S变一次&#xff0c;从0&#xff5e;9*/ /*十位,个位为0的下一秒十位发生变化*/#include<reg52.h>sbit ADDR0P1^0; sbit ADDR1P1^1; sbit ADDR2P1^2; sbit ADDR3P1^3; sbit ENLEDP1^4;unsigned char code LedChar[] { 0xC0,0xF9,0xA4,0xB0,0x99,0…

stm32倒计时秒表proteus_单片机课程设计倒计时秒表教程文件

精品文档 精品文档 一、设计目的 此次设计是我们更进一步了解基本电路的设计流程&#xff0c;提高自己的设计理念&#xff0c; 丰富自己的理论知识&#xff0c;巩固所学知识&#xff0c;使自己的动手动脑能力有更进一步提高&#xff0c; 为自己今后的学习和工作打好基础&#x…

android手机时钟、闹钟、计时器、秒表app源码

简 介 此多功能闹钟界面采用TabHost框架&#xff0c;头部包含分别用LinearLayout水平布局显示四个标签闹钟&#xff0c;时钟&#xff0c;计时器和秒表&#xff0c;FrameLayout框架内部采用LinearLayout垂直布局。功能事件的基本实现分别有AlarmView类&#xff0c;AlarmReceiver…

60秒倒计时器 秒表 c语言程序,用单片机设计一个两位LED显示的秒表,按下计时键时,进行60s倒计时显示...

满意答案 w86586tk3y 2017.09.25 采纳率&#xff1a;57% 等级&#xff1a;8 已帮助&#xff1a;214人 #include sbit P3_5 P3^5; unsigned char code dispcode[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; unsigned char …

verilog秒表计时器

本设计是使用verilog实现秒表计时器。 秒表指示的时间由nexys4 DDR开发板的8个数码管显示,从左到右数码管的前两个显示小时(范围0-24),第3-4个数码管显示分(范围0-59,计数到60,向小时位进1),第5-6个数码管显示秒(范围0-59,计数到60向分位进1),第7-8个数码管显示毫…

前端文件上传的几种交互造轮子

背景 前端文件上传本来是一个常规交互操作&#xff0c;没什么特殊性可言&#xff0c;但是最近在做文件上传&#xff0c;需要实现截图粘贴上传&#xff0c;去找了下有没有什么好用的组件&#xff0c;网上提供的方法有&#xff0c;但是没找完整的组件来支持 cv 上传&#xff0c;…