找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3826|回復: 17
打印 上一主題 下一主題
收起左側

使用單獨按鍵實現(xiàn)漸亮漸滅 單片機程序有問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:3241 發(fā)表于 2020-7-20 09:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大蝦,我是剛剛學單片機,如何使用單獨按鍵實現(xiàn)漸亮漸滅(功能是用一個輕觸開關,開燈時LED燈慢慢亮起和關燈時慢慢滅掉),我寫程序但無法開關,為什么;
//功能為用S1控制LED漸亮漸滅//
#include <AT89X51.H>
unsigned char ID;
unsigned int T=500,Toff=0;
sbit LED=P1^0;         
sbit S1=P3^7;   
void no();
void off();
void Delay(unsigned int t);
void main(void)
{
   LED=1;
   while(1)
   {
     if(S1==0)
     {
       Delay(500);
       if(S1==0)
         {
          ID++;
          if(ID==2)
          {
           ID=0;
          }
           while(S1==0);
         }
      }
    switch(ID)
     {
      case 0:
      no();
      break;
      case 1:
      off();
      break;
      }
  }
}

/*以下為漸亮保持*/
void no (void)
{

     for(Toff=1;Toff<T;Toff++)  
      {
               LED=0;                    
               Delay(Toff);            
               LED=1;                  
              Delay(T-Toff);           
      }  

      LED=0;
         while (1);

}

/*以下為漸滅保持*/
void off (void)
{                        
   for(Toff=T-1;Toff>0;Toff--)   
    {
             LED=0;                     
             Delay(Toff);               
             LED=1;                    
            Delay(T-Toff);            
     }

      LED=1;
      while (1);
}
/*以下為延時函數(shù)*/
void Delay(unsigned int t)   
{                        
while(--t);                 
}

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

使用道具 舉報

沙發(fā)
ID:733205 發(fā)表于 2020-7-20 10:43 | 只看該作者
你這個沒法做到漸亮漸滅吧,你這個直接拉低了,直接就滅了。你應該用PWM來做才能實現(xiàn)漸亮漸滅
回復

使用道具 舉報

板凳
ID:3241 發(fā)表于 2020-7-20 11:01 | 只看該作者
漸亮漸滅這個子程序是沒有問題的,我試驗過OK的,主要是主程序有點問題
回復

使用道具 舉報

地板
ID:601837 發(fā)表于 2020-7-20 11:06 | 只看該作者
你這個程序只能漸亮  不能關閉漸滅吧
回復

使用道具 舉報

5#
ID:636538 發(fā)表于 2020-7-20 11:26 | 只看該作者
ID這個變量初始化為ID=0;然后如果可以按鍵改為標志位,而不是這種判斷結束
回復

使用道具 舉報

6#
ID:475444 發(fā)表于 2020-7-20 12:26 | 只看該作者
用定時器給一個值在那里++或--就是漸亮漸滅效果,當然按鍵要放到定時中斷內做,而不是Delay按鍵,否則你按鍵控制不了要運行的程序
回復

使用道具 舉報

7#
ID:716656 發(fā)表于 2020-7-20 14:00 | 只看該作者
  1. #include <reg52.h>
  2. unsigned char ID=0;
  3. unsigned int Toff=0;
  4. sbit LED=P1^0;         
  5. sbit S1=P3^7;   
  6. void no();
  7. void off();
  8. void Delay(unsigned int t);
  9. void main(void)
  10. {
  11.          S1=1;
  12.    LED=1;
  13.    while(1)
  14.    {
  15.      if(S1==0)
  16.      {
  17.        Delay(500);
  18.        if(S1==0)
  19.          {
  20.                                   while(S1==0);
  21.           ID++;
  22.           if(ID==3)
  23.           {
  24.            ID=0;
  25.           }
  26.          }
  27.                                         switch(ID)
  28.                                  {
  29.                                         case 1:
  30.                                         no();
  31.                                         break;
  32.                                         case 2:
  33.                                         off();
  34.                                         break;
  35.                                         }
  36.       }
  37.   }
  38. }

  39. /*???????*/
  40. void no(void)
  41. {
  42.      for(Toff=1;Toff<500;Toff++)  
  43.       {
  44.                LED=0;                    
  45.                Delay(Toff);            
  46.                LED=1;                  
  47.               Delay(500-Toff);           
  48.       }  
  49.       LED=0;
  50.                         Delay(1000);
  51. //      while (1);
  52. }
  53. /*???????*/
  54. void off(void)
  55. {                        
  56.    for(Toff=500;Toff>0;Toff--)   
  57.     {
  58.              LED=0;                     
  59.              Delay(Toff);               
  60.              LED=1;                    
  61.             Delay(500-Toff);            
  62.      }
  63.       LED=1;
  64.                  Delay(1000);
  65. //      while (1);
  66. }
  67. /*???????*/
  68. void Delay(unsigned int t)   
  69. {                        
  70. while(--t);                 
  71. }
  72. 隨意改了下,做了仿真,你看看有啥區(qū)別,特別是no和off里的while。還有switch的位置
