|
這次發(fā)帖也是因?yàn)閯偨柚?1黑電子論壇里的資料完成一件洞洞板制作的作品。所以也想來(lái)賺點(diǎn)黑幣,我不是大神,只是個(gè)小白。附帶吧內(nèi)大神資料,
0.png (261.19 KB, 下載次數(shù): 65)
下載附件
2017-3-31 21:40 上傳
0.png (243.83 KB, 下載次數(shù): 59)
下載附件
2017-3-31 21:40 上傳
0.png (365.03 KB, 下載次數(shù): 77)
下載附件
2017-3-31 21:39 上傳
0.png (286.11 KB, 下載次數(shù): 70)
下載附件
2017-3-31 21:39 上傳
程序名稱(chēng):六位數(shù)碼管時(shí)鐘表
編譯器:Keil uVision 4
程序功能:上電后,程序按初始時(shí)間開(kāi)始時(shí)鐘演示,時(shí)間顯示按24小時(shí)制。
時(shí)間調(diào)整:按A鍵,顯示加1,按B鍵,顯示減1,按C鍵,清零
MCU:AT89C51
晶振:11.0592M
外圍部件:
鍵盤(pán):4按鍵A、B、C、D分別接在P1.0、P1.1、P1.2和P1.3上,低電平有效
A、B、C鍵分別控制時(shí)、分、秒的選擇,D鍵銨下進(jìn)行時(shí)間調(diào)整。
顯示:4位共陰極LED,P0口送顯示數(shù)據(jù),P1口低四位位選
內(nèi)部資源:
使用定時(shí)計(jì)數(shù)器1中斷,用于定時(shí)及顯示
警告:
1. 按鍵未加防抖動(dòng)程序
2. 此程序經(jīng)過(guò)編譯并通過(guò)Proteus仿真,未通過(guò)實(shí)物檢驗(yàn)。
作者:花落水流紅,空寂蕭然山——蕭然
完成日期:/6/11
============================================================================*/
- #include <reg51.h> //包含必要頭文件
- //定義按鍵
- sbit HourAdjust = P1^0; //時(shí)調(diào)整選擇鍵
- sbit MinuteAdjust = P1^1; //分調(diào)整選擇鍵
- sbit SecondAdjust = P1^2; //秒選擇選擇鍵
- sbit Adjust = P1^3; //調(diào)整鍵
- //定義標(biāo)志位
- bit SecondFlag = 0; //秒標(biāo)志
- bit FlashFlag = 0; //秒閃標(biāo)志
- bit Second10Flag = 0; //10秒標(biāo)志
- bit HourAdjustFlag = 0; //時(shí)調(diào)整標(biāo)志,A鍵按下置1,10秒后清0
- bit MinuteAdjustFlag = 0; //分調(diào)整標(biāo)志,A鍵按下置1,10秒后清0
- bit SecondAdjustFlag = 0; //秒調(diào)整標(biāo)志,A鍵按下置1,10秒后清0
- unsigned char Led1,Led2,Led3,Led4,Led5,Led6; //定義緩存
- int TimeCount,Second10Count; //定義計(jì)數(shù)器
- unsigned char code LedTab[]= //定義共陰極數(shù)碼管表,0x00用于清除顯示
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- void Delay100us(int Times); //定義延時(shí)函數(shù)
- //*****************************定時(shí)器中斷服務(wù)程序******************************r
- //程序功能:動(dòng)態(tài)驅(qū)動(dòng)數(shù)碼管,同時(shí)完成定時(shí)功能。
- void timer() interrupt 3 using 2
- {
- TR1 = 0;
- TL1 = 0x13; TH1 = 0x2C; //重新賦值
- P0 = 0x00; //顯示小時(shí)
- P2 = 0xfe;
- P0 = LedTab[Led1];
- Delay100us(1);
- P0 = 0x00;
- P2 = 0xfd;
- if(FlashFlag) //秒顯(1秒顯,1秒隱)分前小數(shù)點(diǎn)
- 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) //秒顯秒前小數(shù)點(diǎn)
- 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) //秒計(jì)數(shù)器
- TimeCount++;
- else
- {
- TimeCount = 0x00;
- SecondFlag = 1; //置位秒標(biāo)志
- if(Second10Flag) //10秒計(jì)數(shù)器
- if(Second10Count < 20)
- Second10Count++;
- else
- {
- Second10Count = 0x00; //10秒計(jì)數(shù)器清0
- Second10Flag = 0; //清除10s標(biāo)志
- HourAdjustFlag = 0; //清除調(diào)整標(biāo)志位
- MinuteAdjustFlag = 0;
- SecondAdjustFlag = 0;
- }
- }
- }
- //============================================================================
- main(void)
- {
- //初始化
- int Second = 30; //初始化時(shí)間
- int Minute = 12;
- int Hour = 20;
- Led1 = 0x00; //清除顯存
- Led2 = 0x00;
- Led3 = 0x00;
- Led4 = 0x00;
- Led5 = 0x00;
- Led6 = 0x00;
- SecondFlag = 0;
- TimeCount = 0x00;
- //設(shè)置定時(shí)器中斷
- TMOD = 0x10f; //GATE=0 01010001
- //C/T=0--定時(shí)/計(jì)數(shù)器1工作于定時(shí)方式
- //M1=1;M0=0--選擇工作模式1,構(gòu)成最大定時(shí)器
- //T0:在此程序不使用
- TL1 = 0x13; TH1 = 0x2C; //指定定時(shí)時(shí)間為50ms 65536-50/(11.0592/12)=11283=2C13h
- EA = 1; //開(kāi)總中斷
- TF1 = 0;
- ET1 = 1; //開(kāi)定時(shí)器中斷
- TR1 = 1; //開(kāi)始計(jì)時(shí)
- while(1)
- {
- //*****************************************************************************
- //對(duì)時(shí)間進(jìn)行調(diào)整程序
- 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;
- }
- //-----------------------------------------------------------------------------
- //*****************************************************************************
- //時(shí)間調(diào)整程序
- if(HourAdjustFlag) //調(diào)整時(shí)程序
- if(Second10Flag)
- if(FlashFlag) //時(shí)秒顯
- {
- Led1 = 0x0a; //時(shí)隱
- Led2 = 0x0a;
- }
- else
- {
- Led1 = Hour/10; //時(shí)顯
- Led2 = Hour%10;
- }
- else
- {
- Led1 = Hour/10;
- Led2 = Hour%10;
- }
- else
- {
- Led1 = Hour/10;
- Led2 = Hour%10;
- }
- if(MinuteAdjustFlag) //調(diào)整分程序
- 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) //調(diào)整秒程序,控制秒顯
- 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) //時(shí)調(diào)整按鍵按下
- {
- while(!HourAdjust); //等待松開(kāi)
- HourAdjustFlag = 1; //置位時(shí)標(biāo)志位
- MinuteAdjustFlag = 0; //清除分標(biāo)志位
- SecondAdjustFlag = 0; //清除秒標(biāo)志位
- Second10Flag = 1; //置位10秒標(biāo)志位
- }
- if(!MinuteAdjust) //分調(diào)整鍵按下
- {
- while(!MinuteAdjust);
- MinuteAdjustFlag = 1;
- HourAdjustFlag = 0;
- SecondAdjustFlag = 0;
- Second10Flag = 1;
- }
- if(!SecondAdjust) //秒調(diào)整鍵按下
- {
- while(!SecondAdjust);
- SecondAdjustFlag = 1;
- HourAdjustFlag = 0;
- MinuteAdjustFlag = 0;
- Second10Flag = 1;
- }
- if(!Adjust) //調(diào)整鍵按下
- {
- while(!Adjust);
- if(HourAdjustFlag) //調(diào)整時(shí),加1
- if(Hour < 23)
- {
- Hour++;
- Second10Count = 0;
- }
- else
- Hour = 0;
- if(MinuteAdjustFlag) //調(diào)整分,加1
- if(Minute < 59)
- {
- Minute++;
- Second10Count = 0;
- }
- else //調(diào)整秒,清零
- Minute = 0;
- if(SecondAdjustFlag)
- Second = 0;
- }
- }
- }
- //********************************延時(shí)程序************************************
- void Delay100us(int Times)
- {
- Times = Times * 100;
- while(Times--);
- }
復(fù)制代碼 |
評(píng)分
-
查看全部評(píng)分
|