1. 程式人生 > >利用51微控制器做一個簡易時鐘

利用51微控制器做一個簡易時鐘

利用獨立鍵盤,數碼管完成一個簡易的時鐘,按鍵一可以修改時間,按鍵二可以設定鬧鐘,按鍵三進行加一操作,按鍵四進行減一操作。

主函式:

void main()
{
    bsp_init();
    while(1)
    {
        TimeTim();              //正常時間在走
        bsp_KeyScan();          //鍵盤掃描看哪個功能鍵被按下
        bsp_KeyProc(keyvalue);  //根據鍵值進行相應的功能處理 
        SetValueShow();         //數碼管上顯示的值
        ShowSegCC()
; //顯示在數碼管上 bsp_CheckAlarm(); //鬧鐘檢查 } }

時鐘模組:

unsigned char hour = 2, min = 2, sec = 3;       //設定時間初值
unsigned char ahour = 0, amin = 0, asec = 0;    //設定鬧鐘初值
unsigned char time = 0;

void delay_us(unsigned char t)
{
    while(--t);
}

void delay_ms(unsigned int t)   //t最大為255
{ while(t--) { delay_us(245); delay_us(245); } } void TimeTim() { if(settype == 0 && alarmvalue == 0) //當不在鬧鐘狀態也不在修改時間狀態的時候時間正常走 { if(count == 20) { count = 0; sec++; if(sec == 60) { sec = 0
; min++; if(min == 60) { min = 0; hour++; if(hour == 24) { hour = 0; } } } } } } //檢查時間是否到了鬧鐘時間 void bsp_CheckAlarm(void) { if((hour == ahour) && (min == amin) && (sec == asec)) { hour = 0; min = 0; sec = 0; } }

鍵盤模組:

sbit SETTIME = P0^0;    //修改時間
sbit SETALARM = P0^1;   //設定鬧鐘
sbit INC = P0^2;        //加1
sbit DEC = P0^3;        //減1

unsigned char keyvalue = 0;
unsigned char settype = 0;      //0是初始狀態正常顯示,1是修改秒,2是修改分,3是修改時
unsigned char alarmvalue = 0;   //0是初始狀態,1是修改秒,2是修改分,3是修改時

void bsp_KeyScan(void)
{
    if(SETTIME == 0)//K1按鍵被按下
    {
        keyvalue = 1;
        while(!SETTIME);//等待按鍵釋放

    } 

    if(SETALARM == 0)
    {
        keyvalue = 2;
        while(!SETALARM);

    }

    if(INC == 0)
    {
        keyvalue = 3;
        while(!INC);
    }

    if(DEC == 0)
    {
        keyvalue = 4;
        while(!DEC);
    }
}

void bsp_KeyProc(unsigned char keyv)
{
    if(keyv == 1)
    {
        settype++;
        if(settype == 4)
        {
            settype = 0;
        }
        keyvalue = 0;    //鍵值要清0!!!
    }

    if(keyv == 2)
    {
        alarmvalue++;
        if(alarmvalue == 4)
        {
            alarmvalue = 0;
        }
        keyvalue = 0;
    }

    if(keyv == 3)
    {
        timeadd();
        keyvalue = 0;
    }

    if(keyv == 4)
    {
        timedec();
        keyvalue = 0;
    }
}

void timeadd()
{
    //設定時間加1
    if(settype == 1)
    {
        if(sec < 59)
        {
            sec++;
        }

        else
        {
            sec = 0;
        }
    }

    else if(settype == 2)
    {
        if(min < 59)
        {
            min++;
        }

        else
        {
            min = 0;
        }
    }

    else if(settype == 3)
    {
        if(hour < 23)
        {
            hour++;
        }

        else
        {
            hour = 0;
        }
    }

    //設定鬧鐘加1 
    if(alarmvalue == 1)
    {
        if(asec < 59)
        {
            asec++;
        }

        else
        {
            asec = 0;
        }
    }

    else if(alarmvalue == 2)
    {
        if(amin < 59)
        {
            amin++;
        }

        else
        {
            amin = 0;
        }
    }

    else if(alarmvalue == 3)
    {
        if(ahour < 23)
        {
            ahour++;
        }

        else
        {
            ahour = 0;
        }
    }
}

