專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

一個鬧鐘的單片機程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2011年11月07日   【字體:

一個鬧鐘的單片機程序。

其中蜂鳴器接P37,我的單片機數(shù)碼管是四位共陽數(shù)碼管,接P0和P2,K1接P14,K2接P15,K3接P16,K4接P17。晶振采用12MHz。STC89C52

 

代碼如下:

//File: Clock.c
#include <REGX52.H>
const unsigned char LED7Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int hour,minute,second,cHour,cMinute;
bit isClick = 0;
unsigned char modify =0x00;//是否處于時間編輯狀態(tài)
bit isClock =0;//是否開啟鬧鐘

unsigned char timercount;
void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    timercount++;
    if(timercount==20)
    {
        timercount=0;
        second++;
        if(second==60)
        {
            minute++;
            second=0;
        }
        if(minute==60)
        {
            hour++;
            minute=0;
        }
        if(hour==24)
        {
            hour=0;
        }
    }   
}
//延遲
void Delay(unsigned int time)
{
    unsigned char a,b;
    for(a=0;a<time;a++)
            for(b=0;b<120;b++);
}

//用于顯示時間
void ShowTime(void)
{   
    unsigned int a,b, tempH,tempM;
    unsigned char showChar;
    if(modify==0x00 || modify ==0x01 || modify ==0x02)
    {
        tempH=hour;
        tempM=minute;
    }
    else
    {
        tempH=cHour;
        tempM=cMinute;
    }   
   
    if(modify==0x00 || modify ==0x01 || modify ==0x03)
    {
        //顯示第4個數(shù)碼管
        P0=0xFF;
        P2=0xFF;   
        a=tempH/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_3=0x00;
        Delay(1);//延遲很短
   
        //顯示第3個數(shù)碼管
        P0=0xFF;
        P2=0xFF;   
        b=tempH%10;
        showChar=LED7Code[b];
        P2_2=0x00;
        P0=showChar;
        Delay(1);//延遲很短
    }
   
    if(modify==0x00 || modify ==0x02 || modify ==0x04)
    {
        //顯示第2個數(shù)碼管
        P0=0xFF;
        P2=0xFF;   
        a=tempM/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_1=0x00;
        Delay(1);//延遲很短
   
        //顯示第1個數(shù)碼管
        P0=0xFF;
        P2=0xFF;   
        b=tempM%10;
        showChar=LED7Code[b];
        P2_0=0x00;
        P0=showChar;
        Delay(1);//延遲很短
    }
}

//蜂鳴器響
void Beep()    
{
   unsigned char i  ;
   for (i=0  ;i<100  ;i++)
   {
     Delay(100)  ;
     P3_7=!P3_7  ;   //Beep取反
   }
   P3_7=1  ;         //關(guān)閉蜂鳴器
   Delay(100);
  }

void main(void)
{
    unsigned int i;
    hour=12;
    minute=30;
    second=0;
    cHour=7;
    cMinute=0;
   
    TMOD=0x01;
    ET0=0x01;//定時器T0可以中斷
    EA=0x01;//表示允許所有的中斷
    TR0=0x01;//開始T0計時
   
    while(1)
    {
        if(P1_4==0x00)//按下了K1鍵,增加小時或分鐘
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x01://調(diào)整小時
                        hour++;
                        if(hour==24)
                            hour=0;
                        break;
                    case 0x02://調(diào)整分鐘
                        minute++;
                        if(minute==60)
                            minute=0;
                        break;
                    case 0x03://調(diào)整鬧鐘的小時
                        cHour++;
                        if(cHour==24)
                            cHour=0;
                        break;
                    case 0x04://調(diào)整鬧鐘的分鐘
                        cMinute++;
                        if(cMinute==60)
                            cMinute=0;
                        break;   
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_5==0x00)//按下了K2鍵,減少小時或分鐘
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x01://調(diào)整時間的小時                       
                        if(hour==0)
                            hour=23;
                        else
                            hour--;
                        break;
                    case 0x02://調(diào)整時間的分鐘                       
                        if(minute==0)
                            minute=59;
                        else
                            minute--;
                        break;
                  case 0x03://調(diào)整鬧鐘的小時                       
                        if(cHour==0)
                            cHour=23;
                        else
                            cHour--;
                        break;
                    case 0x04://調(diào)整鬧鐘的分鐘                       
                        if(cMinute==0)
                            cMinute=59;
                        else
                            cMinute--;
                        break;
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_6==0x00)//按下了K3鍵,更改模式,第一次修改小時,第二次修改分鐘,第三次恢復(fù)
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x00://不是修改狀態(tài),調(diào)整小時                   
                        modify=0x01;
                        break;
                    case 0x01://調(diào)整分鐘                   
                        modify=0x02;
                        break;
                    case 0x02://調(diào)整鬧鐘的小時       
                        modify=0x03;
                        break;
                    case 0x03://調(diào)整鬧鐘的分鐘       
                        modify=0x04;
                        break;
                    case 0x04://不修改       
                        modify=0x00;
                        break;               
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_7==0x00)//按下了K4鍵,開啟或關(guān)閉鬧鐘
        {
            if(!isClick)
            {
                isClock=~isClock;
                isClick=1;   
            }
        }
        else
            isClick=0;
       
        //鬧鐘是否響了
        if(isClock)
        {
            if(hour==cHour && minute == cMinute)
            {
                Beep();//響
            }
        }
        ShowTime();           
    }   
}
關(guān)閉窗口

相關(guān)文章