用定時/計數器中斷 和 動態八段數碼管做一個秒表


用 定時/計數器中斷 和 動態八段數碼管做一個秒表

學以致用,簡單把定時器中斷和數碼管動態顯示結合一下。

1.思路

使用定時器來計數,然后把秒數變化顯示到數碼管上。

定時器

數碼管

2.主要代碼講解

void main()
{
	u16 a;
	a = 0;
	Time0Init();//定時器0中斷的初始化操作

	while(1)
	{   
	    if(i == 1000)//設定一次中斷是1ms,1000次是1s
		{
			i = 0;   //把計數的i清零,方便下一秒計數1000次
			led = ~led; //起到提示作用
            a++;    //累計的秒數
		}
		else if(i%25 == 0) //每25ms刷新一次
		{
			fenbian(a); // 數碼管顯示函數
	    }
	}
}

3.全部代碼參考(代碼寫的很爛,歡迎提出建議)

#include<reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit led = P2^0;
static u16 i;
static u16 a;

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i) 
{
	while(i--);
}

void Time0Init()
{
	TMOD|=0x01; 
	TH0 = 0xFC; 
	TL0 = 0x66;
	TR0 = 1;    
	ET0 = 1;     
	EA = 1;		 
	
} 

void fenbian(u16 a)
{	int b;
    int c;
	if(a<10)
	{
		LSC=0;LSB=0;LSA=0;
		delay(100);
		switch(a)
			{
				case(0):P0=smgduan[0];delay(100);break;
				case(1):P0=smgduan[1];delay(100);break;
				case(2):P0=smgduan[2];delay(100);break;
				case(3):P0=smgduan[3];delay(100);break;
				case(4):P0=smgduan[4];delay(100);break;
				case(5):P0=smgduan[5];delay(100);break;
				case(6):P0=smgduan[6];delay(100);break;
				case(7):P0=smgduan[7];delay(100);break;
				case(8):P0=smgduan[8];delay(100);break;
				case(9):P0=smgduan[9];delay(100);break;
			}
        P0 = 0x00;
	}
	else if(a>=10 && a<100)
	{
			LSC=0;LSB=0;LSA=0;
			b = a/1%10;
			switch(b)
				{
					case(0):P0=smgduan[0];delay(100);break;
					case(1):P0=smgduan[1];delay(100);break;
					case(2):P0=smgduan[2];delay(100);break;
					case(3):P0=smgduan[3];delay(100);break;
					case(4):P0=smgduan[4];delay(100);break;
					case(5):P0=smgduan[5];delay(100);break;
					case(6):P0=smgduan[6];delay(100);break;
					case(7):P0=smgduan[7];delay(100);break;
					case(8):P0=smgduan[8];delay(100);break;
					case(9):P0=smgduan[9];delay(100);break;
				}
			P0 = 0x00;
			
			LSC=0;LSB=0;LSA=1;
			c = a/10%10;
			switch(c)
				{
					case(0):P0=smgduan[0];delay(100);break;
					case(1):P0=smgduan[1];delay(100);break;
					case(2):P0=smgduan[2];delay(100);break;
					case(3):P0=smgduan[3];delay(100);break;
					case(4):P0=smgduan[4];delay(100);break;
					case(5):P0=smgduan[5];delay(100);break;
					case(6):P0=smgduan[6];delay(100);break;
					case(7):P0=smgduan[7];delay(100);break;
					case(8):P0=smgduan[8];delay(100);break;
					case(9):P0=smgduan[9];delay(100);break;
				}
			P0 = 0x00; 		
		}
	
}

void main()
{
	u16 a;
	a = 0;
	Time0Init();

	while(1)
	{   
	    if(i == 1000)
		{
			i = 0;
			led = ~led;
			a++;
		}
		else if(i%25 == 0)
		{
			fenbian(a);
	    }
	}
}

//中斷函數,但是我把處理放在主函數中,這樣可以保證計數的准確
void Time0() interrupt 1
{
    TH0 = 0xFC;
	TL0 = 0x66;
	i++;
}

參考https://blog.csdn.net/m0_50679156/article/details/120097808


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM