原创 C51定时闹钟程序

2010-1-13 08:01 3303 3 4 分类: MCU/ 嵌入式

//定时闹钟
//声音输出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++;
   }
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-10-30 22:38

请问有这个程序的电路图吗?

相关推荐阅读
用户1203203 2010-01-15 07:21
单片机常用驱动电路资料
上传几个单片机的驱动电路资料.分别是75452,ULN2003,ULN2803,L293,共大家分享....
用户1203203 2010-01-10 17:41
C51的日历时钟程序
//程序功能:日历,时钟,温度显示(测温代码暂没加上,加上后程序将超过4k,注意芯片型号选用),温度传感器采用18B20// 日历与时钟,温度分时切换显示,采用8位共阳数码管// 数据输出P1, 位码...
我要评论
1
3
关闭 站长推荐上一条 /3 下一条