51单片机——秒表(定时器扫描独立按键和数码管)

这篇具有很好参考价值的文章主要介绍了51单片机——秒表(定时器扫描独立按键和数码管)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、写在前面

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

二、主要模块改进

改进的总体思路是:

  1. 只是用定时器替代延时函数,保证原有的功能不变。
  2. 定义一个被定时中断函数调用的Loop函数。
  3. 定义一个被主函数调用的新函数。该函数与原来函数的参数和返回值相同。

2.1 独立按键模块

        之前的独立按键模块功能就是:检测到松手信号,就把按键值返回,没有按键按下就返回0。中间有用延时函数消除按键抖动。

#include <REGX52.H>
unsigned char Keynum;
unsigned char key()
{
	unsigned char temp=0;
	temp=Keynum;
	Keynum=0;
	return temp;
}
unsigned char Independentkey()
{
	unsigned char keynum=0;
	if(P3_1==0){keynum=1;}
	if(P3_0==0){keynum=2;}
	if(P3_2==0){keynum=3;}
	if(P3_3==0){keynum=4;}

	return keynum;
}
void Key_Loop()
{
	static unsigned char Last_state,Now_state;
	Last_state=Now_state;
	Now_state=Independentkey();
	if(Last_state==1&&Now_state==0)//松手检测
	{
		Keynum=1;
	}
	if(Last_state==2&&Now_state==0)//松手检测
	{
		Keynum=2;
	}
	if(Last_state==3&&Now_state==0)//松手检测
	{
		Keynum=3;
	}
	if(Last_state==4&&Now_state==0)//松手检测
	{
		Keynum=4;
	}
}

2.2 数码管显示模块

        之前数码管功能是:指定哪一位,显示什么数字。数码管显示在进行段选清零或者位选清零之前,有短暂的延时是通过延时函数来完成的。

