基於AT89C52做秒錶0~99秒

金絲草發表於2021-01-05

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 <reg52.h>
#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 <reg52.h>
#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 <REG52.h>

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;
	 }
}

 

相關文章