//定时闹钟
//声音输出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++;
}
}
用户377235 2012-10-30 22:38
请问有这个程序的电路图吗?