江科大STC51定时器闹钟改编项目:秒表

江科大STC51定时器闹钟改编项目:秒表

实现功能:

显示:分:秒:毫秒
按下按键K1秒表开始计时
按下按键K2秒表暂停计数,可再次开启计时
按下按键K3秒表归零,回到初始状态。

使用外设:LCD1602,按键K1,2,3
内部功能:定时器,延时函数

主函数代码

#include <REGX52.H>
#include "Timer0.h"
#include "delay.h"
#include "LCD1602.h"
#include "key.h"

unsigned int msec;
unsigned char sec, min;
unsigned char start,stop, clear;


void main()
{
	LCD_Init();
	Timer0_Init();
	
	LCD_ShowString(1, 1, "StopWatch");
	LCD_ShowChar(2, 3, ':');
	LCD_ShowChar(2, 6, ':');
	while(1)
	{
		unsigned char keynum=key();
		if(keynum)  //只有按下按键,才会改变start,stop,clear变量的状态,否则维持不变
		{
			if(keynum==1)  //按下D1,秒表开始计数,并且允许再次暂停
			{
				start=1;
				stop=0;
				clear=0;
			}
			else if (keynum==2) //按下D2,秒表暂停计数,并且允许再次开始计数
			{
				stop=1;
				start=0;
			}
			else if(keynum==3) //按下D3,秒表暂停计数,并清零。回到初始状态:显示00:00:00
			{
				clear=1;
				start=0;
				stop=0;
				msec=sec=min=0;
			}
		}
		
		LCD_ShowNum(2, 1, min, 2);
		LCD_ShowNum(2, 4, sec, 2);
		LCD_ShowNum(2, 7, msec/10, 2);
	}
}

void Timer0_Routine() interrupt 1  //在中断函数里不要执行过长的任务
{
	TL0= 0x18;
	TH0= 0xFC;

	
	if(start==1&&stop==0&&clear==0)  //秒表按下,开始计数
	{
		msec++;
		if(msec>=1000)
		{
			msec=0;
			sec++;
			if(sec>=60)
			{
				sec=0;
				min++;
				if(min>=60)min=0;
			}
		}	
	}
	
}

clear变量可要可不要

定时器C文件

#include <REGX52.H>

void Timer0_Init()  //定时器初始化,将定时器中断时间定位1ms
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

//定时器中断函数模板
//void Timer0_Routine() interrupt 1
//{
//	static unsigned int T0Count;
//	TL0= 0x18;
//	TH0= 0xFC;
//	T0Count++;
//	
//	if(T0Count>=1000)
//	{
//		T0Count=0;
//	}
//}

延时函数C文件

延时时间为1ms

void delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		}while (--i);	
		xms--;
	}
}

按键C文件

防抖,读取按下按键松开瞬间

#include <REGX52.H>
#include "delay.h"

unsigned char key()
{
	unsigned char keynumber=0;
	if(P3_1==0)
	{
		delay(20);
		while(P2_1==0);
		delay(20);
		keynumber=1;
	}
	if(P3_0==0)
	{
		delay(20);
		while(P2_1==0);
		delay(20);
		keynumber=2;
	}
	if(P3_2==0)
	{
		delay(20);
		while(P2_1==0);
		delay(20);
		keynumber=3;
	}
	if(P3_3==0)
	{
		delay(20);
		while(P2_1==0);
		delay(20);
		keynumber=4;
	}
	
	return keynumber;
}

LCD1602C文件在哔站搜江协科技评论找。
手机摄像头一对准单片机,LED灯就闪烁,然后LCD屏的秒表也自动归零了,不知道原因。。。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值