找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1243|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)定時(shí)器延遲按鍵的奇怪問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:718523 發(fā)表于 2024-1-19 20:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
下面的程序是對(duì)的沒有錯(cuò)誤,有一個(gè)疑惑: 在定時(shí)器中斷子程序中我把 if(flagkey==0){ 改成 if(flagkey==1) 就不正常,這是什么原因呀,正常不是應(yīng)該就等于1嗎?在檢定按鍵程序里

if(p01 == 0){
          flagkey=1;
          TR0 = 1;//這里才是要進(jìn)中斷的地方呀為什么就不正常呢
          }
          else{
                            flagkey=0; //為什么這個(gè)正常
                  }

單片機(jī)源程序如下:
  1. /*------------定時(shí)器----------------*/
  2. void Timer0Init(void)                //10Ms
  3. {
  4.         TMOD = 0x01;
  5.     TH0 = 0x0D8;
  6.     TL0 = 0x0F0;
  7.     EA = 1;
  8.     ET0 = 1;
  9.     //TR0 = 1;
  10. }

  11. /*------------檢察按鍵----------------*/  
  12. void anjian(void)
  13. {
  14.           if(p01 == 0){// 檢測(cè)按鍵是否按下
  15.           flagkey=1;
  16.           TR0 = 1;//按鍵按下開始計(jì)時(shí),溢出后中斷
  17.           }
  18.           else{
  19.                             flagkey=0;
  20.                   }
  21. }

  22. /*------------主程序----------------*/
  23. void main()
  24. {
  25.   Timer0Init(); //定時(shí)器初始化  
  26.         while(1)
  27.         {            
  28.                         anjian();                         //檢察按鍵
  29.         }
  30. }




  31. /*------------定時(shí)器中斷子程序----------------*/
  32. void Timer0Interrupt(void) interrupt 1{
  33. if(flagkey==0){      //改成if(flagkey==0){程序就有問題if(flagkey==0){
  34. flagkey=999;        
  35. Timer0Init_count ++;
  36. if(Timer0Init_count>5){
  37. TR0 = 0;//關(guān)定時(shí)器
  38. TH0 = 0x0D8;//賦初值
  39. TL0 = 0x0F0;

  40. P10 = ~P10;
  41. }}

  42. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

5#
ID:1080331 發(fā)表于 2024-1-20 11:02 | 只看該作者
根據(jù)你提供的代碼,在定時(shí)器中斷子程序中,你將 if(flagkey==0) 改為了 if(flagkey==1)。這導(dǎo)致程序出現(xiàn)問題的原因是,flagkey 的初始值為0,當(dāng)按鍵按下時(shí),會(huì)將 flagkey 設(shè)置為1,然后開啟定時(shí)器。而在定時(shí)器中斷子程序中,你判斷 flagkey 是否為0,如果不為0,則執(zhí)行相應(yīng)的操作。

因此,當(dāng)你將 if(flagkey==0) 改為了 if(flagkey==1) 時(shí),定時(shí)器中斷子程序只有在 flagkey 的值為1時(shí)才會(huì)執(zhí)行相應(yīng)的操作。但是根據(jù)你提供的代碼邏輯,在按鍵按下后,會(huì)將 flagkey 設(shè)置為1,并開啟定時(shí)器,所以此時(shí) flagkey 的值應(yīng)該是1。

因此,將 if(flagkey==0) 改為 if(flagkey==1) 會(huì)導(dǎo)致定時(shí)器中斷子程序無法執(zhí)行相應(yīng)的操作,從而導(dǎo)致程序異常。你可以將 if(flagkey==0) 改回來,以恢復(fù)正常運(yùn)行的狀態(tài)。
回復(fù)

使用道具 舉報(bào)

地板
ID:226055 發(fā)表于 2024-1-20 10:14 | 只看該作者
    1、軟件IO口判斷是否為1取決于硬件電路。
    2、你需要把硬件電路按鍵檢測(cè)部分上下圖,脫離硬件的軟件設(shè)計(jì)是危險(xiǎn)的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:192020 發(fā)表于 2024-1-20 09:16 | 只看該作者
試下改成if(flagkey==1)時(shí),按按鍵久一點(diǎn)什么效果
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:275826 發(fā)表于 2024-1-20 08:28 | 只看該作者
程序不完整
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表