void timedec()
{

    //設定時鐘減1
    if(settype == 1)
    {
        if(sec > 0)
        {
            sec--;
        }

        else
        {
            sec = 59;
        }
    }

    else if(settype == 2)
    {
        if(min > 0)
        {
            min--;
        }

        else
        {
            min = 59;
        }
    }

    else if(settype == 3)
    {
        if(hour > 0)
        {
            hour--;
        }

        else
        {
            hour = 23;
        }
    }


    //設定鬧鐘減1
    if(alarmvalue == 1)
    {
        if(asec > 0)
        {
            asec--;
        }

        else
        {
            asec = 59;
        }
    }

    else if(alarmvalue == 2)
    {
        if(amin > 0)
        {
            amin--;
        }

        else
        {
            amin = 59;
        }
    }

    else if(alarmvalue == 3)
    {
        if(ahour > 0)
        {
            ahour--;
        }

        else
        {
            ahour = 23;
        }
    }
}

數碼管模組:

#define SEGPORT P1
sbit WEI = P2^1;
sbit DUAN = P2^0;

unsigned char code TableCA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};  //共陽數碼管段選碼錶,無小數點
unsigned char code TableSel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共陰數碼管位選碼錶
unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰數碼管段選碼錶,無小數點
unsigned char Show[8] = {0};
//unsigned int showvalue = 0;
//unsigned int time = 0;

void ShowSegCA(unsigned char t)
{
    SEGPORT = TableCA[t];   
}
//1到255顯示
void ShowSegCC(void)
{
    static unsigned char i = 0;

    //消隱
    SEGPORT = 0x00;
    DUAN = 1;
    DUAN = 0;

    //選通位碼
    WEI = 1;
    SEGPORT = TableSel[i];
    WEI = 0;

    //選通位碼
    DUAN = 1;
    SEGPORT = Show[i];
    DUAN = 0;

    i++;
    if(i == 8)
    {
        i = 0;
    }
    delay_ms(1);
}   

void SetValueShow(void)
{
    if(alarmvalue == 0) //當不在鬧鐘狀態時數碼管顯示正常的時間
    {
        Show[0] = TableCC[hour/10];
        if(settype == 3)
        Show[1] = TableCC[hour%10] | 0x80;
        else
        Show[1] = TableCC[hour%10];
        Show[2] = 0x40;
        Show[3] = TableCC[min/10];
        if(settype == 2)
        Show[4] = TableCC[min%10] | 0x80;
        else
        Show[4] = TableCC[min%10];
        Show[5] = 0x40;
        Show[6] = TableCC[sec/10];
        if(settype == 1)
        Show[7] = TableCC[sec%10] | 0x80;
        else
        Show[7] = TableCC[sec%10];
    }

    //在鬧鐘狀態數碼管顯示鬧鐘設定的時間
    else
    {
        Show[0] = TableCC[ahour/10];
        if(alarmvalue == 3)
        Show[1] = TableCC[ahour%10] | 0x80;
        else
        Show[1] = TableCC[ahour%10];
        Show[2] = 0x40;
        Show[3] = TableCC[amin/10];
        if(alarmvalue == 2)
        Show[4] = TableCC[amin%10] | 0x80;
        else
        Show[4] = TableCC[amin%10];
        Show[5] = 0x40;
        Show[6] = TableCC[asec/10];
        if(alarmvalue == 1)
        Show[7] = TableCC[asec%10] | 0x80;
        else
        Show[7] = TableCC[asec%10];
    }
}   

定時器模組:

unsigned char count = 0;
void Timer0_Init(void)
{
    TMOD |= 0x01;
    TH0 = (65536 - 50000)/256;
    TL0 = (65536 - 50000)%256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0(void) interrupt 1
{
    TH0 = (65536 - 50000)/256;
    TL0 = (65536 - 50000)%256;
    count++;
}