復制代碼
回復

使用道具 舉報

8#
ID:801957 發(fā)表于 2020-7-20 16:33 | 只看該作者
漸滅程序實現(xiàn)不了,還要用到中斷,主程序好像有問題
回復

使用道具 舉報

9#
ID:213173 發(fā)表于 2020-7-20 17:31 | 只看該作者
這個不難,按鍵控制一個標志取反,定時器中斷寫PWM調光程序,判斷標志改變占空比由0%逐漸到100%或由100%逐漸到0%。
回復

使用道具 舉報

10#
ID:3241 發(fā)表于 2020-7-21 11:15 | 只看該作者

我按你程序試了一下,開關時會中跳一下,再開關
回復

使用道具 舉報

11#
ID:3241 發(fā)表于 2020-7-21 11:18 | 只看該作者
wulin 發(fā)表于 2020-7-20 17:31
這個不難,按鍵控制一個標志取反,定時器中斷寫PWM調光程序,判斷標志改變占空比由0%逐漸到100%或由100%逐 ...

因剛學不太會,有參考的程序嗎
回復

使用道具 舉報

12#
ID:213173 發(fā)表于 2020-7-21 14:24 | 只看該作者
daiwenping 發(fā)表于 2020-7-21 11:18
因剛學不太會,有參考的程序嗎

漸亮漸暗5秒
  1. #include <reg51.H>
  2. sbit k1 =P3^0;
  3. sbit LED=P1^0;
  4. unsigned char i,num;
  5. bit flag=0;
  6. void keyscan()    //按鍵掃描
  7. {
  8.         static unsigned char count=0;
  9.         static bit sign=0;
  10.         if(!k1)
  11.         {
  12.                 count++;
  13.                 if(count>=100 && sign==0)
  14.                 {
  15.                         sign=1;
  16.                         flag=~flag;
  17.                 }
  18.         }
  19.         else
  20.         {
  21.                 count=0;
  22.                 sign=0;
  23.         }
  24. }
  25. void Timer0Init()                //500微秒@12.000MHz
  26. {

  27.         TMOD= 0x01;                //設置定時器模式
  28.         TL0 = 0x0C;                //設置定時初值
  29.         TH0 = 0xFE;                //設置定時初值
  30.         TF0 = 0;                //清除TF0標志
  31.         TR0 = 1;                //定時器0開始計時
  32.         EA = 1;
  33.         ET0 = 1;
  34. }

  35. void main(void)
  36. {
  37.     Timer0Init();
  38.         while(1)
  39.         {
  40.                 keyscan();
  41.         }
  42. }

  43. void Timer0Interrupt(void) interrupt 1
  44. {
  45.         TL0 = 0x0C;                //設置定時初值
  46.         TH0 = 0xFE;                //設置定時初值

  47.         if(i>=num)
  48.                 LED=1;
  49.         else LED=0;

  50.         i++;
  51.         if(i==100)
  52.         {
  53.                 i=0;
  54.                 if(flag)
  55.                 {
  56.                         if(num<100)
  57.                                 num++;
  58.                 }
  59.                 else
  60.                 {
  61.                         if(num>0)
  62.                                 num--;
  63.                 }
  64.         }
  65. }
復制代碼
回復

使用道具 舉報

13#
ID:3241 發(fā)表于 2020-7-22 15:07 | 只看該作者

吳工,您好!還是有問題,LED一直不亮;開關無作用;我有點不明白什么,void Timer0Interrupt(void) interrupt 1沒有引用到程序中,是特意這樣嗎
回復

使用道具 舉報

14#
ID:311846 發(fā)表于 2020-7-22 16:40 | 只看該作者
daiwenping 發(fā)表于 2020-7-22 15:07
吳工,您好!還是有問題,LED一直不亮;開關無作用;我有點不明白什么,void Timer0Interrupt(void) inte ...

建議你回去看書,IO口控制部分和中斷
回復

使用道具 舉報

15#
ID:332444 發(fā)表于 2020-7-22 17:17 | 只看該作者
就是占空比可參https://blog.csdn.net/xianfajushi/article/details/81331101,其中c的值用按鍵控制即可。
回復

使用道具 舉報

16#
ID:213173 發(fā)表于 2020-7-22 21:26 | 只看該作者
daiwenping 發(fā)表于 2020-7-22 15:07
吳工,您好!還是有問題,LED一直不亮;開關無作用;我有點不明白什么,void Timer0Interrupt(void) inte ...

1.這個程序只能用于實物,仿真軟件只能用虛擬示波器看波形,LED反映不了亮度變化。
2.定時器中斷是獨立于主程序按預設時間工作的,無須調用。
回復

使用道具 舉報

17#
ID:332444 發(fā)表于 2020-7-23 14:24 | 只看該作者
更新了示例代碼,自動調節(jié)占空比,演示如下:

回復

使用道具 舉報

18#
ID:808700 發(fā)表于 2020-7-28 16:50 | 只看該作者
變量ID初始化改成0吧,switch哪里再加一個define
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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