|
可調(diào)時(shí)鐘仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (13.23 KB, 下載次數(shù): 39)
下載附件
2018-5-29 01:27 上傳
單片機(jī)源程序如下:
- #include "reg52.h"
- typedef unsigned char u8; // 定義無(wú)符號(hào)8位類型
- typedef unsigned short int u16; // 定義無(wú)符號(hào)16位類型
- typedef unsigned long int u32; // 定義無(wú)符號(hào)32位類型
- sbit Button1 = P1^0; // 模式按鈕
- sbit Button2 = P1^1; // 加號(hào)按鈕
- sbit Button3 = P1^2; // 減號(hào)按鈕
- u8 DisBuf[8] = { 12,30,17,30,00,17,00,00 }; // 數(shù)碼管初始值無(wú)顯示
- u8 Hour=12,Min=30,Sec=0;
- u32 seconds = 0;
- /********************************************************************
- * 函數(shù)功能 :延時(shí)函數(shù)
- * 入口參數(shù) :None
- * 出口參數(shù) : Time:延時(shí)時(shí)間
- * 其他描述
- ********************************************************************/
- void Delay_us( u16 Time )
- {
- while( Time-- );
- }
- /********************************************************************
- * 函數(shù)功能 :數(shù)碼管驅(qū)動(dòng)
- * 入口參數(shù) :None
- * 出口參數(shù) : 按鍵識(shí)別碼
- * 其他描述
- ********************************************************************/
- void Seg_Drive( void )
- {
- // 共陽(yáng)極數(shù)碼管的數(shù)碼表
- u8 code codebuf[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf,0xff};
- u8 i = 0;
- for( i=0;i<8;i++ ) // 有8個(gè)為共陰極數(shù)碼管
- {
- P3 = 0xff; // 關(guān)閉顯示,消除鬼影
- P3 = ~(1<<i); // 輸出片選
- P2 = ~codebuf[DisBuf[i]]; // 根據(jù)緩沖區(qū)顯示數(shù)據(jù)且數(shù)碼管顯示數(shù)字2015.09.15
- Delay_us( 200 ); // 200 us的時(shí)間
- }
- }
- /********************************************************************
- * 函數(shù)功能 :數(shù)據(jù)拆分
- * 入口參數(shù) :None
- * 出口參數(shù) : Num:兩位數(shù)據(jù)
- * 其他描述
- ********************************************************************/
- void SegDisp( u8 hour,u8 min,u8 sec )
- {
- DisBuf[0] = hour/10; //
- DisBuf[1] = hour%10; //
- DisBuf[3] = min/10; //
- DisBuf[4] = min%10; //
- DisBuf[6] = sec/10; //
- DisBuf[7] = sec%10; //
- }
-
- /********************************************************************
- * 函數(shù)功能 :ScanKey
- * 入口參數(shù) :None
- * 出口參數(shù) : 按鍵識(shí)別碼
- * 其他描述 矩陣按鍵的掃描
- ********************************************************************/
- u8 ScanKey( void )
- {
- if( 0 == Button1 ) return 'M'; // 返回對(duì)數(shù)據(jù)執(zhí)行的模式M
- if( 0 == Button2 ) return '+'; // 返回對(duì)數(shù)據(jù)執(zhí)行的加數(shù)+
- if( 0 == Button3 ) return '-'; // 返回對(duì)數(shù)據(jù)執(zhí)行的減數(shù)-
- return 0;
- }
- /********************************************************************
- * 函數(shù)功能 :按鍵判斷、消除抖動(dòng)、松手檢測(cè)
- * 入口參數(shù) :None
- * 出口參數(shù) : 按鍵識(shí)別碼
- * 其他描述 :
- ********************************************************************/
- u8 ReadKey( void )
- {
- u8 tmp;
- tmp = ScanKey(); // 讀取按鍵值
- if( 0 == tmp ) return 0; // 判斷是否有按鍵按下
- if( tmp!=ScanKey() ) return 0; // 讀回來(lái)的值是否與原來(lái)相同
- while( 0 != ScanKey() ); // 讀回來(lái)的按鍵為0,也就是說(shuō)是松手檢測(cè)
- return tmp; // 返回鍵值
- }
- /********************************************************************
- * 函數(shù)功能 :定時(shí)器初始化
- * 入口參數(shù) :None
- * 出口參數(shù) : None
- * 其他描述 :
- ********************************************************************/
- void time_init( void )
- {
- TMOD = 0x01; // 設(shè)置定時(shí)T0器工作方式1
- EA = 1; // 開啟T0總中斷
- TR0 = 1; // 啟動(dòng)T0定時(shí)器
- ET0 = 1; // 開啟計(jì)數(shù)/定時(shí)器T0中斷
- }
- /********************************************************************
- * 函數(shù)功能 :用戶程序入口
- * 入口參數(shù) :None
- * 出口參數(shù) : None
- * 其他描述 :
- ********************************************************************/
- void main( void )
- {
- u8 Num = 0;
- static u8 Mode = 0;
-
- time_init(); // 定時(shí)器初始化
- while( 1 )
- {
- switch( ReadKey() )
- {
- // 三種模式:時(shí)、分、秒
- case 'M': Mode = (Mode+1)%4; break;
- // 時(shí)鐘調(diào)整 增操作
- case '+':
- if( 1 == Mode ) // 小時(shí)調(diào)整
- {
- Hour = (Hour+1)%24; // 一天 24 小時(shí)
- }
- else if ( 2== Mode )
- {
- Min = (Min+1)%60; // 一小時(shí)60 分鐘
- }
- else if ( 3== Mode )
- {
- Sec = (Sec+1)%60; // 一分鐘 60 秒
- }
- break;
-
- // 時(shí)鐘調(diào)整 減操作
- case '-':
- if( 1 == Mode ) // 小時(shí)調(diào)整
- {
- Hour == 0 ? Hour =23 : Hour--; // 一天 24 小時(shí)
- }
- else if ( 2== Mode )
- {
- Min == 0 ? Min =59 : Min--; // 一小時(shí)60 分鐘
- }
- else if ( 3== Mode )
- {
- Sec == 0 ? Sec =59 : Sec--; // 一分鐘 60 秒
- }
- break;
- }
-
- SegDisp(Hour,Min,Sec); // 數(shù)碼管數(shù)據(jù)拆分
- Seg_Drive(); // 數(shù)碼管驅(qū)動(dòng)
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
Chap6_3(可調(diào)時(shí)鐘).rar
(72.38 KB, 下載次數(shù): 26)
2018-5-28 19:52 上傳
點(diǎn)擊文件名下載附件
protues仿真 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|