|
20黑幣
小白請教大神們幾個51中斷的問題,請指點,謝謝!
我想利用89c51測量兩個按鍵按下先后時間間隔功能。先按啟動,再按停止然后數碼管顯示出兩者先后間隔時間,如果先按停止,不做處理。必須先按啟動,然后再按停止才能顯示時間,也就是啟動和停止有先后順序,順序后了不處理。利用中斷1和中斷0在下降沿觸發方式和定時器0方式2去實現,用prutues仿真,按一下啟動,再按一下停止,可以正常顯示時間。仿真時發現幾個問題。
1.按一下啟動,再按一下啟動,IE1就會置1,(為什么?)再按一下停止,顯示時間,但T0不停止,仍然計時,需再按一下停止,定時器T0停止,顯示時間。我想實現有功能是按下啟動,定時器啟動,再按啟動沒有反應,按下停止,停止計時,顯示時間,再按下停止或沒按啟動先按停止,沒有反應。但是現在如果按兩下啟動同,必須按兩下停止才能停止定時器。
2.按一下啟動,再按一下停止,顯示時間,但再按一下停止,TE0就會置1,(為什么?)此時按一下啟動,顯示就會變成00,定時器也不啟動,再按下啟動,定時器才會啟動。
請問大神們,出現這種情況是什么原因,如果不改變中斷1和中斷0在下降沿觸發方式和定時器0方式2,如何解決,源文件附后,請大神們指點。
新手小白一枚,送點黑幣意思一下,請大神們不吝賜教,謝謝! 用protues仿真,所以按鍵沒有去抖,應該不是沒去抖的問題。
啟動1停止2.png (55.13 KB, 下載次數: 78)
下載附件
2020-6-7 10:34 上傳
啟動1停止2啟動1.png (57.74 KB, 下載次數: 66)
下載附件
2020-6-7 10:34 上傳
啟動2停止1.png (57.14 KB, 下載次數: 57)
下載附件
2020-6-7 10:34 上傳
停止1次.png (11.01 KB, 下載次數: 79)
下載附件
2020-6-7 10:34 上傳
啟動2停止1.png (57.14 KB, 下載次數: 62)
下載附件
2020-6-7 10:34 上傳
再啟動1次.png (47.93 KB, 下載次數: 74)
下載附件
2020-6-7 10:34 上傳
啟動1停止1.png (50.89 KB, 下載次數: 75)
下載附件
2020-6-7 10:31 上傳
按啟動1次.png (48.29 KB, 下載次數: 75)
下載附件
2020-6-7 10:30 上傳
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint Time=0;
- uint Time_Count=0;
- uchar Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0x7f};//段碼0-9+全暗+"."
- uchar Wei[4]={0x08,0x04,0x02,0x01}; //位的控制端 (仿真)
- uchar Time_Buffer[]={0,0,0,0}; //時間緩存
- void delayms(uint x) //延時函數
- {
- uint i,j;
- for(i = x; i > 0; i --)
- for(j = 125; j > 0; j --);
- }
- void Show_Time() //數碼管動態掃描顯示
- {
- uchar i;
- /*****************數據轉換*****************************/
-
-
- Time_Buffer[0] = Time / 1000; //千位
- Time_Buffer[1] = Time % 1000 / 100; //百位
- Time_Buffer[2] = Time % 100 /10; //十位
- Time_Buffer[3] = Time % 10; //個位
- if(Time_Buffer[0] == 0)
- {
- Time_Buffer[0] = 10;
- if(Time_Buffer[1] == 0)
- {
- Time_Buffer[1] = 10;
- }
- }
-
- for(i = 0;i < 4;i ++)
- {
- P0 = 0xFF;
- P1 = Wei[i];
- P0 = Duan[Time_Buffer[i]];
- delayms(2);
- }
- }
- /*************************************************************************
- 主函數
- **************************************************************************/
- void main()
- {
- EX1=1;
- EX0=1;
- IT0=1;//低電平有效 下降沿有效
- IT1=1;
- EA=1;
-
- TMOD=0x02; //設置為自動重載方式
- TH0=0x9c; //設置為100us的計數
- TL0=0x9c;
- TR0=0;
- Time=1898;
- while(1)
- {
- Show_Time();
- }
- }
- void Start_ExInt1()interrupt 2
- {
- TR0=1;
- EX1=0;
- ET0=1;
- EX0=1;
- }
- void Timer_T0() interrupt 1
- {
- Time_Count++;
- EX0=1;
- if ( Time_Count==9999) //計時范圍0-9999
- {
- Time_Count=0;
- }
- }
- void Stop_Int0() interrupt 0
- {
- TR0=0;
- Time= Time_Count;
- Time_Count=0;
-
- EX1=1;
- EX0=0;
- ET0=0;
- }
復制代碼
KEY1-2.rar
(62.48 KB, 下載次數: 4)
2020-6-7 10:40 上傳
點擊文件名下載附件
|
|