Build target 'Target 1'
assembling STARTUP.A51...
compiling timer.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?MIAN?TIMER
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: MAIN
MODULE: C:\KEIL\C51\LIB\C51S.LIB (?C_INIT)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: MAIN
MODULE: C:\KEIL\C51\LIB\C51S.LIB (?C_INIT)
ADDRESS: 01DCH
Program Size: data=55.4 xdata=0 code=1069
"timer" - 0 Error(s), 3 Warning(s).
#include<reg51.h>
sbit led0=P1^0; //设置时钟时亮,设置完毕灭
sbit led1=P1^1; //设置闹钟时亮,设置完毕灭
sbit led2=P1^2; //闹钟响时亮,响完灭
sbit buzzer=P1^3; //闹钟
sbit hourp=P3^4; //定义为hourp,功能是小时+,“因为要使用外部中断0和外部中断1因此P32P33不进行位定义”
sbit minp=P3^5; //分钟+
sbit exit=P3^6; //退出
sbit led3=P1^4; //关闭闹钟的指示灯,亮表示闹钟允许
sbit enable=P3^7; //闹钟开启关闭开关
bit hourpf,minpf,clockclose,close;
unsigned int msmiao,miao,fen,shi,alamfen,alamshi;
unsigned char lednum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的断码
unsigned char ledwei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共阴极led数码管选通码
unsigned char time[16]; //时钟和闹铃的数字存放的数组
void delay(unsigned int i)
{
unsigned int j;
for(j=0;j<i;j++);
{
if(miao>=60)
{
miao=0;
fen++;
}
if (fen>=60)
{
fen=0;
shi++;
}
if(shi>=24)
{
shi=0;
}
time[0]=lednum[shi/10]; //把小时的十位数计算出来,并且把小时的十位数所对应的段码lednum[x]的值送给time数组中的第0个元素
time[1]=lednum[shi%10]; //把小时的十位数计算出来,并且把小时的个位数所对应的断码ledunm[x]的值送给time数组中的第1个元素
time[2]=0x40; //把横线符号放入time[2]中
time[3]=lednum[fen/10]; //把分钟的十位数计算出来,并且把分钟的十位数所对应的断码lednum[x]的值送给time数组中的第0个元素
time[4]=lednum[fen%10]; //把分钟的十位数计算出来,并且把分钟的个位数所对应的断码lednum[x]的值送给time数组中的第1个元素
time[5]=0x40; //将横线的符号放入time[2]中
time[6]=lednum[miao/10]; //把秒的十位数计算出来,并且把秒的十位数所对应的断码lednum[x]的值送给time数组中的第0个元素
time[7]=lednum[miao%10]; //把秒的十位数计算出来,并且把秒的个位数所对应的断码lednum[x]的值送给time数组中的第1个元素
}
}
void display(unsigned int k)
{
unsigned int m;
for(m=0;m<8;m++);
{
P0=time[m+k];
P2=ledwei[m];
delay(2);
P0=0x00;
}
}
void alam()
{
if(shi==alamshi&&fen==alamfen&&clockclose==1&&close==1)
{
buzzer=1;led2=1;
display(0);
if(exit==0)
{
clockclose=0;buzzer=0;led2=0;
}
}
if((shi!=alamshi)||(fen!=alamfen))
{
clockclose=1;
}
}
void clockchange() interrupt 0 //设置时钟
{
led0=1;
while(exit)
{
display(0);
if(hourp==0)
{
display(0);
if(hourp==0)
{
hourpf=1;
}
}
if(hourp==1&hourpf==1)
{
hourpf=0;
alamshi++;
}
if(minp==0)
{
display(0);
if(minp==0)
{
minpf=1;
}
if(minp==1&minpf==1)
{
minpf=0;
fen++;
}
}
}
led0=0;
}
void alamclock() interrupt 2
{
led1=1;
while(exit)
{
display(8);
if(hourp==0)
{
display(8);
if(hourp==0)
{
hourpf=1;
}
}
if(hourp==1&hourpf==1)
{
hourpf=0;
alamfen++;
}
if(minp==0)
{
display(8);
if (minp==0)
{
minpf=1;
}
if(minp==1&minpf==1)
{
minpf=0;
fen++;
}
if(enable==0)
{
close=1;
}
time[8]=lednum[alamshi/10]; //把小时的十位数计算出来,并且把小时的十位数所对应的段码lednum[x]的值送给time数组中的第0个元素
time[9]=lednum[alamshi%10]; //把小时的十位数计算出来,并且把小时的个位数所对应的断码ledunm[x]的值送给time数组中的第1个元素
time[10]=0x40; //把横线符号放入time[2]中
time[11]=lednum[alamfen/10]; //把分钟的十位数计算出来,并且把分钟的十位数所对应的断码lednum[x]的值送给time数组中的第0个元素
time[12]=lednum[alamfen/10]; //把分钟的十位数计算出来,并且把分钟的个位数所对应的断码lednum[x]的值送给time数组中的第1个元素
time[13]=0x40; //将横线的符号放入time[2]中
time[14]=lednum[miao/10]; //把秒的十位数计算出来,并且把秒的十位数所对应的断码lednum[x]的值送给time数组中的第0个元素
time[15]=lednum[miao/10]; //把秒的十位数计算出来,并且把秒的个位数所对应的断码lednum[x]的值送给time数组中的第1个元素
}
}
led0=1;
}
void clockc()interrupt 3 //计时器1中断函数
{ msmiao++;
if(msmiao>=3600)
{ msmiao=0;
miao++;
}
}
void mian()
{
led0=0; //初始化 设置灭
led1=0; //初始化 设置灭
led2=0; //初始化 设置灭
buzzer=0; //闹钟不响
hourp=1;
minp=1;
exit=1;
clockclose=0; //闹钟关闭的标志位
close=0; //不允许使用闹钟
msmiao=0;
shi=23;
fen=59;
miao=58;
alamshi=0;
alamfen=0;
hourpf=0; //按键小时+被按下的标志位
minpf=0; //按键分钟+被按下时的标志位
EA=1;ET1=1;EX0=1;EX1=1; //打开总中断,打开定时计数器1的中断,打开外部中断0和外部中断1
IT0=1;IT1=1; //设置外部中断的出发方式为跳变出发
PT1=1; //调高定时器1的优先级
TH1=256-256;
TL1=256-256;
TMOD=0X20;
TR1=1;
while(1)
{
display(0);
alam();
}
}
|