利用中斷與定時器來實現99秒的秒表
按鍵可以暫停
當然也可以清零 可以參照我上一個帖子自己再給按鍵加一些功能
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (13.62 KB, 下載次數: 44)
下載附件
2018-5-18 03:37 上傳
0.jpg (28.65 KB, 下載次數: 32)
下載附件
2018-5-18 03:37 上傳
單片機源程序如下:
- #include <reg52.h>
- sbit p1=P1^0;
- sbit p2=P1^1;
- sbit k1=P1^7;
- unsigned char code LedChar[] = { //數碼管顯示字符轉換表
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- };
- unsigned char LedBuff[6]= { //數碼管顯示緩沖區,初值 0xFF 確保啟動時都不亮
- 0xc0,0xc0
- };
- char scan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- unsigned char i = 0; //動態掃描的索引
- unsigned int cnt = 0;
- bit flag=0;//記錄 T0 中斷次數
- unsigned long sec = 0; //記錄經過的秒數
- void debouncer();
- void main(){
-
- EA = 1; //使能總中斷
- TMOD = 0x01; //設置 T0 為模式 1
- TH0 = 0xFC; //為 T0 賦初值 0xFC67,定時 1ms
- TL0 = 0x18;
- ET0 = 1; //使能 T0 中斷
- TR0 = 0;
- ET1=1;
- TR1=0;
- TH1=0xfc;
- TL1=0x18;
- k1=1; //啟動 T0
- while (1){
-
- if(k1==0&&flag==0){ //按鍵按下不放 開始計時 松開立即停止計時,示數定在當前計數數值
- debouncer();
- TR0=1; //打開定時器中斷0
- TR1=1; //打開定時器中斷1
- flag=1;
- while(k1==0); /*這兩句防止在 按鍵按下的短時間內程序跑飛到下一個if語句*/
- debouncer();
-
- }
-
- if(k1==0&&flag==1){ //此時 k1==0,可以實現第二次功能 若k1==1即為按鍵松開產生動作
- debouncer();
- TR1=0; //關閉定時器中斷1 使得程序停止在當前時刻
- flag=0;
- while(k1==0);
- debouncer();
- }
-
-
-
- }
- }
- /* 定時器 0 中斷服務函數 控制位 并顯示對應數值 */
- void InterruptTimer0() interrupt 1{
- TH0 = 0xFC; //重新加載初值
- TL0 = 0x18;
- cnt++; //中斷次數計數值加 1
-
- //以下代碼完成數碼管動態掃描刷新
- P2 = 0xFF;
- //顯示消隱
- switch (i){
- case 0: p2=1;p1=0; i++; P2=LedBuff[0]; break; //打開個位,關閉其他位,并給P2端口賦個位相應數值斷碼
- case 1: p1=1;p2=0; i=0; P2=LedBuff[1]; break; //打開十位,關閉其他位,并給P2端口賦十位相應數值斷碼
- default: break;
- }
- }
- void InterruptTimer1() interrupt 3{ /* 定時器 1 中斷服務函數 控制段并 將要顯示的數值斷碼 賦值到數組中等待調用 */
- TH1=0xc0;
- TL1=0x18;
- if (cnt >=800){ //判斷 T0 溢出是否達到 1000 次 此處理論上寫1000,但是實際寫800是因為為了消除計時誤差 800這個數
- cnt = 0; //達到 1000 次后計數值清零
- sec++; //秒計數自加 1
- if(sec>99)sec=0;
- //以下代碼將 sec 按十進制位從低到高依次提取并轉為數碼管顯示字符
- LedBuff[0] = LedChar[sec%10];
- LedBuff[1] = LedChar[sec/10];
-
- }
- }
- void debouncer(){ //延時20ms按鍵消抖
- int i;
- for(i=0;i<2400;i++);
- }
復制代碼
所有資料51hei提供下載:
中斷與數碼管動態掃描.rar
(15.26 KB, 下載次數: 24)
2018-5-17 23:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|