當前位置:名人名言大全網 - 祝福短信 - 請幫我寫壹個51單片機時鐘程序,連接時顯示0220。該程序還具有報警功能。

請幫我寫壹個51單片機時鐘程序,連接時顯示0220。該程序還具有報警功能。

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

# 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;//重置

}

}

我在組織下面。