51单片机——秒表(定时器实现)

此程序基于普中51单片机编写
涉及到的原理图:
在这里插入图片描述在这里插入图片描述
具体功能
下载程序后,数码管显示00,当第一次按下K3时,定时器开始计时,数码管最右侧两个位以间隔为1s的时间从00到60显示数字;当第二次按下K3时,定时器停止计时,数码管显示当前计时数字;第三次按下K3时,数码管恢复初始情况,显示00

/*********************************************************************************
实验现象:显示秒表功能,从00秒到60秒计时,在数码管中显示出来
         另外的实现功能,第一次按下K3按键开始计数,第2次按下K3键停止计数,第三次按下归零		 											
********************************************************************************/
#include <reg51.h>			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit K3=P3^2;
u8 code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};     //显示0~F的值
u8 second;
u8 key=0;	
/*****************************************************************************
* 函 数 名 : delay1ms
* 函数功能 : 延时函数,t=1 时,大约延时 1ms
*****************************************************************************/
void delay1ms(u16 t)
{
	u16 i,j;
	for(i=0;i<t;i++)
	{
		for(j=0;j<120;j++);	
	}
}
/*******************************************************************************
* 函 数 名         : ExitInit
* 函数功能		   : 初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ExitInit()
{
	  TMOD =0X01;     //选择为定时器0模式,工作方式1,仅用TR1打开启动。
	  ET0=1;     //打开定时器1中断允许
	  EA=1;      //打开总中断
	  second=0;
      TH0=0xFC;  //设定初值,1ms
      TL0=0x18;
   	  P3=0xff;
	  P0=0x00;
}
/*******************************************************************************
* 函 数 名       :Display
* 函数功能		 : 数码管显示函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void Display(u8 s)
{
	   LSA=1;LSB=0;LSC=0;        
		P0=table[s/10];          //从右到左第二个数码管显示十位
   	    delay1ms(5);	        //消抖5ms
        P0=0x00;	
		LSA=0;LSB=0;LSC=0;
		P0=table[s%10];           //最右边数码管显示个位
		delay1ms(5);	      //消抖5ms
	    P0=0x00;                      //消隐
}
/*******************************************************************************
* 函 数 名       :Keyscan
* 函数功能		 : 按键扫描函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void Keyscan()
{
	if(K3==0)                //判断K3键是否按下
	{ 
		delay1ms(10);	 //消抖10ms        
		if(K3==0)               //再次判断K3键是否按下
		{
			key++;                //计算按下按键的次数
			switch(key)
			{
				case 1: TR0=1; break;      //按下第一次,开始计数
				case 2: TR0=0; break;                     //按下第二次,停止计数
				case 3: key=0; second=0;TR0=0;break; //按下第三次,数码管归零
				default: break;
			}
		}
		while(!K3);           //松手检测
	}
}
/*******************************************************************************
* 函 数 名       :Display
* 函数功能		 : 数码管显示函数
*******************************************************************************/
void main()
{
	ExitInit();            //初始化函数
  while(1)
	{
		Display(second);          //数码管显示函数
		Keyscan();          //按键扫描函数 
	}
}
/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 3
* 函数功能		   : 定时器1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{
	static u16 timer;
	TH0=0XFC;	          //给定时器赋初值,定时1ms
	TL0=0X18;
	timer++;
	if(timer==1000)      //判断是否达到1s
	{
		timer=0;          
		second++;         //计时达到1s就加1
		if(second==60)      //判断是否达到60s
			second=0;	        
	}	
}

(在草稿里待了两年。。。今天突然看到)

  • 25
    点赞
  • 243
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值