|
|
給51黑電子論壇的朋友們分享一個51單片機做的電子秒表程序,帶開始和停止和清除3個按鍵,可以實現(xiàn)0.01S~59分的計時。下面是該電子秒表的仿真原理圖:
0.png (25.08 KB, 下載次數(shù): 91)
下載附件
2017-3-18 03:57 上傳
單片機秒表主程序:
- /****************************************************
- *實例名稱:秒表
- *實例說明:本實例實現(xiàn)0.01S~59分的計時。按下Start鍵時
- 開始計數(shù),此時按下Stop鍵時停止計時,按下Clear鍵時清零
- 顯示屏。Start鍵和Stop鍵分別通過外部中斷0和外部中斷1來
- 實現(xiàn)操作
- *作者:kxm
- *時間:09.06.13
- ****************************************************/
- #include "target.h"
- #include "led.h"
- /*時鐘顯示數(shù)字區(qū),從左至右為:分高位,分低位;秒高位,秒低位;毫秒高位,毫秒低位*/
- uchar clock_time[8]={'0','0',0x01,'0','0',0x01,'0','0'};
- const uchar displayMode=0x24;
- void main()
- {
- uchar i;
- target_init();
- led_init();
- sei();
- while(1)
- {
- if(CLEAR_KEY==0)
- {
- for(i=0;i<200;i++);
- if(CLEAR_KEY==0)
- {
- clock_time[MS_H]='0';
- clock_time[MS_L]='0';
- clock_time[S_H]='0';
- clock_time[S_L]='0';
- clock_time[MIN_H]='0';
- clock_time[MIN_L]='0';
- }
- }
- ledSweepDisplay(clock_time,displayMode,0x08);
- }
- }
- void T0_OverFlow(void) interrupt 1 //定時器0溢出中斷,延時10ms
- {
- TH0=0xDC;
- TL0=0x00;
- if(clock_time[MS_L]<'9')
- clock_time[MS_L]++;
- else
- {
- clock_time[MS_L]='0';
- if(clock_time[MS_H]<'9')
- clock_time[MS_H]++;
- else
- {
- clock_time[MS_H]='0';
- ms_to_s(clock_time);
- }
- }
- }
- void StartInt(void) interrupt 0 //啟動按鍵通過外部中斷0
- {
- TR0=1;
- }
- void StopInt(void) interrupt 2 //停止按鍵通過外部中斷1
- {
- TR0=0;
- }
復(fù)制代碼
電子秒表的target.c源碼:
- #define TARGET_GLOBAL 1
- #include "target.h"
- /****************************************
- *函數(shù)名稱:target_init(void)
- *函數(shù)功能:包含本文件中初始化函數(shù)和變量
- *函數(shù)入口:無
- *函數(shù)出口:無
- ****************************************/
- void target_init(void)
- {
- timer0_init(); //timer0初始化
- int0_init(); //外部中斷0初始化
- int1_init(); //外部中斷1初始化
- }
- /****************************************
- *函數(shù)名稱:timer0_init(void)
- *函數(shù)功能: 定時器0初始化,11.0592Mhz晶振,
- 定時10ms
- *函數(shù)入口:無
- *函數(shù)出口:無
- *****************************************/
- void timer0_init(void)
- {
- TMOD|=0x01; //MODEL1,timer
- TH0=0xDC; //定時10ms
- TL0=0x00;
- ET0=1; //中斷使能
- TR0=0; //關(guān)閉定時器0
- }
- /****************************************
- *函數(shù)名稱:int0_init(void)
- *函數(shù)功能: 外部中斷0中斷初始化
- *函數(shù)入口:無
- *函數(shù)出口:無
- *****************************************/
- void int0_init(void)
- {
- EX0 = 1; //外部中斷0使能
- T0 = 1; //外部中斷0跳變中斷(下降沿跳變)
- }
- /****************************************
- *函數(shù)名稱:int1_init(void)
- *函數(shù)功能: 外部中斷0中斷初始化
- *函數(shù)入口:無
- *函數(shù)出口:無
- *****************************************/
- void int1_init(void)
- {
- EX1 = 1; //外部中斷1使能
- IT1 = 1; //外部中斷1跳變中斷(下降沿跳變)
- }
- /*******************************************
- *函數(shù)名稱:ms_to_s(uchar *clockS)
- *函數(shù)功能:實現(xiàn)毫秒級向秒級進位
- *函數(shù)入口:*clockS,指向時間數(shù)組的指針
- *函數(shù)出口:無
- 說明:說明:毫秒級和秒級計數(shù)均為兩位BCD碼,
- 毫秒最大值為99,秒最大值為59
- *******************************************/
- void ms_to_s(uchar *clockS)
- {
- if(clockS[S_L]<'9')
- clockS[S_L]++;
- else
- {
- clockS[S_L]='0';
- if(clockS[S_H]<'5')
- clockS[S_H]++;
- else
- {
- clockS[S_H]='0';
- s_to_min(clockS);
- }
- }
- }
- /*******************************************
- *函數(shù)名稱:s_to_min(uchar *clockMin)
- *函數(shù)功能:實現(xiàn)秒級向分鐘級進位
- *函數(shù)入口:*clockMin,指向時間數(shù)組的指針
- *函數(shù)出口:無
- *說明:秒級和分鐘級計數(shù)均為兩位BCD碼,
- 秒最大值59,分最大值99
- *******************************************/
- void s_to_min(uchar *clockMin)
- {
- if(clockMin[MIN_L]<'9')
- clockMin[MIN_L]++;
- else
- {
- clockMin[MIN_L]='0';
- if(clockMin[MIN_H]<'9')
- clockMin[MIN_H]++;
- else
- {
- clockMin[MIN_H]='0';
- }
- }
- }
復(fù)制代碼
0.png (47.5 KB, 下載次數(shù): 126)
下載附件
2017-3-18 03:56 上傳
仿真工程文件和源碼下載:
電子秒表.rar
(15.27 KB, 下載次數(shù): 112)
2017-3-18 03:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|