51单片机实现10秒秒表功能

10秒秒表
首次按键计时开始,再次按键暂停,第三次按键清零。
电路如图:
在这里插入图片描述
程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P3^7;
uchar i,Second_Counts,Key_Flag_Idx;
bit Key_State;
uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延时
void DelayMS(uint ms)
{
	uchar t;
	while(ms--) for(t=0;t<120;t++);
}
//处理按键事件
void Key_Event_Handle()
{
	if(Key_State==0)
	{
		Key_Flag_Idx=(Key_Flag_Idx+1)%3;
		switch(Key_Flag_Idx)
		{
			case 1:	EA=1;ET0=1;TR0=1;break;
			case 2:	EA=0;ET0=0;TR0=0;break;
			case 0:	P0=0x3f;P2=0x3f;i=0;Second_Counts=0;
		}
	}
}
//主程序
void main()
{
	P0=0x3f;			 	//显示00
	P2=0x3f;
	i=0;
	Second_Counts=0;	 
	Key_Flag_Idx=0;		 	//按键次数(取值0,1,2,3)
	Key_State=1;		 	//按键状态
	TMOD=0x01;				//定时器0方式1
	TH0=(65536-50000)/256;		//定时器0:15ms
	TL0=(65536-50000)%256;
	while(1)
	{
		if(Key_State!=K1)
		{
			DelayMS(10);
			Key_State=K1;
			Key_Event_Handle();
		}
	}
}
//T0中断函数
void DSY_Refresh() interrupt 1
{
	TH0=(65536-50000)/256;		//恢复定时器0初值
	TL0=(65536-50000)%256;
	if(++i==2)				//50ms*2=0.1s转换状态
	{
		i=0;
		Second_Counts++;
		P0=DSY_CODE[Second_Counts/10];
		P2=DSY_CODE[Second_Counts%10];
		if(Second_Counts==100) Second_Counts=0;	//满100(10s)后显示00
	}
}
  • 12
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
51单片机实现60秒表计时器的代码如下: ```c #include <reg52.h> sbit S1 = P3^2; // 开始/暂停按键 sbit S2 = P3^3; // 复位按键 unsigned char second = 0; // 计时器计数器 void delay(unsigned int ms) // 延时函数 { unsigned int i, j; for (i = ms; i > 0; i--) { for (j = 125; j > 0; j--); } } void timer0Init() // 定时器0初始化 { TMOD |= 0x01; // 设置定时器0为模式1 TH0 = 0x4c; // 设置定时器0的初值为0x4c06,计时1ms TL0 = 0x06; ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 TR0 = 1; // 启动定时器0 } void timer0() interrupt 1 // 定时器0中断处理函数 { TH0 = 0x4c; TL0 = 0x06; if (S1 == 0) // 开始/暂停按键被按下 { delay(20); // 延时处理抖动 if (S1 == 0) // 确认按键被按下 { while (S1 == 0); // 等待按键释放 TR0 = ~TR0; // 启动/暂停计时器 } } if (S2 == 0) // 复位按键被按下 { delay(20); // 延时处理抖动 if (S2 == 0) // 确认按键被按下 { while (S2 == 0); // 等待按键释放 second = 0; // 计时器计数器清零 } } if (TR0 == 1) // 计时器正在计时 { if (++second >= 60) // 如果计时器计数器达到60,则重置计数器并闪烁LED { second = 0; P1 = 0xff; delay(500); P1 = 0x00; } } } void main() { timer0Init(); // 初始化定时器0 while (1); // 主循环 } ``` 这是一个基于定时器0的秒表计时器程序。当按下开始/暂停按键时,计时器开始计时;再次按下开始/暂停按键时,计时器暂停计时。当按下复位按键时,计时器计数器清零。当计数器累加到60时,LED会闪烁一次,表示计时器计满了60

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值