新闻  |   论坛  |   博客  |   在线研讨会
C51定时闹钟程序
0750long | 2010-02-03 22:01:02    阅读:4293   发布文章

C51定时闹钟程序

 

 

//定时闹钟
//声音输出P3.7
//
//


#include <reg52.h>
#define unchar unsigned char
sbit sound="P3"^7;
sbit push="P3"^5;   //暂停,继续键
unchar ssadd1;
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,
                               0x99,0x92,0x82,0xF8,
                               0x80,0x90,0Xbf,0xFF};      //数码管字形表,0-9,-,灭
unchar cnt;             //定时中断计数器
unchar timeadd1=0;      //时间加1判断
unchar alarmtime;       //闹钟时间长度
unchar  bjss="5";     //以下分别为闹钟秒,分钟,小时变量
unchar  bjmm="0";
unchar  bjhh="0";
unchar ss="0";   //实际秒变量
unchar mm="0";   //实际分钟变量
unchar hh="0";   //实际小时变量
unchar t="3";   //延时常数
#define SSL  0x7f    //秒低位段码地址
#define SSH  0XBF    //秒高位段码地址
#define _L   0XFB    //8位数码管显示,分钟与秒之间的-分隔符
#define MML  0XEF    //以下同
#define MMH  0XF7
#define _H   0XDF    //8位数码管显示,小时与分钟之间的-分隔符
#define HHL  0XFD
#define HHH  0XFE

 

void add1(unchar i)   //时间加1函数
{
 while(i>0)
    { i--;
  ss++;
     timeadd1--;
     if(ss==60)
       {ss=0;
        mm++;
       if(mm==60)
       {mm=0;
        hh++;
        if(hh==24)
           hh="0";
           }
    }
  }
 }
void delay(unchar x)   //延时函数
{
   unchar i;
    for(i=0;i<=x;i++);
}
 
void display(void)     //显示函数
{
         P1 =dispcode[ss%10];
         P2 =SSL;          //显示秒低位
         delay(t);
         P1=dispcode[ss/10];
         P2=SSH;          //显示秒高位
         delay(t);

         P1 =dispcode[10];
         P2=_L;
         delay(t);

         P1 =dispcode[mm%10];
         P2=MML;          //显示分钟低位
  delay(t);
         P1=dispcode[mm/10];
         P2=MMH;          //显示分钟高位
         delay(t);

  P1 =dispcode[hh%10];
         P2=HHL;
   delay(t);
         P1=dispcode[hh/10];
  P2=HHH;
  delay(t);

  P1 =dispcode[10];
         P2=_H;
   delay(t);
}
void baojingsheng(void)  //闹钟音产生函数
{ unchar m="800";
   while(m>300)
    { sound=~sound;
 add1(timeadd1);
 display();
    m--;
    }
   while(m>0)
  {sound=~sound;
      add1(timeadd1);
   display();
      delay(15);
   m--;
  }
 }


void alarm(unchar i)    //闹钟定时函数,定时长度为alarmtime
{ if((hh==bjhh)&&(mm==bjmm)&&(ss==bjss))
   {
    while(i>0)
     {baojingsheng();
      i--;
    }
   }
}

void main(void)
{  cnt="20";
   timeadd1=0;
   TMOD="0X01";
   TL0=((65536-50000)%256);
   TH0=((65536-50000)/256);
   EA="1";
   ET0=1;
   TR0=1;
   alerttime="20";
while(1)
  {
  add1(timeadd1);
  display();
  alarm(alarmtime);
   }
}


void time0  (void) interrupt 1   //定时中断函数
{ cnt--;
  TL0+=(65536-50000)%256;
  TH0+=(65536-50000)/256;
  if(cnt==0)
  {cnt=20;
  timeadd1++;
   }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客