|
數(shù)字鐘仿真,程序軟·全套,第一次發(fā)帖大家多包涵
51hei.gif (65.23 KB, 下載次數(shù): 0)
下載附件
2025-4-18 17:30 上傳
單片機(jī)源程序如下:
- //********************數(shù)字鐘程序************************
- //程序:ex8-1.c
- //功能:數(shù)字鐘程序
- #include "reg51.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- //********************位名稱定義*************************
- sbit naodeng=P2^0; //鬧鐘開燈亮;否則滅
- sbit K1=P3^0; //切換模式(開關(guān)鬧鐘,調(diào)鬧鐘)
- sbit K2=P3^2; //調(diào)時(shí)
- sbit K3=P3^3; //調(diào)分
- sbit beep=P2^7; //蜂鳴器
- //********************函數(shù)聲明***************************
- void shijian(); //計(jì)時(shí)時(shí)間顯示
- void Timer0Init(); //定時(shí)器中斷初始化函數(shù)
- void DigDisplay(); //LED動(dòng)態(tài)顯示掃描函數(shù)
- void alarm(); //鬧鈴報(bào)警處理
- void tiao_nao(); //鬧鐘時(shí)間設(shè)置
- void moshi(); //鬧鐘模式設(shè)置
- void delay(u16 i); //軟件延時(shí)函數(shù)
- //********************全局變量定義***************************
- bit nao; //鬧鐘開關(guān)標(biāo)志,nao=1鬧鐘開;nao=0鬧鐘關(guān)
- u8 a=0; //記錄K1按下次數(shù),第一次按下修改鬧鐘時(shí)間,第2次按下切換鬧鐘開關(guān)
- u8 display[]={0,0,0,0,0,0}; //顯示緩沖區(qū),對(duì)應(yīng)六個(gè)數(shù)碼管
- u8 ssec,sec,min,hour,nao_hour=0,nao_min=0; //10毫秒、秒、分、小時(shí)、鬧鐘小時(shí)、鬧鐘分鐘
- //*************************延時(shí)函數(shù)****************************//
- //函數(shù)名:delay
- //函數(shù)功能:軟件延時(shí)
- //形式參數(shù):無符號(hào)整型變量i,0-65535
- //返回值:無
- void delay(u16 i)
- {
- while(i--);
- }
- //*************************定時(shí)器中斷初始化函數(shù)****************************//
- //函數(shù)名:Timer0Init
- //函數(shù)功能:定時(shí)器T0定時(shí)中斷,interrupt 1,開放兩個(gè)外部中斷
- //形式參數(shù):無
- //返回值:無
- void Timer0Init()
- {
- TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。
- EX0=1;
- IT0=1; //外部中斷0采用下降沿觸發(fā)
- PX0=1;
- EX1=1;
- IT1=0; //外部中斷1采用低電平觸發(fā)
- TH0=0Xd8; //給定時(shí)器賦初值,定時(shí)10ms,12MHz晶振頻率
- TL0=0Xf0;
- ET0=1; //開放定時(shí)器0中斷允許
- EA=1; //開放總中斷
- TR0=1; //定時(shí)器開始計(jì)數(shù)
- }
- //**************************6位LED顯示函數(shù)**************************/
- //函數(shù)名:DigDisplay
- //函數(shù)功能:6位LED動(dòng)態(tài)顯示,將顯示緩沖區(qū)display中的6個(gè)數(shù)依次掃描顯示一遍
- //形式參數(shù):無
- //返回值:無
- void DigDisplay()
- {
- u8 i,j,m,temp;
- u8 led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //0-9的共陰極顯示碼
- temp=0x01;
- for(i=0;i<6;i++)
- {
- P1=0x00; //關(guān)顯示
- j=display[i];
- P1=led[j]; //P1送段碼
- P0=~temp; //P0對(duì)應(yīng)端口低電平選位
- temp<<=1;
- for(m=0;m<100;m++); //每一位顯示延時(shí)
- }
- }
- //******************************報(bào)警函數(shù)****************************/
- //函數(shù)名:alarm
- //函數(shù)功能:鬧鐘時(shí)分和當(dāng)前時(shí)分相同、鬧鐘功能開啟的情況下,蜂鳴器響15秒
- //形式參數(shù):無
- //返回值:無
- void alarm()
- {
- if(nao_hour==hour&&nao_min==min&&sec>=0&&sec<15&&nao==1)
- {
- beep=1;
- delay(5);
- beep=0;
- delay(5);
- }
- }
- //***********************鬧鐘時(shí)間調(diào)節(jié)**********************//
- //函數(shù)名:tiao_nao
- //函數(shù)功能:鬧鐘時(shí)間修改,修改小時(shí)和分鐘,K1按下結(jié)束調(diào)節(jié)
- // 設(shè)置完鬧鐘時(shí)間后,自動(dòng)開啟鬧鐘
- //形式參數(shù):無
- //返回值:無
- void tiao_nao()
- {
- IT0=0; //關(guān)溢出進(jìn)1;否則調(diào)鬧時(shí)針后時(shí)加1;
- EX1=0; //關(guān)中斷系統(tǒng)
- EX0=0; //關(guān)中斷系統(tǒng)
- delay(10);
- while(K1) //當(dāng)K1沒有按下時(shí)進(jìn)行鬧鐘時(shí)間調(diào)節(jié),當(dāng)按下K1時(shí),結(jié)束鬧鐘時(shí)間調(diào)節(jié)
- {
- if(K2==0) //鬧鐘小時(shí)調(diào)節(jié)
- {delay(10);if(K2==0)nao_hour++;while(!K2);}
- if(nao_hour>=24)nao_hour=0; //24小時(shí)后歸0
- if(K3==0) //鬧鐘分鐘調(diào)節(jié)
- {delay(10);if(K3==0)nao_min++;while(!K3); }
- if(nao_min>=60)nao_min=0; //60分鐘后歸0
- display[5]=0; //鬧鐘顯示
- display[4]=0;
- display[3]=nao_min%10;
- display[2]=nao_min/10;
- display[1]=nao_hour%10;
- display[0]=nao_hour/10;
- DigDisplay(); //數(shù)碼管顯示函數(shù)
- }
- IT0=1;
- EX1=1;
- EX0=1;
- nao=1; //退出鬧鐘調(diào)試,自動(dòng)開啟鬧鐘
- }
- //*************************鬧鐘功能設(shè)置***************************//
- //函數(shù)名:moshi
- //函數(shù)功能:按鍵K1用來控制鬧鐘功能的開啟和關(guān)閉,以及鬧鐘時(shí)間設(shè)置
- // 按下進(jìn)入鬧鐘時(shí)間設(shè)置,在該狀態(tài)下再次按下K1結(jié)束鬧鐘時(shí)間設(shè)置并同時(shí)開啟鬧鐘功能
- // 在鬧鐘開啟或鬧鈴響期間,按下K1關(guān)閉鬧鐘功能
- //形式參數(shù):無
- //返回值:無
- void moshi()
- {
- if(K1==0)
- {
- delay(100);
- if(K1==0)
- {
- a++; //記錄K1按下次數(shù)
- if(a>=2)a=0;
- while(!K1);
- switch(a)
- {
- case(0):nao=~nao;break;
- case(1):tiao_nao();break;
- }
- }
- } while(!K1);
- }
- //***********************當(dāng)前時(shí)間顯示**********************//
- //函數(shù)名:shijian
- //函數(shù)功能:將當(dāng)前計(jì)時(shí)時(shí)間的"小時(shí)"、"分鐘"和"秒"拆分到顯示緩沖區(qū)并調(diào)用LED顯示掃描函數(shù)實(shí)現(xiàn)時(shí)間的顯示。
- //形式參數(shù):無
- //返回值:無
- void shijian()
- {
- display[5]=sec%10;
- display[4]=sec/10;
- display[3]=min%10;
- display[2]=min/10;
- display[1]=hour%10;
- display[0]=hour/10;
- DigDisplay(); //LED顯示掃描函數(shù)
- }
- //***********************T0中斷服務(wù)函數(shù)**********************//
- //函數(shù)名:Timer0
- //函數(shù)功能:每10ms中斷一次,進(jìn)行10ms、秒、分、小時(shí)計(jì)數(shù)
- //形式參數(shù):無
- //返回值:無
- void Timer0() interrupt 1
- {
- TH0=0Xd8; //給定時(shí)器賦初值,定時(shí)10ms
- TL0=0Xf0;
- ssec++;
- if(ssec>=100) //1s
- {
- ssec=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>=24)
- {hour=0;
- }
- }
-
- }
- }
- }
- //***********************外部中斷0服務(wù)函數(shù)**********************//
- //函數(shù)名:int0
- //函數(shù)功能:小時(shí)調(diào)節(jié)
- //形式參數(shù):無
- //返回值:無
- void int0() interrupt 0
- {
- delay(10); //采用下降沿觸發(fā),延時(shí)去抖
- hour++;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei附件下載:
數(shù)字鐘仿真.7z
(66.56 KB, 下載次數(shù): 0)
2025-4-18 17:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|