標題: 為什么程實現(xiàn)不了,是哪里有錯誤呢 [打印本頁]

作者: 查理九世    時間: 2019-3-9 23:32
標題: 為什么程實現(xiàn)不了,是哪里有錯誤呢
剛學51單片機,寫了一個通過按鍵減小輸出方波的占空比的程序,按下K1在原有方波基礎上減小10%占空比,按下K2在原有方波基礎上減小20%的占空比,在未按任何按鍵之前有輸出周期為10ms的方波,晶振頻率為12Mhz。但是在按下按鍵之后占空比變化超出設計,為什么會這樣呢?
  1. #include<reg52.h>
  2. unsigned char P10ms=0;                          //定義10ms計數(shù)器,并清零賦值
  3. typedef unsigned char u16;
  4. sbit K1=P3^1;                                          //獨立按鍵K1的端口定義
  5. sbit K2=P3^2;                                          //獨立按鍵K2的端口定義
  6. sbit P10=P2^0;                                          //定義P1為P2^0從21引腳輸出
  7. void delay(u16 t)                                 //延時函數(shù)
  8. {
  9.     while(t--);
  10. }
  11. void keypress1()                                         //定義按鍵1函數(shù)
  12. {
  13.    if(K1==0)                                          //判斷K1是否按下
  14.    {
  15.       delay(1000);                                //消抖
  16.           if(K1==0)
  17.           {
  18.              TH1=0x06;                                  //重置T1定時初值為25us
  19.                  TL1=0x06;                     //重置T1定時初值為25us
  20.                  if(P10==1) P10=0;            //若P1.0為高電平,則P1.0轉為低電平
  21.                  else
  22.                      {
  23.                            P10ms++;                         //若1.0位低電平,則1ms計數(shù)
  24.                            if(P10ms==36)        //判斷9ms是否滿足,及實現(xiàn)減小10%的占空比
  25.                            {
  26.                              P10=1;                 //滿足9ms,P1.0轉為高電平
  27.                                  P10ms=0;          //10ms計數(shù)器清零
  28.                                  }
  29.                          }
  30.            }
  31.         }
  32. }

  33. void keypress2()                                   //定義按建2函數(shù)
  34. {
  35.    if(K2==0)                                           //判斷K2是否按下
  36.    {
  37.       delay(1000);                 //消抖
  38.           if(K2==0)
  39.           {
  40.              TH1=0x06;                      //重置T0定時初值為25us
  41.                  TL1=0x06;                      //重置T0定時初值為25us
  42.                  if(P10==1) P10=0;              //若P1.0為高電平,則P1.0轉為低電平
  43.                  else
  44.                      {
  45.                            P10ms++;                          //若1.0位低電平,則1ms計數(shù)
  46.                            if(P10ms==32)         //判斷是否達到8ms,即實現(xiàn)減小20%的占空比
  47.                            {
  48.                              P10=1;                         //滿足8ms,P1.0轉為高電平
  49.                                  P10ms=0;                 //10ms計數(shù)清零
  50.                            }
  51.                          }
  52.            }
  53.         }
  54. }
  55. void main()
  56. {
  57.   TMOD=0x20;                     //TMOD=00100000B,置T1定時器方式2
  58.   TH1=0x06;                     //置T1定時初值250us
  59.   TL1=0x06;                                                //置T1定時初值250us
  60.   IP=0x08;                           //IP=00001000B,置T1為高優(yōu)先級
  61.   IE=0xff;                          //IE=11111111B,全部開中
  62.   TR1=1;                         //T1運行
  63.   P10=0;                        //脈沖方波初始輸出為低電平
  64.   while(1);                       //無限循環(huán),等待T1中斷
  65. }
  66. void t1() interrupt 3
  67. {
  68.    if(K1==1&&K2==1)                   //判斷K1和K2是否按下,
  69.    {
  70.     P10ms++;                           //開始計數(shù)
  71.     if(P10ms==20)        //若10ms計數(shù)器到位,則
  72.     {
  73.       P10=!P10;                //P1.0引腳端輸出電平取反(輸出周期10ms脈沖方波,占空比為50%)
  74.           P10ms=0;                //10ms計數(shù)器清0
  75.         }                
  76.     }
  77.    else
  78.    {
  79.         keypress1();
  80.         keypress2();
  81.         }
  82. }
復制代碼



極速截圖201903092330.png (61.81 KB, 下載次數(shù): 73)

極速截圖201903092330.png

作者: zhb2004xp    時間: 2019-3-10 00:13
按鍵松開的動作沒有檢測
在30行和53行前插入  while(!k1);和 while(!k2);
作者: 黑黑—坤    時間: 2019-3-10 00:24
中斷函數(shù)運行delay()函數(shù)時間太長了吧!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1