基于51單片機4鍵電子時鐘
屏幕截圖 2022-05-24 104457.png (28.75 KB, 下載次數: 43)
下載附件
電路圖
2022-5-24 10:53 上傳
51hei.gif (247.13 KB, 下載次數: 41)
下載附件
2022-5-24 16:38 上傳
//必要說明,定時器中斷函數是經過計算的50ms,但在使用Proteus仿真時時間不準確。
//比實際表要快。對此不進行調整,因為中斷函數是經過硬件檢驗通過的。
單片機源程序如下:
#include <reg51.h> //包含必要頭文件
//定義按鍵
sbit HourAdjust = P1^0; //時調整選擇鍵
sbit MinuteAdjust = P1^1; //分調整選擇鍵
sbit SecondAdjust = P1^2; //秒選擇選擇鍵
sbit Adjust = P1^3; //調整鍵
//定義標志位
bit SecondFlag = 0; //秒標志
bit FlashFlag = 0; //秒閃標志
bit Second10Flag = 0; //10秒標志
bit HourAdjustFlag = 0; //時調整標志,A鍵按下置1,10秒后清0
bit MinuteAdjustFlag = 0; //分調整標志,A鍵按下置1,10秒后清0
bit SecondAdjustFlag = 0; //秒調整標志,A鍵按下置1,10秒后清0
unsigned char Led1,Led2,Led3,Led4,Led5,Led6; //定義緩存
int TimeCount,Second10Count; //定義計數器
unsigned char code LedTab[]= //定義共陰極數碼管表,0x00用于清除顯示
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
void Delay100us(int Times); //定義延時函數
//*****************************定時器中斷服務程序******************************r
//程序功能:動態驅動數碼管,同時完成定時功能。
void timer() interrupt 3 using 2
{
TR1 = 0;
TL1 = 0x13; TH1 = 0x2C; //重新賦值
P0 = 0x00; //顯示小時
P2 = 0xfe;
P0 = LedTab[Led1];
Delay100us(1);
P0 = 0x00;
P2 = 0xfd;
if(FlashFlag) //秒顯(1秒顯,1秒隱)分前小數點
P0 = LedTab[Led2] | 0x80;
else
P0 = LedTab[Led2] & 0x7f;
Delay100us(1);
P0 = 0x00; //顯示分
P2 = 0xfb;
P0 = LedTab[Led3];
Delay100us(1);
P0 = 0x00;
P2 = 0xf7;
if(FlashFlag) //秒顯秒前小數點
P0 = LedTab[Led4] | 0x80;
else
P0 = LedTab[Led4] & 0x7f;
Delay100us(1);
P0 = 0x00; //顯示秒
P2 = 0xef;
P0 = LedTab[Led5];
Delay100us(1);
P0 = 0x00;
P2 = 0xdf;
P0 = LedTab[Led6];
Delay100us(1);
TR1 = 1;
if(TimeCount < 100) //秒計數器
TimeCount++;
else
{
TimeCount = 0x00;
SecondFlag = 1; //置位秒標志
if(Second10Flag) //10秒計數器
if(Second10Count < 20)
Second10Count++;
else
{
Second10Count = 0x00; //10秒計數器清0
Second10Flag = 0; //清除10s標志
HourAdjustFlag = 0; //清除調整標志位
MinuteAdjustFlag = 0;
SecondAdjustFlag = 0;
}
}
}
//============================================================================
main(void)
{
//初始化
int Second = 30; //初始化時間
int Minute = 12;
int Hour = 20;
Led1 = 0x00; //清除顯存
Led2 = 0x00;
Led3 = 0x00;
Led4 = 0x00;
Led5 = 0x00;
Led6 = 0x00;
SecondFlag = 0;
TimeCount = 0x00;
//設置定時器中斷
TMOD = 0x10f; //GATE=0 01010001
//C/T=0--定時/計數器1工作于定時方式
//M1=1;M0=0--選擇工作模式1,構成最大定時器
//T0:在此程序不使用
TL1 = 0x13; TH1 = 0x2C; //指定定時時間為50ms 65536-50/(11.0592/12)=11283=2C13h
EA = 1; //開總中斷
TF1 = 0;
ET1 = 1; //開定時器中斷
TR1 = 1; //開始計時
while(1)
{
//*****************************************************************************
//對時間進行調整程序
if(SecondFlag)
{
if(Second%2 == 0)
FlashFlag = 1;
else
FlashFlag = 0;
if(Second < 59)
Second++;
else
{
if(Minute < 59)
Minute++;
else
{
if(Hour < 23)
Hour++;
else
Hour = 0;
Minute = 0;
}
Second = 0;
}
SecondFlag = 0;
}
//-----------------------------------------------------------------------------
//*****************************************************************************
//時間調整程序
if(HourAdjustFlag) //調整時程序
if(Second10Flag)
if(FlashFlag) //時秒顯
{
Led1 = 0x0a; //時隱
Led2 = 0x0a;
}
else
{
Led1 = Hour/10; //時顯
Led2 = Hour%10;
}
else
{
Led1 = Hour/10;
Led2 = Hour%10;
}
else
{
Led1 = Hour/10;
Led2 = Hour%10;
}
if(MinuteAdjustFlag) //調整分程序
if(Second10Flag)
if(FlashFlag) //分秒顯
{
Led3 = 0x0a;
Led4 = 0x0a;
}
else
{
Led3 = Minute/10;
Led4 = Minute%10;
}
else
{
Led3 = Minute/10;
Led4 = Minute%10;
}
else
{
Led3 = Minute/10;
Led4 = Minute%10;
}
if(SecondAdjustFlag) //調整秒程序,控制秒顯
if(Second10Flag)
if(FlashFlag)
{
Led5 = 0x0a;
Led6 = 0x0a;
}
else
{
Led5 = Second/10;
Led6 = Second%10;
}
else
{
Led5 = Second/10;
Led6 = Second%10;
}
else
{
Led5 = Second/10;
Led6 = Second%10;
}
if(!HourAdjust) //時調整按鍵按下
{
while(!HourAdjust); //等待松開
HourAdjustFlag = 1; //置位時標志位
MinuteAdjustFlag = 0; //清除分標志位
SecondAdjustFlag = 0; //清除秒標志位
Second10Flag = 1; //置位10秒標志位
}
if(!MinuteAdjust) //分調整鍵按下
{
while(!MinuteAdjust);
MinuteAdjustFlag = 1;
HourAdjustFlag = 0;
SecondAdjustFlag = 0;
Second10Flag = 1;
}
if(!SecondAdjust) //秒調整鍵按下
{
while(!SecondAdjust);
SecondAdjustFlag = 1;
HourAdjustFlag = 0;
MinuteAdjustFlag = 0;
Second10Flag = 1;
}
if(!Adjust) //調整鍵按下
{
while(!Adjust);
if(HourAdjustFlag) //調整時,加1
if(Hour < 23)
{
Hour++;
Second10Count = 0;
}
else
Hour = 0;
if(MinuteAdjustFlag) //調整分,加1
if(Minute < 59)
{
Minute++;
Second10Count = 0;
}
else //調整秒,清零
Minute = 0;
if(SecondAdjustFlag)
Second = 0;
}
}
}
//********************************延時程序************************************
void Delay100us(int Times)
{
Times = Times * 100;
while(Times--);
}
Keil代碼與Proteus8.8仿真下載:
sz4鍵時鐘.7z
(67.49 KB, 下載次數: 27)
2022-5-24 16:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|