|

- /***************************lns主程序snl***************************/
- #include <absacc.h> //包含頭文件
- #include <reg52.h> //包含頭文件
- /***************************數(shù)據(jù)類型定義***************************/
- #define uchar unsigned char //數(shù)據(jù)類型定義
- /*************************定義變量并初始化*************************/
- uchar n=31; //定義月份天數(shù)變量并初始化
- uchar ms=0; //定義毫秒變量并初始化
- uchar h1=0,m1=0,s1=0; //定義計時時、分、秒變量并初始化
- uchar h2=0,m2=1,s2=1; //定義定時時、分、秒變量并初始化
- uchar year=7,month=9,day=8; //定義年、月、日變量并初始化
- uchar wday=6; //定義星期變量并初始化
- uchar *h=&h1,*m=&m1,*s=&s1; //定義顯視位變量并初始化
- uchar *p; //定義調(diào)節(jié)指針
- uchar k1=0,k2=0,k3=0,k4=0,k5=0; //定義控制變量并初始化
- uchar counter=0; //定義鈴聲節(jié)拍變量并初始化
- uchar count=0; //定義鈴聲音符變量并初始化
- sbit sound=P1^0; //定義鈴聲輸出位
- uchar a[8]={1,2,3,4,5,6,7}; //定義顯視輸出位數(shù)組并初始化
- uchar code tt[12]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
- 0x7d,0x07,0x7f,0x6f,0x40,0x00
- }; //數(shù)碼管顯視代碼
- uchar code array[]={
- 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 代表是休止符
- /*******************************************************************
- * 函數(shù)名稱:leap()
- * 功 能:計算二月份天數(shù)
- * 入口參數(shù):year
- * 出口參數(shù):無
- *******************************************************************/
- uchar leap(uchar year) //判斷是否閏年并返回二月份的天數(shù)
- { //閏年返回29,平年返回28
- year+=2000;
- if(year%4==0)
- {if(year%100==0)
- {if(year%400==0)
- return 29;
- else return 28;
- }
- else return 29;
- }
- else return 28;
- }
- /*******************************************************************
- * 函數(shù)名稱:mon()
- * 功 能:計算并返回每個月的天數(shù)
- * 入口參數(shù):month
- * 出口參數(shù):無
- *******************************************************************/
- uchar mon(uchar month) //計算并返回每個月的天數(shù)
- {
- switch(month)
- {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:return 31;break; //1,3,5,7,8,10,12月每月31天
- case 4:
- case 6:
- case 9:
- case 11:return 30;break; //4,6,9,11月每月30天
- case 2: return leap(year);break;//返回二月份的天數(shù)
- default:break;
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:music()
- * 功 能:音樂節(jié)拍控制
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void music(void) //鈴聲音樂
- {
- counter++; //節(jié)拍次數(shù)計數(shù)
- if(counter>=array[count+1]) //節(jié)拍次數(shù)判斷
- {
- count+=2; //音符變換
- counter=0; //清0節(jié)拍數(shù)
- if(count>=192) //判斷是否唱完一曲
- count=0; //返回第一個音符
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:timer1()
- * 功 能:音樂頻率設(shè)置
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void timer1(void)interrupt 1 using 1 //音調(diào)設(shè)置
- {
- sound=~sound; //鈴聲輸出
- TH0=(0xffff-30*array[count])>>8; //音頻設(shè)置
- TL0=(0xffff-30*array[count])&0xff;
- }
- /*******************************************************************
- * 函數(shù)名稱:timer3()
- * 功 能:中斷計時
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void timer3(void) interrupt 3 using 3 //計時中斷
- {
- TH1=0xd8; //計數(shù)器初值重載
- TL1=0xef; //定義單位節(jié)拍的延時大小為10ms
- if(k5)music(); //調(diào)用鬧鈴音樂lns
- else TR0=0; //達(dá)到所設(shè)鬧鈴時間長度關(guān)鈴聲
- if(++ms==100) //計時一秒鐘
- {ms=0;
- if(++s1==60) //計時一分鐘
- {s1=0;
- if(++m1==60) //計時一小時
- {m1=0;
- if(++h1==24) //計時一天
- {h1=0;
- n=mon(month); //取每月的天數(shù)
- if(++day>n) //計時一個月
- {day=1;
- if(++month>12) //計時一年
- {month=1;
- year++;
- }
- }
- if(++wday>6) //星期計數(shù)
- wday=0;
- }
- }
- k5--; //鬧鈴時間長度倒記時
- if(h1==h2&&m1==m2) //判斷是否到定時時刻
- {
- TR0=1; //開鈴聲中斷l(xiāng)ns
- k5=s2; //設(shè)置鬧鈴時間長度
- }
- }
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:d3()
- * 功 能:數(shù)碼管輸出顯示
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void d3(void) //顯示輸出
- {
- uchar sel=0x80,i ; //定義sel為位選通變量并初使化
- if(k2) //判斷是否處于調(diào)時狀態(tài)
- {
- if(k2==4)a[0]=a[1]=a[4]=a[6]=a[7]=10; //星期顯示設(shè)置
- if(k1&&(k3--==0)) k3=255; //設(shè)置位調(diào)節(jié)閃爍初值
- }
- for(i=0;i<=8;i++) //循環(huán)顯示八個數(shù)碼管
- {
- P2=0xff; //清屏
- P0=tt[a[i]]; //輸出顯示數(shù)值
- if(k1&&(k3>200)) //判斷是否閃爍
- if (k1==1&&(i==6||i==7))P2=0xff; //時位閃爍
- else if(k1==2&&(i==3||i==4))P2=0xff; //分位閃爍
- else if(k1==3&&(i==0||i==1))P2=0xff; //秒位閃爍
- else P2=~sel; //非閃爍狀態(tài)
- else P2=~sel; //非閃爍狀態(tài)
- sel=sel>>1; //顯示位移位
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:d2()
- * 功 能:循環(huán)調(diào)用
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void d2(void)
- {
- while(1)
- {
- a[0]=*s%10; //給顯示數(shù)組賦值
- 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(); //調(diào)用顯示輸出函數(shù)
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:d1()
- * 功 能:中斷設(shè)置
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void d1(void)
- {
- TMOD=0x11;
- TH1=0xff; TH0=0xff;
- TL1=0xff; TL0=0xff;
- IE=0x8f;
- TR1=1;
- IT0=1; IT1=1;
- IP=0x02;
- }
- /*******************************************************************
- * 函數(shù)名稱:main()
- * 功 能:程序入口,調(diào)用功能子函數(shù)
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void main(void) {
- d1(); //調(diào)用中斷位設(shè)置函數(shù)
- d2();
- }
- /*******************************************************************
- * 函數(shù)名稱:d5()
- * 功 能:切換顯示菜單
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void d5(void) //顯示菜單調(diào)節(jié)函數(shù)
- {
- switch(k2)
- {
- case 1:{h=&h1; m=&m1; s=&s1; }break; //菜單1:顯示時鐘時間
- case 2:{h=&h2; m=&m2; s=&s2; }break; //菜單2:顯示定時時刻
- case 3:{h=&year;m=&month;s=&day; }break; //菜單3:顯示日歷年月日
- case 4:{h=&wday;m=&wday; s=&wday;}break; //菜單4:顯示星期0--6
- default:{k2=0;h=&h1;m=&m1;s=&s1; }break; //復(fù)位顯示
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:d7()
- * 功 能:調(diào)節(jié)限制,防止數(shù)值調(diào)節(jié)超出值域
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void d7(void) //調(diào)節(jié)限制函數(shù)
- {
- if(k2==1||k2==2) //計時與定時限制
- if (k1==1&&*p>=24) *p=0; //小時限制
- else if(*p>=60) *p=0; //分、秒限制
- if(k2==3) //日歷限制
- if (k1==1&&*p>=100)*p=0; //年限制
- else if(k1==2&&*p>12) *p=1; //月限制
- else if(k1==3&&*p>n) *p=1; //日限制
- if(k2==4)
- if (k1==2&&*p>6) *p=0; //星期限制
- }
- /*******************************************************************
- * 函數(shù)名稱:timer0()
- * 功 能:菜單切換及位加數(shù)調(diào)節(jié)
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- /**外部中斷1調(diào)節(jié)函數(shù)**/
- void timer0(void)interrupt 0 using 0 //外部中斷0調(diào)節(jié)
- {
- if(k1) //判斷是位調(diào)節(jié)還是菜單調(diào)節(jié)
- {
- (*p)++; //位加數(shù)調(diào)節(jié)
- d7(); //調(diào)用調(diào)節(jié)限制函數(shù)
- }
- else
- {
- k2++; //菜單加數(shù)調(diào)節(jié)
- d5(); //調(diào)用調(diào)節(jié)菜單
- }
- }
- /*******************************************************************
- * 函數(shù)名稱:timer2()
- * 功 能:調(diào)節(jié)位選擇及關(guān)鈴聲
- * 入口參數(shù):無
- * 出口參數(shù):無
- *******************************************************************/
- void timer2(void)interrupt 2 using 2 //外部中斷1調(diào)節(jié)
- {
- TR0=0;k5=0; //手動關(guān)鈴聲
- if(k2) //斷是否處于調(diào)節(jié)狀態(tài)
- {
- if (k2==4){k1++;} //期調(diào)節(jié)位選擇
- if (++k1==1) p=h; //選擇時位
- else if(k1==2) p=m; //選擇分位
- else if(k1==3) p=s; //選擇秒位
- else k1=0; //復(fù)位
- }
- }
- /***************************lns主程序snl***************************/
復(fù)制代碼 |
|