欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于單片機PWM呼吸燈程序的幾個問題,求解答 [打印本頁]

作者: ZhouYangLa    時間: 2021-4-9 23:51
標題: 關于單片機PWM呼吸燈程序的幾個問題,求解答
  這是我編寫的PWM呼吸燈程序,但是只有在中斷里面加上while(1)循環他才能呼吸。沒有這個while直接就不亮了,但我看別人的呼吸燈函數中斷內沒有while循環也能呼吸,這是為什么?
  還有一個問題,加上while循環后的呼吸燈在逐漸變暗的時候“燈亮滅的抖動”明顯,怎么能讓他看起來流暢一點。

單片機源程序如下:
  1. #include "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LED = P2^0;

  5. u16 timer1, count, value;
  6. bit flag;

  7. void TimeInit()//¶¨ê±1us
  8. {
  9.         TMOD |= 0x10;
  10.         TH1 = 0xFF;
  11.         TL1 = 0xFF;
  12.         TR1 = 1;
  13.         EA = 1;
  14.         ET1 = 1;
  15. }

  16. void main()
  17. {
  18.                 LED = 1;
  19.                 timer1 = 0;
  20.                 count = 0;
  21.                 value = 0;
  22.                 flag = 0;
  23.                 TimeInit();
  24.                 while(1);
  25. }

  26. void Time() interrupt 2
  27. {
  28.         TH1 = 0xFF;
  29.         TL1 = 0xFF;
  30.         //while(1)
  31. //        {
  32.                 timer1++;
  33.                 count++;
  34.                         if(timer1 == 1000)
  35.                         {
  36.                                 timer1 = 0;
  37.                                 LED = 1;
  38.                         }
  39.                         if(count == 100)
  40.                         {
  41.                                 count = 0;
  42.                                 if(flag == 0)
  43.                                 {
  44.                                         value++;
  45.                                 }
  46.                                 if(flag == 1)
  47.                                 {
  48.                                         value--;
  49.                                 }
  50.                         }
  51.                         if(value == 1000)
  52.                         {
  53.                                 flag = 1;
  54.                         }
  55.                         if(value == 0)
  56.                         {
  57.                                 flag = 0;
  58.                         }
  59.                         if(value > timer1)
  60.                         {
  61.                                 LED = 0;
  62.                         }
  63.                         else
  64.                         {
  65.                                 LED = 1;
  66.                         }
  67.         //        }
  68. }
復制代碼


作者: mengzhixinheng    時間: 2021-4-10 08:41
51是溢出中斷還是匹配中斷?如果是溢出中斷的話,你的初值不合適,雖然邏輯沒錯但是定時器溢出太頻繁了,根本無法正常運行。就模擬占空比控制LED而言,1ms時基絕對沒問題。雖然寫的很復雜,邏輯好像沒錯,修改定時器溢出時間后如果led顯示不平滑可更改你的count。
作者: mengzhixinheng    時間: 2021-4-10 09:05
溢出時間重設,不然無法正常中斷。減小count
作者: ANT1987    時間: 2021-4-10 10:32
你在定時中斷里面加while(1)的結果就是程序就在定時中斷里面跑不出來了
將執行LED代碼放到主函數里面,定時中斷函數只負責計算時間 重置標志位
作者: 人人學會單片機    時間: 2021-4-10 11:33
PWM程序 STC89單片機 定時器做 http://m.raoushi.com/bbs/dpj-200820-1.html
作者: ZhouYangLa    時間: 2021-4-12 17:07
  1. #include "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LED = P2^0;

  5. u16 timer1, count, value;
  6. bit flag;

  7. void TimeInit()//¶¨ê±1us
  8. {
  9.         TMOD |= 0x01;
  10.         TH0 = 0xFF;
  11.         TL0 = 0xFF;
  12.        
  13.         //TR0 = 1;
  14.         EA = 1;
  15.         ET0 = 1;
  16. }

  17. void main()
  18. {
  19.                 LED = 1;
  20.                 timer1 = 0;
  21.                 count = 0;
  22.                 value = 0;
  23.                 flag = 0;
  24.                 TimeInit();
  25.         while(1)
  26.         {
  27.                 TR0 = 1;
  28.                 if(timer1 == 1000)
  29.                         {
  30.                                 timer1 = 0;
  31.                                 LED = 1;
  32.                         }
  33.                         if(count == 100)
  34.                         {
  35.                                 count = 0;
  36.                                 if(flag == 0)
  37.                                 {
  38.                                         value++;
  39.                                 }
  40.                                 if(flag == 1)
  41.                                 {
  42.                                         value--;
  43.                                 }
  44.                         }
  45.                         if(value == 1000)
  46.                         {
  47.                                 flag = 1;
  48.                         }
  49.                         if(value == 0)
  50.                         {
  51.                                 flag = 0;
  52.                         }
  53.                         if(value > timer1)
  54.                         {
  55.                                 LED = 0;
  56.                         }
  57.                         else
  58.                         {
  59.                                 LED = 1;
  60.                         }
  61.                 }
  62. }

  63. void Time() interrupt 1
  64. {
  65.         TH0 = 0xFF;
  66.         TL0 = 0xFF;
  67.         timer1++;
  68.         count++;
  69. }
復制代碼


我重新排了一下,這直接不亮了。。。
作者: ZhouYangLa    時間: 2021-4-12 17:27
時間我不知道怎么設置好了。。。




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