標(biāo)題:
單片機(jī)數(shù)字鐘程序Proteus仿真電路圖
[打印本頁]
作者:
yujingpiaomiao
時間:
2025-4-17 08:31
標(biāo)題:
單片機(jī)數(shù)字鐘程序Proteus仿真電路圖
數(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)時
sbit K3=P3^3; //調(diào)分
sbit beep=P2^7; //蜂鳴器
//********************函數(shù)聲明***************************
void shijian(); //計(jì)時時間顯示
void Timer0Init(); //定時器中斷初始化函數(shù)
void DigDisplay(); //LED動態(tài)顯示掃描函數(shù)
void alarm(); //鬧鈴報(bào)警處理
void tiao_nao(); //鬧鐘時間設(shè)置
void moshi(); //鬧鐘模式設(shè)置
void delay(u16 i); //軟件延時函數(shù)
//********************全局變量定義***************************
bit nao; //鬧鐘開關(guān)標(biāo)志,nao=1鬧鐘開;nao=0鬧鐘關(guān)
u8 a=0; //記錄K1按下次數(shù),第一次按下修改鬧鐘時間,第2次按下切換鬧鐘開關(guān)
u8 display[]={0,0,0,0,0,0}; //顯示緩沖區(qū),對應(yīng)六個數(shù)碼管
u8 ssec,sec,min,hour,nao_hour=0,nao_min=0; //10毫秒、秒、分、小時、鬧鐘小時、鬧鐘分鐘
//*************************延時函數(shù)****************************//
//函數(shù)名:delay
//函數(shù)功能:軟件延時
//形式參數(shù):無符號整型變量i,0-65535
//返回值:無
void delay(u16 i)
{
while(i--);
}
//*************************定時器中斷初始化函數(shù)****************************//
//函數(shù)名:Timer0Init
//函數(shù)功能:定時器T0定時中斷,interrupt 1,開放兩個外部中斷
//形式參數(shù):無
//返回值:無
void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
EX0=1;
IT0=1; //外部中斷0采用下降沿觸發(fā)
PX0=1;
EX1=1;
IT1=0; //外部中斷1采用低電平觸發(fā)
TH0=0Xd8; //給定時器賦初值,定時10ms,12MHz晶振頻率
TL0=0Xf0;
ET0=1; //開放定時器0中斷允許
EA=1; //開放總中斷
TR0=1; //定時器開始計(jì)數(shù)
}
//**************************6位LED顯示函數(shù)**************************/
//函數(shù)名:DigDisplay
//函數(shù)功能:6位LED動態(tài)顯示,將顯示緩沖區(qū)display中的6個數(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對應(yīng)端口低電平選位
temp<<=1;
for(m=0;m<100;m++); //每一位顯示延時
}
}
//******************************報(bào)警函數(shù)****************************/
//函數(shù)名:alarm
//函數(shù)功能:鬧鐘時分和當(dāng)前時分相同、鬧鐘功能開啟的情況下,蜂鳴器響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);
}
}
//***********************鬧鐘時間調(diào)節(jié)**********************//
//函數(shù)名:tiao_nao
//函數(shù)功能:鬧鐘時間修改,修改小時和分鐘,K1按下結(jié)束調(diào)節(jié)
// 設(shè)置完鬧鐘時間后,自動開啟鬧鐘
//形式參數(shù):無
//返回值:無
void tiao_nao()
{
IT0=0; //關(guān)溢出進(jìn)1;否則調(diào)鬧時針后時加1;
EX1=0; //關(guān)中斷系統(tǒng)
EX0=0; //關(guān)中斷系統(tǒng)
delay(10);
while(K1) //當(dāng)K1沒有按下時進(jìn)行鬧鐘時間調(diào)節(jié),當(dāng)按下K1時,結(jié)束鬧鐘時間調(diào)節(jié)
{
if(K2==0) //鬧鐘小時調(diào)節(jié)
{delay(10);if(K2==0)nao_hour++;while(!K2);}
if(nao_hour>=24)nao_hour=0; //24小時后歸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)試,自動開啟鬧鐘
}
//*************************鬧鐘功能設(shè)置***************************//
//函數(shù)名:moshi
//函數(shù)功能:按鍵K1用來控制鬧鐘功能的開啟和關(guān)閉,以及鬧鐘時間設(shè)置
// 按下進(jìn)入鬧鐘時間設(shè)置,在該狀態(tài)下再次按下K1結(jié)束鬧鐘時間設(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ù)名:shijian
//函數(shù)功能:將當(dāng)前計(jì)時時間的"小時"、"分鐘"和"秒"拆分到顯示緩沖區(qū)并調(diào)用LED顯示掃描函數(shù)實(shí)現(xiàn)時間的顯示。
//形式參數(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、秒、分、小時計(jì)數(shù)
//形式參數(shù):無
//返回值:無
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服務(wù)函數(shù)**********************//
//函數(shù)名:int0
//函數(shù)功能:小時調(diào)節(jié)
//形式參數(shù):無
//返回值:無
void int0() interrupt 0
{
delay(10); //采用下降沿觸發(fā),延時去抖
hour++;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei附件下載:
數(shù)字鐘仿真.7z
(66.56 KB, 下載次數(shù): 0)
2025-4-18 17:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1