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