找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5311|回復: 7
收起左側(cè)

通過按鍵調(diào)節(jié)PWM進而控制led亮度的proteus仿真達不到預期的效果

[復制鏈接]
ID:288202 發(fā)表于 2018-3-13 16:57 | 顯示全部樓層 |閱讀模式
各位大神,誰能幫我解答一下,為什么我的仿真達不到預期的效果,原代碼和圖像請參考
pwm.rar (80.14 KB, 下載次數(shù): 50)
我所參考的鏈接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
我的結(jié)果截圖:

仿真狀態(tài)

仿真狀態(tài)


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

  2. unsigned char a, b;

  3. sbit K1 = P3^2;     //定義兩個調(diào)整占空比的按鍵
  4. sbit K2 = P3^3;

  5. //------------------------------------------

  6. void  delay(unsigned int i)
  7. {
  8.     unsigned char j;
  9.     while(i--)  
  10.                 for(j = 0; j < 60; j++);
  11. }

  12. //------------------------------------------

  13. void main()
  14. {
  15.     TMOD = 0x01;               //T0定時方式1
  16.     TH0 = (65536 - 500) / 256; //500us@12MHz
  17.     TL0 = (65536 - 500) % 256;

  18.         EA = 1;
  19.     TR0 = 1;
  20.     ET0 = 1;   

  21.     a = 0;
  22.     b = 10;
  23.         P3^2=0;

  24.     while(1)  {
  25.       if(!K1)
  26.           {
  27.                   delay(20);
  28.                   if(!K1)
  29.                   {
  30.                           b++;
  31.                           if(b > 19)
  32.                                   b = 19;
  33.                           while(!K1);
  34.                   }
  35.           }
  36.       if(!K2)
  37.           {
  38.                   delay(20);
  39.                   if(!K2)
  40.                   {
  41.                           b--;
  42.                           if(b < 1)
  43.                           b = 1;
  44.                           while(!K2);
  45.                   }
  46.           }

  47.       //以上兩行是檢查按鍵、延時消抖、修改占空比、等待按鍵釋放,b = 1~19
  48.       P0 = ((b / 10) << 4) + b % 10; //顯示占空比等級
  49.     }
  50. }

  51. //------------------------------------------

  52. void time0() interrupt 1
  53. {
  54.     TL0 = (65536 - 493) % 256; //補償中斷進入時間
  55.     TH0 = (65536 - 493) / 256; //500us@12MHz

  56.     a--;                       //a = 1~20

  57.     if(a == 0)  
  58.         {
  59.                 a = 20;
  60.                 P2 = 0;
  61.         } //周期=20*500us

  62.     if(a <= b)  
  63.                 P2 = 255;      //輸出到示波器

  64.     P1 = ~P2;   //輸出到LED,低電平發(fā)光
  65. }

  66. //------------------------------------------
復制代碼


回復

使用道具 舉報

ID:222948 發(fā)表于 2018-3-13 21:30 | 顯示全部樓層
把31行的P3^2=0;改為K1=0;就可以了
回復

使用道具 舉報

ID:288202 發(fā)表于 2018-3-14 10:33 | 顯示全部樓層
999333 發(fā)表于 2018-3-13 21:30
把31行的P3^2=0;改為K1=0;就可以了

您好,謝謝您的解答。我已經(jīng)解決了我之前說的問題。31行那個代碼應該是不存在的,也就是可能是我稀里糊涂的不知道怎么加上去的。不管怎樣,還是謝謝您!

但是我現(xiàn)在又發(fā)現(xiàn)了一個問題,就是當pwm調(diào)節(jié)在10-14的時候,LED會出現(xiàn)閃爍的情況,在15-19的時候,LED不會出現(xiàn)閃爍。但當我在D2(LED)再并聯(lián)一個LED之后,只有在19的時候,LED才不會出現(xiàn)閃爍,請問這是為什么呢?是電壓的問題嗎?可是一般用proteus仿真,對于電阻、電容等器件的值的大小不是沒有什么影響的嗎(難道是我一直以來的錯誤觀點?)?況且并聯(lián)電壓都一樣的呀?那是電流大小的問題嗎?
回復

使用道具 舉報

ID:288202 發(fā)表于 2018-3-14 13:33 | 顯示全部樓層
999333 發(fā)表于 2018-3-13 21:30
把31行的P3^2=0;改為K1=0;就可以了

隨后我用proteus仿真電壓表測量D2(led)兩端的電壓,發(fā)現(xiàn)跟電壓有關系,但是如果加入穩(wěn)壓電路在D2(led)之前的話,就會導致無法實現(xiàn)pwm控制LED的亮度了,這該怎么解決呢?
回復

使用道具 舉報

ID:291802 發(fā)表于 2018-3-14 14:41 來自手機 | 顯示全部樓層
proteus無法打開
回復

使用道具 舉報

ID:287155 發(fā)表于 2018-3-15 08:03 來自手機 | 顯示全部樓層
Proteus只是做51程序仿真的,在做模擬仿真是不理想的,根本達不到預期效果,最好還動手實際操作!
回復

使用道具 舉報

ID:288202 發(fā)表于 2018-3-15 11:41 | 顯示全部樓層

可能是我用的proteus版本太高了,是8.6版的好像
回復

使用道具 舉報

ID:288202 發(fā)表于 2018-3-15 11:43 | 顯示全部樓層
ASDL 發(fā)表于 2018-3-15 08:03
Proteus只是做51程序仿真的,在做模擬仿真是不理想的,根本達不到預期效果,最好還動手實際操作!

因為在外面實習,身邊沒實物,也沒開發(fā)板
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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