找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2031|回復: 7
收起左側

51單片機控制數(shù)碼管顯示(中斷問題)

[復制鏈接]
ID:1061677 發(fā)表于 2023-1-29 15:00 | 顯示全部樓層 |閱讀模式
問題是這樣的。
我希望用P3.2和P3.3引腳控制兩個彈性按鍵,實現(xiàn)秒表功能如下:
1.當P3.2引腳變?yōu)榈碗娖剑从墟I按下),暫停計數(shù);再次按下時,繼續(xù)計數(shù);
2.在任何時候P3.3引腳變?yōu)榈碗娖,則從0開始計數(shù)。
我寫了外部中斷0和外部中斷1的函數(shù),但是我不知道這兩個函數(shù)為什么不起作用,想問問大家是這個程序出問題了嗎?
還是說我還需要在主程序中加上if(P3^2==0)……if(P3^3==0)?但我記得中斷函數(shù)不需要引用即可生效的。
還望大佬指點迷津!
單片機源程序如下:
  1. #include<reg51.h>
  2. //00~60秒的簡易秒表設計,兩個靜態(tài)數(shù)碼管,定時器采用查詢方式
  3. #include<intrins.h>
  4. unsigned char count=0;
  5. unsigned char miao=56;        //秒計數(shù)器
  6. bit b=0; //暫停/繼續(xù)標志位,b=0暫停,b=1繼續(xù)
  7. void int_0() interrupt 0  //外部中斷0的中斷函數(shù),中斷類型號為0       
  8. {
  9.         if(b==0)
  10.         {
  11.                 TR1=0;
  12.                 b=1;   //暫停計數(shù)
  13.         }
  14.         else
  15.         {
  16.                 b=0;
  17.                 TR1=1;         //繼續(xù)計數(shù)
  18.         }
  19. }
  20. void int_1() interrupt 2  //外部中斷1的中斷函數(shù),中斷類型號為2
  21. {
  22.         miao=0;
  23.         count=0;                                         //清零并開始計數(shù)
  24.         TH1=(65536-50000)/256;
  25.     TL1=(65536-50000)%256;
  26.     TR1=1;
  27. }
  28. void delay1s()
  29. {
  30.         unsigned char i;
  31.     for(i=0;i<20;i++)
  32.     {
  33.                 TH1=(65536-50000)/256;
  34.         TL1=(65536-50000)%256;
  35.         TR1=1;
  36.         while(!TF1);
  37.         TF1=0;
  38.     }
  39. }
  40. void disp(unsigned char i)
  41. {
  42.     unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //定義0~9顯示碼,共陽極數(shù)碼管
  43.         P1=led[i/10];        //顯示i高位
  44.         P2=led[i%10];        //顯示i低位
  45. }
  46.                        
  47. void main()                //主函數(shù)
  48. {
  49.         TMOD=0x10;
  50.     TH1=(65536-50000)/256;
  51.     TL1=(65536-50000)%256;
  52.     ET1=1;
  53.         EX0=1;
  54.         IT0=1;
  55.         EX1=1;
  56.         IT1=1;
  57.     EA=1;
  58.     TR1=1;
  59.     while(1)
  60.     {
  61.                 disp(miao);
  62.         delay1s();
  63.         miao++;
  64.         if(miao==60)
  65.                 {
  66.                         miao=0;               
  67.         }
  68.         }
  69. }
復制代碼

簡易秒表.zip

104.99 KB, 下載次數(shù): 4

回復

使用道具 舉報

ID:146878 發(fā)表于 2023-1-31 12:36 | 顯示全部樓層
按鍵要做消抖處理。
回復

使用道具 舉報

ID:1061677 發(fā)表于 2023-2-1 13:12 | 顯示全部樓層
pdwdzz 發(fā)表于 2023-1-31 12:36
按鍵要做消抖處理。

但是我用的是51單片機,P3.2和P3.2,也就是外部中斷0和外部中斷1。寫了外部中斷0和外部中斷1的函數(shù)難道還需要按鍵消抖嗎?
回復

使用道具 舉報

ID:146878 發(fā)表于 2023-2-1 14:51 | 顯示全部樓層
百二秦關終屬我 發(fā)表于 2023-2-1 13:12
但是我用的是51單片機,P3.2和P3.2,也就是外部中斷0和外部中斷1。寫了外部中斷0和外部中斷1的函數(shù)難道還 ...

不消抖,那按下時可能多次進中斷。比如按下時因抖動進入了兩次中斷。結果時暫停又啟動。
回復

使用道具 舉報

ID:146878 發(fā)表于 2023-2-1 14:56 | 顯示全部樓層
百二秦關終屬我 發(fā)表于 2023-2-1 13:12
但是我用的是51單片機,P3.2和P3.2,也就是外部中斷0和外部中斷1。寫了外部中斷0和外部中斷1的函數(shù)難道還 ...

另外我說的指示你程序中存在的一個問題。我沒細看,應該導致沒效果還有其他原因。因為指示消抖的原因,那你的程序應該有一半概率能在正常。
回復

使用道具 舉報

ID:1061677 發(fā)表于 2023-2-2 12:39 | 顯示全部樓層
pdwdzz 發(fā)表于 2023-2-1 14:56
另外我說的指示你程序中存在的一個問題。我沒細看,應該導致沒效果還有其他原因。因為指示消抖的原因,那 ...

我按照你的說法在主函數(shù)中加了消抖,可是依然無用,我想了想,大抵是中斷函數(shù)有問題。
回復

使用道具 舉報

ID:1061677 發(fā)表于 2023-2-2 13:43 | 顯示全部樓層
pdwdzz 發(fā)表于 2023-2-1 14:56
另外我說的指示你程序中存在的一個問題。我沒細看,應該導致沒效果還有其他原因。因為指示消抖的原因,那 ...

對了,我想問一下,是不是如果定時器溢出采用查詢方式,那么INT0和INT1用中斷函數(shù)來寫就是無效的?
而如果要用到INTO和INT1的話,那定時器溢出必須使用中斷的形式。是這樣嗎?
回復

使用道具 舉報

ID:409878 發(fā)表于 2023-2-20 16:33 | 顯示全部樓層
定時器沒打開中斷,沒有起作用。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表