51實現數碼管顯示按鍵可調定時器

其硬件之利用到了一個38譯碼器,其他的看引腳定義即可推斷出

實現的按鍵調節定時時間,啓動後進行倒計時,當倒計時完成後,蜂鳴器報警

 

#include<reg52.h>        
#include<intrins.h>     

//引腳定義,使用情況四個按鍵,三個譯碼器端口連接
sbit beep = P1^5;
sbit key1 = P1^1;
sbit key2 = P1^2;
sbit key3 = P1^3;
sbit key4 = P1^4;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit AD = P3^2;
unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};                 
unsigned char temp[8];                                                               
char hour; minute; second, num, t, i;



void delay(unsigned int t);
void initial();
void delay20ms();
void keyscan();
void caifen();
void display();

void main()
{
    initial();                        
    
      while(1)
      {
        
        keyscan();                          
        caifen();                          
        display();
				if((hour==0)&&(minute==0)&&(second ==0))
					{TR0=0;
					 beep =1;   //此處蜂鳴器並沒有正常,可能是電流問題?
					 delay(10);
					}        
			}
}

//對定時器進行配置初始化
void initial()
{	 
    TMOD = 0x01;                               
    TH0 = (65536 - 2000)/256;                
    TL0 = (65536 - 2000)%256;
    EA = 1;                                                                  
    TR0 = 1;                                 
    ET0 = 1;                                    
    hour = 1;                              
    minute = 0;                            
    second = 1; 
		beep = 0;
}



//時間的標準定義
void time0(void) interrupt 1
{
    TH0 = (65536 - 2000)/256;             
    TL0 = (65536 - 2000)%256;

    num ++;                              
    if (num == 500)
    {
        num = 0;
        second --;
        if (second == -1)                
        {
            second = 9;
            minute --;
            if (minute == -1)       
            {
                
               
                minute = 9;
                hour --;
                if (hour == -1)   
                {
                    hour = 0;
                }
            }
        }
    }
                
}     


//接收按鍵的掃描
void keyscan()
{
        if(key1 == 0)
        {
            delay20ms();                   
            while(key1 == 0);                                 
                TR0 = 0;               
                t ++;                                         
        }
                   
        switch(t)                   
					{
            case 1:
            if(key2 == 0)
            {
                delay20ms();
                if(key2 == 0)
                {
                    while(key2 == 0);
                    hour ++;
                    if(hour == 10)
                    {
                        hour = 0;
                    }
                }
            }
            
            if(key3 == 0)
            {
                delay20ms();
                if(key3 == 0)
                {
                    while(key3 == 0);
                    hour --;
                    if(hour == -1)       
                    {
                        hour =9;
                    }
                }
            }

            break;

            case 2:
            
            if(key2 == 0)
            {
                delay20ms();
                if(key2 == 0)
                {
                    while(key2 == 0);
                    minute ++;
                    if(minute == 10)
                    {
                        minute = 0;
                    }
                }
            }
            if(key3 == 0)
            {
                delay20ms();
                if(key3 == 0)
                {
                    while(key3 == 0);
                    minute --;
                    if(minute == -1)
                    {
                        minute = 9;
                    }
                }
            }
            break;
            
            case 3:
            TR0 = 1;                          
            t = 0; 
            break;
            
            default:                       
            break;                       
            
        }    
}


//對數據進行簡單的處理
void caifen()
{
            
         temp[0]=duanma[hour%10];       
		 temp[1]=duanma[minute%10];
         temp[2]=duanma[second%10];        
}


//數碼管進行顯示
void display()
{
	unsigned int i;
	for(i=0;i<3;i++)
	{
		switch(i)	
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;
			case(1):
				LSA=1;LSB=0;LSC=0; break;
			case(2):
				LSA=0;LSB=1;LSC=0; break;
			default: break;
		}
		P0=temp[i];
		delay(100); 
		P0=0x00;
	}
}


//20ms
void delay20ms(void)   
{
    unsigned char a,b;
    for(b=215;b>0;b--)
        for(a=45;a>0;a--);
    _nop_;       
    _nop_;       
}



void delay(unsigned int i)
{
    while (i --);
}

譯碼器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章