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