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; //設(shè)置時鐘時亮,設(shè)置完畢滅
sbit led1=P1^1; //設(shè)置鬧鐘時亮,設(shè)置完畢滅
sbit led2=P1^2; //鬧鐘響時亮,響完滅
sbit buzzer=P1^3; //鬧鐘
sbit hourp=P3^4; //定義為hourp,功能是小時+,“因?yàn)橐褂猛獠恐袛?和外部中斷1因此P32P33不進(jìn)行位定義”
sbit minp=P3^5; //分鐘+
sbit exit=P3^6; //退出
sbit led3=P1^4; //關(guān)閉鬧鐘的指示燈,亮表示鬧鐘允許
sbit enable=P3^7; //鬧鐘開啟關(guān)閉開關(guān)
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數(shù)碼管選通碼
unsigned char time[16]; //時鐘和鬧鈴的數(shù)字存放的數(shù)組
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]; //把小時的十位數(shù)計(jì)算出來,并且把小時的十位數(shù)所對應(yīng)的段碼lednum[x]的值送給time數(shù)組中的第0個元素
time[1]=lednum[shi%10]; //把小時的十位數(shù)計(jì)算出來,并且把小時的個位數(shù)所對應(yīng)的斷碼ledunm[x]的值送給time數(shù)組中的第1個元素
time[2]=0x40; //把橫線符號放入time[2]中
time[3]=lednum[fen/10]; //把分鐘的十位數(shù)計(jì)算出來,并且把分鐘的十位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第0個元素
time[4]=lednum[fen%10]; //把分鐘的十位數(shù)計(jì)算出來,并且把分鐘的個位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第1個元素
time[5]=0x40; //將橫線的符號放入time[2]中
time[6]=lednum[miao/10]; //把秒的十位數(shù)計(jì)算出來,并且把秒的十位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第0個元素
time[7]=lednum[miao%10]; //把秒的十位數(shù)計(jì)算出來,并且把秒的個位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第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 //設(shè)置時鐘
{
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]; //把小時的十位數(shù)計(jì)算出來,并且把小時的十位數(shù)所對應(yīng)的段碼lednum[x]的值送給time數(shù)組中的第0個元素
time[9]=lednum[alamshi%10]; //把小時的十位數(shù)計(jì)算出來,并且把小時的個位數(shù)所對應(yīng)的斷碼ledunm[x]的值送給time數(shù)組中的第1個元素
time[10]=0x40; //把橫線符號放入time[2]中
time[11]=lednum[alamfen/10]; //把分鐘的十位數(shù)計(jì)算出來,并且把分鐘的十位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第0個元素
time[12]=lednum[alamfen/10]; //把分鐘的十位數(shù)計(jì)算出來,并且把分鐘的個位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第1個元素
time[13]=0x40; //將橫線的符號放入time[2]中
time[14]=lednum[miao/10]; //把秒的十位數(shù)計(jì)算出來,并且把秒的十位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第0個元素
time[15]=lednum[miao/10]; //把秒的十位數(shù)計(jì)算出來,并且把秒的個位數(shù)所對應(yīng)的斷碼lednum[x]的值送給time數(shù)組中的第1個元素
}
}
led0=1;
}
void clockc()interrupt 3 //計(jì)時器1中斷函數(shù)
{ msmiao++;
if(msmiao>=3600)
{ msmiao=0;
miao++;
}
}
void mian()
{
led0=0; //初始化 設(shè)置滅
led1=0; //初始化 設(shè)置滅
led2=0; //初始化 設(shè)置滅
buzzer=0; //鬧鐘不響
hourp=1;
minp=1;
exit=1;
clockclose=0; //鬧鐘關(guān)閉的標(biāo)志位
close=0; //不允許使用鬧鐘
msmiao=0;
shi=23;
fen=59;
miao=58;
alamshi=0;
alamfen=0;
hourpf=0; //按鍵小時+被按下的標(biāo)志位
minpf=0; //按鍵分鐘+被按下時的標(biāo)志位
EA=1;ET1=1;EX0=1;EX1=1; //打開總中斷,打開定時計(jì)數(shù)器1的中斷,打開外部中斷0和外部中斷1
IT0=1;IT1=1; //設(shè)置外部中斷的出發(fā)方式為跳變出發(fā)
PT1=1; //調(diào)高定時器1的優(yōu)先級
TH1=256-256;
TL1=256-256;
TMOD=0X20;
TR1=1;
while(1)
{
display(0);
alam();
}
}
|