|
zl2168 發表于 2018-6-7 20:47 謝謝幫助 |
wulin 發表于 2018-6-7 15:51 大神 你這是直接幫我寫出了嗎 辛苦了 還打好了備注 作為一個初學者 非常感謝 |
liyongan_1985 發表于 2018-6-7 18:09 額 第一次發帖見諒見諒 謝謝大佬的幫助 |
|
本帖最后由 zl2168 于 2018-6-7 20:49 編輯 介紹你一個參考案例 實例96 能預置初值的倒計時秒表
實例96 能設置初值的倒計時秒表.rar
(40 KB, 下載次數: 31)
先Proteus仿真一下,確認有效。
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,書中電路和程序設計有詳細說明,電路與程序真實可靠可信可行,程序語句條條有注解。 |
| 啥問題也沒有說明白。再說這是你的全部程序嗎?如果是,你的程序計時是不會對的,因為你的定時器在初始化的時候就已經開始計數了,會產生計時不準確的。 |
| 這個論壇沒人的嗎 |
|
#include <AT89X52.H> #define uchar unsigned char #define uint unsigned int sbit key1=P2^0; sbit key2=P2^1; uchar code table[]={ //共陽數碼管段碼"0~f-." 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e,0xbf,0x7f}; uchar Cnt50ms = 0; uchar Cnt1s = 24; void display()//顯示程序 { static uchar count=0; //計數變量 static uchar count1=0; count1++; //動態顯示計數延時 if(count1>=50) { count1=0; P1=0xff; //消隱 switch(count) { case 0: P3=0x01; //秒十位位碼 P1=table[Cnt1s/10];//秒十位段碼 count=1; break; case 1: P3=0x02; //秒個位位碼 P1=table[Cnt1s%10];//秒個位段碼 count=0; break; } } } void Timer0Init() //50毫秒@12.000MHz { TMOD= 0x01; //設置定時器模式 TL0 = 0xB0; //設置定時初值 TH0 = 0x3C; //設置定時初值 TF0 = 0; //清除TF0標志 // TR0 = 1; //定時器0開始計時 EA=1; //開總中斷 ET0=1; //開定時器0中斷 } void keyscan() //按鍵掃描 { static uchar count1=0,count2=0; //計數變量 static bit key_sign1=0,key_sign2=0; //按鍵狀態標志 if(key1==0) //檢測輸入如果為0 { count1++; //計數延時消抖 if((count1>=250)&&(key_sign1==0)) { key_sign1=1; //按鍵狀態標志置1,防止重復響應 TR0 = 1; //定時器0開始計時 } } else //按鍵抬起 { count1=0; //計數變量清0 key_sign1=0; //按鍵狀態標志清0 } if(key2==0) //檢測輸入如果為0 { count2++; //計數延時消抖 if((count2>=250)&&(key_sign2==0)) { key_sign2=1; //按鍵狀態標志置1,防止重復響應 Cnt1s=24; TR0 = 0; //定時器0停止計時 } } else //按鍵抬起 { count2=0; //計數變量清0 key_sign2=0; //按鍵狀態標志清0 } } /***************主程序****************/ void main() { Timer0Init(); //定時器初始化 while(1) { keyscan(); //按鍵掃描 display(); //顯示程序 } } /**************中斷服務程序*****************/ void timer0() interrupt 1 { TL0 = 0xB0; //設置定時初值 TH0 = 0x3C; //設置定時初值 Cnt50ms++; if(Cnt50ms>=20) //1s { Cnt50ms=0; Cnt1s--; if(Cnt1s==0) { Cnt1s=0; TR0 = 0; //定時器0停止計時 } } } |