# include & ltabsacc.h & gt//包含頭文件
# include & ltreg52.h & gt//包含頭文件
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#define uchar unsigned char //數據類型定義
/* * * * * * * * * * * * * * * * * * * *定義變量並初始化* * * * * * * * * * * * * * * *
uchar n = 31;//定義壹個月中的某壹天變量並初始化它。
uchar ms = 0;//定義毫秒級變量並初始化。
uchar h1=2,m1=2,s 1 = 0;//定義計時時、分、秒變量並初始化。
uchar h2=0,m2=1,S2 = 1;//定義計時時、分、秒變量並初始化。
uchar年=0,月=0,日= 0;//定義年、月、日變量並初始化。
uchar wday = 6;//定義星期幾變量並初始化它
uchar * h = & amph 1 * m = & amp;m1,* s = & amps 1;//定義視頻位變量並初始化
uchar * p;//定義調整指針
uchar k1=0,k2=0,k3=0,k4=0,K5 = 0;//定義控制變量並初始化它們。
uchar計數器= 0;//定義bell beat變量並初始化。
uchar計數= 0;//定義bell note變量並初始化。
sbit sound=p1^0;//定義鈴聲輸出位。
uchar a[8]={1,2,3,4,5,6,7 };//定義顯示輸出位數組並初始化
uchar代碼tt[12]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d、0x07、0x7f、0x6f、0x40、0x00
};//數碼管顯示代碼
uchar代碼數組[]={
0x18,0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x00,0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,0xFF,0x00,0x20,0x20,
0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,
0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x30,
0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,
0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,
0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,
0x1C,0x10,0x20,0x10,0x1C,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,
0x20,0x15,0x1F,0x05,0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,
0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,0x26,0x40,0x13,0x60,
0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,
0x00,0x00
};
//array[i]=0x00表示歌曲結束。
//array[i]=0xff代表休息。
/*******************************************************************
*函數名:leap()
*函數:計算二月的天數。
*入口參數:年份
*導出參數:無
*******************************************************************/
Uchar leap(uchar year) //確定是否閏年,並返回二月的天數。
{//閏年返回29,平年返回28。
年份+= 2000;
if(年份%4==0)
{if(year%100==0)
{if(year%400==0)
返回29;
否則返回28;
}
否則返回29;
}
否則返回28;
}
/*******************************************************************
*函數名:mon()
*函數:計算並返回每個月的天數。
*入口參數:月
*導出參數:無
*******************************************************************/
Uchar mon(uchar month) //計算並返回每個月的天數。
{
開關(月)
{
案例1:
案例三:
案例5:
案例7:
案例8:
案例10:
案例12:返回31;打破;//二月每月1,3,5,7,8,10,1天。
案例4:
案例6:
案例9:
案例11:返回30;打破;//四月,六月,九月,165438+十月,每月30天
案例二:回歸閏(年);打破;//返回二月的天數。
默認:break
}
}
/*******************************************************************
*功能名稱:音樂()
*功能:音樂節拍控制
*入口參數:無
*導出參數:無
*******************************************************************/
Void music(void) //鈴聲音樂
{
counter++;//節拍計數
if(計數器& gt= array[count+1]//節拍數判斷
{
計數+= 2;//音符變換
計數器= 0;//清除節拍數。
if(count & gt;=192) //判斷是否唱完壹首歌。
count = 0;//返回第壹個音符。
}
}
/*******************************************************************
*函數名:timer1()
*功能:音樂頻率設置
*入口參數:無
*導出參數:無
*******************************************************************/
Voidtimer 1 (void)中斷1使用1//音調設置
{
聲音= ~聲音;//鈴聲輸出
TH0 =(0x ffff-30 * array[count])& gt;& gt8;//音頻設置
TL0 =(0x ffff-30 * array[count])& amp;0xff
}
/*******************************************************************
*函數名:定時器3()
*功能:中斷計時
*入口參數:無
*導出參數:無
*******************************************************************/
Voidtimer 3(無效)中斷3使用3//定時器中斷
{
th 1 = 0xd 8;//計數器的初始值被重載
TL 1 = 0x ef;//定義單位節拍的延時大小為10 ms。
if(K5)music();//調用鬧鐘音樂lns
否則TR0 = 0;//到達設定的鬧鈴時間後關閉鈴聲。
If(++ms==100) //時間壹秒。
{ ms = 0;
If(++s1==60) //時間壹分鐘。
{ s 1 = 0;
If(++m1==60) //時間壹小時。
{ m 1 = 0;
If(++h1==24) //某天時間。
{ h 1 = 0;
n=mon(月);//取每月的天數
if(++day & gt;N) //時間為壹個月
{ day = 1;
如果(++月& gt12) //計時壹年
{ month = 1;
year++;
}
}
if((+wday & gt;6) //周計數
wday = 0;
}
}
K5-;//報警時間長度倒計時
if(h 1 = = H2 & amp;& ampM1==m2) //判斷是否到時間。
{
TR0 = 1;//按鈴打斷lns
k5 = s2//設置報警時間長度
}
}
}
}
/*******************************************************************
*函數名:d3()
*功能:數碼管輸出顯示
*入口參數:無
*導出參數:無
*******************************************************************/
void 3(void)//顯示輸出
{
uchar sel=0x80,I;//將sel定義為位選通變量並初始化。
If(k2) //判斷是否處於時間調整狀態。
{
if(k2 = = 4)a[0]= a[1]= a[4]= a[6]= a[7]= 10;//星期幾顯示設置
if(k 1 & amp;& amp(k3-= = 0))k3 = 255;//設置該位以調整閃爍的初始值。
}
for(I = 0;我& lt=8;I++) //循環顯示八個數碼管。
{
P2 = 0x ff;//清除屏幕
P0 = TT[a[I]];//輸出顯示值
if(k 1 & amp;& amp(k3 & gt200)) //判斷是否閃爍。
if(k 1 = = 1 & amp;& amp(I = = 6 | | I = = 7))P2 = 0x ff;//時間閃爍
else if(k 1 = = 2 & amp;& amp(I = = 3 | | I = = 4))P2 = 0x ff;//分割閃爍
else if(k 1 = = 3 & amp;& amp(I = = 0 | | I = = 1))P2 = 0x ff;//第二位閃爍
else P2 = ~ sel;//不閃爍狀態
else P2 = ~ sel;//不閃爍狀態
sel = sel & gt& gt1;//顯示位移位
}
}
/*******************************************************************
*函數名:d2()
*功能和能量:循環調用
*入口參數:無
*導出參數:無
*******************************************************************/
空d2(空)
{
while(1)
{
a[0]= * s % 10;//為顯示數組賦值
a[1]= * s/10;
a[2]= 10;
a[3]= * m % 10;
a[4]= * m/10;
a[5]= 10;
a[6]= * h % 10;
a[7]= * h/10;
D3();//調用顯示輸出函數
}
}
/*******************************************************************
*函數名:d1()
*功能:中斷設置
*入口參數:無
*導出參數:無
*******************************************************************/
void d1(無效)
{
TMOD = 0x 11;
th 1 = 0x ff;TH0 = 0xff
TL 1 = 0x ff;TL0 = 0xff
IE = 0x8f
tr 1 = 1;
IT0 = 1;it 1 = 1;
IP = 0x02
}
/*******************************************************************
*函數名:main()
*函數:程序入口,調用函數子函數。
*入口參數:無
*導出參數:無
*******************************************************************/
無效總管(無效)
{
d 1();//調用中斷位設置函數
D2();
}
/*******************************************************************
*函數名:d5()
*功能:切換顯示菜單。
*入口參數:無
*導出參數:無
*******************************************************************/
void 5(void)//顯示菜單調整功能。
{
開關(k2)
{
案例1:{ h = & amp;h 1;m = & ampm 1;s = & amps 1;}破;//菜單1:顯示時鐘時間
案例二:{ h = & ampH2;m = & ampm2;s = & ampS2;}破;//菜單2:顯示定時時間
案例三:{ h = & amp年份;m = & amp月份;s = & amp天;}破;//菜單3:顯示日歷年、月、日。
案例4:{ h = & amp;wdaym = & ampwdays = & ampwday}破;//菜單4:顯示星期幾0-6
默認值:{ k2 = 0;h = & amph 1;m = & ampm 1;s = & amps 1;}破;//重置顯示
}
}
/*******************************************************************
*函數名:d7()
*功和能:調整極限,防止數值調整超出範圍。
*入口參數:無
*導出參數:無
*******************************************************************/
Void d7(void) //調整約束函數。
{
If(k2==1||k2==2) //定時和定時限制
if(k 1 = = 1 & amp;& amp* p & gt= 24)* p = 0;//小時限制
else if(* p & gt;= 60)* p = 0;//分鐘和秒鐘限制
If(k2==3) //日歷限制
if(k 1 = = 1 & amp;& amp* p & gt= 100)* p = 0;//年度限制
else if(k 1 = = 2 & amp;& amp* p & gt12)* p = 1;//每月限額
else if(k 1 = = 3 & amp;& amp* p & gtn)* p = 1;//每日限額
如果(k2==4)
if(k 1 = = 2 & amp;& amp* p & gt6)* p = 0;//周限制
}
/*******************************************************************
*函數名:定時器0()
*功能:菜單切換和位加數調整。
*入口參數:無
*導出參數:無
*******************************************************************/
/* *外部中斷1調整功能* */
Voidtime r0 (void)中斷0使用0//外部中斷0調整
{
If(k1) //確定是位調整還是菜單調整。
{
(* p)++;//位加數調整
D7();//調用調整限制函數
}
其他
{
k2++;//菜單附錄調整
D5();//調用調整菜單
}
}
/*******************************************************************
*函數名:定時器2()
*功能:調整位置選擇並關閉鈴聲。
*入口參數:無
*導出參數:無
*******************************************************************/
無效定時器2(無效)中斷2使用2//外部中斷1調整
{
TR0 = 0;K5 = 0;//手動關閉鈴聲
if(k2) // off是否處於調整狀態?
{
if(k2 = = 4){ k 1++;}//期間調整位置選擇
if(++k 1 = = 1)p = h;//選擇時間位置
else if(k 1 = = 2)p = m;//選擇點。
else if(k 1 = = 3)p = s;//選擇秒。
else k 1 = 0;//重置
}
}
我在組織下面。