基于AT89C52做秒表0~99秒

1、应网友要求做了个秒表。

2、定期器采用10毫秒,数码管后2位显示的是毫秒,故100毫秒进1秒,100毫秒*定时器10毫秒故就是1秒。

3、使用3个独立按键,按键2表示启动秒表,按键3表示暂停秒表,按键4表示清除秒表且暂停秒表。

4、已在我的清翔51开发板上实现,表现良好(只是按键的时候数码管会灭),这个我就不解了,需要用定时器做按键判断。

main.c

#include "Time.h"
#include "key.h"
#include 
#include "dt.h"

void main(void)
{
	unsigned char dt_state=1;//数码管标志位
	Timer0_16bit(10);//配置初始化定时器0为10毫秒
	convert_data(9999,4);//初始化数码管
	while(1)
	{
		if(dt_state)//主程序驱动数码管标志位
		{
			dt_display(4);//使用主程序驱动数码管
		}
		switch(key2345())
		{
			case 2:TR0=1;dt_state=0;break;//启动秒表,且使用定时器驱动数码管
			case 3:TR0=0;dt_state=1;break;//暂停秒表,且使用主程序驱动数码管
			case 4:TR0=0;TIME=0;convert_data(TIME,4);dt_state=1;break;//清除时间,且暂停计时器,且使用主程序驱动数码管
			break;
		}
	}
}

delay.h

//这是一个延迟函数为毫秒级//
#ifndef __DELAY_H__
#define __DELAY_H__
void delay_ms(unsigned char ms);//最大输入255,ms=1,最小1ms时间
#endif // !__DELAY_H__

 delay.c

//软件延迟ms级别
void delay_ms(unsigned char ms)	//设置毫秒级别延迟函数,z最大输入65535
{
	unsigned char x;
	for (; ms > 0; ms--)
		for (x = 114; x > 0; x--);
}

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include 
#include "delay.h"

//独立按键 
sbit key_S2 = P3^0;
sbit key_S3 = P3^1;
sbit key_S4 = P3^2;
sbit key_S5 = P3^3;

#define key_all P3

//按键占用P3口
unsigned char key2345(void); //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次

#endif // !__KEY_H__

key.c

//独立按键 S2		S3	 S4		S5
//分别对应 P30	P31	 P32	P33
#include"key.h"

//独立按键使用switch语句
unsigned char key2345(void) //函数返回值为2、3、4、5分别对应按键2、按键3、按键4、按键5,本函数只循环一次
{
	key_all |= 0x0f;
	if ((key_all&0x0f) != 0x0f)	//&运算符没有!=高,故需要加()括号
	{
		delay_ms(10);
		if ((key_all & 0x0f) != 0x0f)
		{
			switch (key_all & 0x0f)
			{
			case 0x0e:while ((key_all & 0x0f) != 0x0f);return 2;	//while在这里进行松手检测
			case 0x0d:while ((key_all & 0x0f) != 0x0f);return 3;	//while在这里进行松手检测
			case 0x0b:while ((key_all & 0x0f) != 0x0f);return 4;	//while在这里进行松手检测
			case 0x07:while ((key_all & 0x0f) != 0x0f);return 5;	//while在这里进行松手检测
			}
		}
	}
	return 0;//没有按键按下时返回0
}

Time.h

#ifndef __TIME_H__
#define __TIME_H__

#include 

extern unsigned int TIME;
//定时器0初始化,并设定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_bit_ms);

#endif // !__TIME_H__

Time.c

#include "Time.h"
#include "dt.h"

static unsigned char H0 = 0, L0 = 0;
unsigned int TIME=0;
//定时器0初始化,设定ms毫秒且工作方式1,16位模式
void Timer0_16bit(unsigned char time0_16_bit_ms)
{
    TMOD |= 0x01;
    TH0 =(65536 - (unsigned int)(time0_16_bit_ms * 921.6)) / 256;//需将计算的小数转换整形
    TL0 =(65536 - (unsigned int)(time0_16_bit_ms * 921.6)) % 256;//需将计算的小数转换整形
    H0 = TH0;
    L0 = TL0;
    EA = 1;//开启总中断
    ET0 = 1;//允许定时器0溢出进入中断
    TR0 = 0;//先关闭定时器
}
void Timer0Interrupt(void) interrupt 1
{
   TH0 = H0;
   TL0 = L0;
	 dt_display(4);//每隔10毫秒刷新一下4个数码管
	 convert_data(TIME,4);//每隔10毫秒转换一下时间
	 if(TIME++==9999)//数码管最大显示99.99秒
	 {
	  	TIME=0;
	 }
}

 

你可能感兴趣的:(51单片机,秒表,秒表,基于51单片机秒表设计,单片机)