#include"Displaytube.h"
unsigned char Nixie_segs[9]={0,10,10,10,10,10,10,10,10};
void Set_Nixiesegs(unsigned char bits,number)//设置数组
{
	 Nixie_segs[bits]=number;
}
void Displaytube(unsigned char bits,segs)//bits:位选	segs:段选
{	
	static unsigned char tube[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //0~9,不显示,-
	 //位选
	 P0=0x00;
	switch(bits)
	{
		case 1:P2_4=0;P2_3=0;P2_2=0;
			break;
		case 2:P2_4=0;P2_3=0;P2_2=1;
			break;
		case 3:P2_4=0;P2_3=1;P2_2=0;
			break;
		case 4:P2_4=0;P2_3=1;P2_2=1;
			break;
		case 5:P2_4=1;P2_3=0;P2_2=0;
			break;
		case 6:P2_4=1;P2_3=0;P2_2=1;
			break;
		case 7:P2_4=1;P2_3=1;P2_2=0;
			break;
		case 8:P2_4=1;P2_3=1;P2_2=1;
			break;
		default:
			break;
	}
	//段选
	P0=tube[segs];	
}
void Nixie_Loop()
{
	static unsigned char i=1;
	Displaytube(i,Nixie_segs[i]);
	i++;
	if(i>8)i=1;
}

三、测试文件test.c

#include <REGX52.H>
#include"IndependentKey.h"
#include"Displaytube.h"
#include"Timer0_Init.h"
#include"AT24C02.h"
#include"Delay.h"
unsigned char millsec,sec,min;
unsigned char Stopmode=1;
void watch_show()
{
		Set_Nixiesegs(8,min/10);
		Set_Nixiesegs(7,min%10);
		Set_Nixiesegs(6,11);
		Set_Nixiesegs(5,sec/10);
		Set_Nixiesegs(4,sec%10);
		Set_Nixiesegs(3,11);
		Set_Nixiesegs(2,millsec/10);
		Set_Nixiesegs(1,millsec%10);
		if(millsec>99)
		{
			sec++;
			if(sec>59)
			{
				min++;
				sec=0;
			}
			millsec=0;	
		}
}
int main()
{
	unsigned char keynum=0; 
	Timer0_Init();
	while(1)
	{
		keynum=key();
		if(keynum!=0)
		{
			if(keynum==1)  //暂停
			{
				Stopmode=!Stopmode;	
			}
			if(keynum==2)  //复位
			{
				millsec=0;
				min=0;
				sec=0;
			}
			if(keynum==3) //保存到AT24C02
			{
				AT24C02_Writebyte(0x01,min);
				Delay(5);//写周期
				AT24C02_Writebyte(0x02,sec);
				Delay(5);
				AT24C02_Writebyte(0x03,millsec);
				Delay(5);	
			}
			if(keynum==4) //读出数据
			{
				min=AT24C02_Readbyte(0x01);
				sec=AT24C02_Readbyte(0x02);
				millsec=AT24C02_Readbyte(0x03);
			}	
		}
		watch_show();
	}
}
void Timer0_ISR() interrupt 1
{	
	static int count1,count2,count3=0;
	count1++;
	count2++;
	count3++;
	TH0=0xfc;
	TL0=0x18;
	if(count1==20) //20ms
	{
		count1=0;
		Key_Loop();
	}
	if(count2==2) //2ms
	{
		count2=0;
		Nixie_Loop();
	}
	if(count3==10) //10ms
	{
		count3=0;
		if(Stopmode==0)
			millsec++;
	} 
}

四、效果简述

  • 启动的时候,数码管显示"00-00-00"。
  • 按下key1键,秒表开始计时。
  • 再按下key1键,秒表暂停。
  • 按下key2键,秒表清零。
  • 按下key3键,保存数据到AT24C02中。
  • 按下key4键,可以读取AT24C02中存储的数据(掉电不丢失)。

 文章来源地址https://www.toymoban.com/news/detail-497168.html

 

 

到了这里,关于51单片机——秒表(定时器扫描独立按键和数码管)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 51单片机——定时器中断

    新版51单片机内部有 3 个16位可编程的定时器/计数器,即定时器 T0,T1,T2 。他们既有 定时 功能又有 计数 功能,我们可以通过配置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能;其中需要注意的是,这个定时器系统是单片机内部的一个独立的硬件部分,它与

    2023年04月10日
    浏览(44)
  • 51单片机定时器实验(汇编)

    基于AT89C51的定时器实验,汇编语言,分享出来是希望各位能共同学习。附上注释希望能认真研究,若有错误请指出,谢谢。 一、实验目的 掌握单片机定时器的使用方法。 掌握中断的使用方法。 二、实验内容 采用中断方式控制定时器。使得单片机P1.0引脚产生周期为1S的方波

    2024年02月11日
    浏览(59)
  • 51单片机之定时器篇

    首先,学好单片机必须要搞懂定时器,定时器是单片机重要的组成部分之一,总之,学不好定时器,单片机相当于没学,下面就让我介绍如何学好单片机定时器。 学习单片机首先要明白的: 1,51单片机有两组定时器/计数器,既可以定时,又可以计数,总称之定时器 2,单片

    2024年02月11日
    浏览(54)
  • 51单片机 | 定时器中断实验

      这一节介绍51单片机的定时器中断。 STC89C5X 含有 3 个定时器:定时器 0、定时器 1、定时器 2(注意: 51 系列单片机一定有基本的 2 个定时器(定时器 0 和定时器 1),但不全有 3 个中断,需要查看芯片手册,通常我们使用的是基本的 2 个定时器:定时器 0/1)。本节要实现

    2024年02月06日
    浏览(111)
  • 51单片机PWM(定时器)

    目录 前言 一、PWM的介绍 二、在定时器中配置PWM 三、代码  总结         PWM普遍应用于惯性系统,我们知道单片机几乎只能输出“1”和“0”两种状态,即开和关,想要输出模拟量是不太容易实现的,那么怎样才能使单片机输出平滑的线性信号呢?没接触过PWM的小伙伴可能第

    2024年02月09日
    浏览(55)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(98)
  • 51单片机定时器基础知识

    经验总结:定时器0工作方式1的溢出中断初始值计算 1.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00) TH0=0x4c,TL0=0x00 2.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x

    2024年02月04日
    浏览(115)
  • 51单片机定时器中断TMOD

    最近在学定时器中断TMOD,写程序时,要对定时器进行配置 对TMOD进行赋值时,拌了好久。。。。 如何根据所用的      定时器0/1 ,  工作方式0/1/2/3      对TMOD赋值呢? 我们知道: 1.TMOD长这样 :  由八位组成,前四位是T1的参数;后四位是T0的参数;GATE 和 C/T\\\' 不用多讲,

    2024年02月12日
    浏览(47)
  • 51单片机中断定时器1用法

    中断为使单片机具有对内部或外部随机发生的事件实时处理而设置的。 中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点: 1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。 2. 实时操作:CPU能够及时处理应用系统的随机事

    2024年02月06日
    浏览(61)
  • 【单片机c51】定时器应用1

    1.系统时钟为12MHz,编程实现从P1.0引脚输出一个周期为2ms的方波。 注:要想产生一个周期2ms的方波,定时器应产生1ms的周期性的定时,定时对P1.0求反。选择定时器T0,方式1定时,采用中断方式,GATE不起作用。   注:1.EA=1 所有的中断请求被开放 2.ET0=1  允许T0溢出的请求 3.T

    2024年02月04日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包