专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

一个闹钟的单片机程序

作者:佚名   来源:本站原创   点击数:  更新时间:2011年11月07日   【字体:

一个闹钟的单片机程序。

其中蜂鸣器接P37,我的单片机数码管是四位共阳数码管,接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;//是否处于时间编辑状态
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个数码管
        P0=0xFF;
        P2=0xFF;   
        a=tempH/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_3=0x00;
        Delay(1);//延迟很短
   
        //显示第3个数码管
        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个数码管
        P0=0xFF;
        P2=0xFF;   
        a=tempM/10;
        showChar=LED7Code[a];
        P0=showChar;
        P2_1=0x00;
        Delay(1);//延迟很短
   
        //显示第1个数码管
        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  ;         //关闭蜂鸣器
   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://调整小时
                        hour++;
                        if(hour==24)
                            hour=0;
                        break;
                    case 0x02://调整分钟
                        minute++;
                        if(minute==60)
                            minute=0;
                        break;
                    case 0x03://调整闹钟的小时
                        cHour++;
                        if(cHour==24)
                            cHour=0;
                        break;
                    case 0x04://调整闹钟的分钟
                        cMinute++;
                        if(cMinute==60)
                            cMinute=0;
                        break;   
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_5==0x00)//按下了K2键,减少小时或分钟
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x01://调整时间的小时                       
                        if(hour==0)
                            hour=23;
                        else
                            hour--;
                        break;
                    case 0x02://调整时间的分钟                       
                        if(minute==0)
                            minute=59;
                        else
                            minute--;
                        break;
                  case 0x03://调整闹钟的小时                       
                        if(cHour==0)
                            cHour=23;
                        else
                            cHour--;
                        break;
                    case 0x04://调整闹钟的分钟                       
                        if(cMinute==0)
                            cMinute=59;
                        else
                            cMinute--;
                        break;
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_6==0x00)//按下了K3键,更改模式,第一次修改小时,第二次修改分钟,第三次恢复
        {
            if(!isClick)
            {
                switch(modify)
                {
                    case 0x00://不是修改状态,调整小时                   
                        modify=0x01;
                        break;
                    case 0x01://调整分钟                   
                        modify=0x02;
                        break;
                    case 0x02://调整闹钟的小时       
                        modify=0x03;
                        break;
                    case 0x03://调整闹钟的分钟       
                        modify=0x04;
                        break;
                    case 0x04://不修改       
                        modify=0x00;
                        break;               
                    default:
                        break;
                }
                isClick=1;   
            }
        }
        else if(P1_7==0x00)//按下了K4键,开启或关闭闹钟
        {
            if(!isClick)
            {
                isClock=~isClock;
                isClick=1;   
            }
        }
        else
            isClick=0;
       
        //闹钟是否响了
        if(isClock)
        {
            if(hour==cHour && minute == cMinute)
            {
                Beep();//响
            }
        }
        ShowTime();           
    }   
}
关闭窗口

相关文章