找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4894|回复: 7
打印 上一主题 下一主题
收起左侧

通过按键调节PWM进而控制led亮度的proteus仿真达不到预期的效果

[复制链接]
跳转到指定楼层
楼主
各位大神,谁能帮我解答一下,为什么我的仿真达不到预期的效果,原代码和图像请参考
pwm.rar (80.14 KB, 下载次数: 50)
我所参考的链接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
我的结果截图:


单片机源程序如下:
  1. #include<reg52.h>

  2. unsigned char a, b;

  3. sbit K1 = P3^2;     //定义两个调整占空比的按键
  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,低电平发光
  65. }

  66. //------------------------------------------
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:222948 发表于 2018-3-13 21:30 | 只看该作者
把31行的P3^2=0;改为K1=0;就可以了
回复

使用道具 举报

板凳
ID:288202 发表于 2018-3-14 10:33 | 只看该作者
999333 发表于 2018-3-13 21:30
把31行的P3^2=0;改为K1=0;就可以了

您好,谢谢您的解答。我已经解决了我之前说的问题。31行那个代码应该是不存在的,也就是可能是我稀里糊涂的不知道怎么加上去的。不管怎样,还是谢谢您!

但是我现在又发现了一个问题,就是当pwm调节在10-14的时候,LED会出现闪烁的情况,在15-19的时候,LED不会出现闪烁。但当我在D2(LED)再并联一个LED之后,只有在19的时候,LED才不会出现闪烁,请问这是为什么呢?是电压的问题吗?可是一般用proteus仿真,对于电阻、电容等器件的值的大小不是没有什么影响的吗(难道是我一直以来的错误观点?)?况且并联电压都一样的呀?那是电流大小的问题吗?
回复

使用道具 举报

地板
ID:288202 发表于 2018-3-14 13:33 | 只看该作者
999333 发表于 2018-3-13 21:30
把31行的P3^2=0;改为K1=0;就可以了

随后我用proteus仿真电压表测量D2(led)两端的电压,发现跟电压有关系,但是如果加入稳压电路在D2(led)之前的话,就会导致无法实现pwm控制LED的亮度了,这该怎么解决呢?
回复

使用道具 举报

5#
ID:291802 发表于 2018-3-14 14:41 来自手机 | 只看该作者
proteus无法打开
回复

使用道具 举报

6#
ID:287155 发表于 2018-3-15 08:03 来自手机 | 只看该作者
Proteus只是做51程序仿真的,在做模拟仿真是不理想的,根本达不到预期效果,最好还动手实际操作!
回复

使用道具 举报

7#
ID:288202 发表于 2018-3-15 11:41 | 只看该作者

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

使用道具 举报

8#
ID:288202 发表于 2018-3-15 11:43 | 只看该作者
ASDL 发表于 2018-3-15 08:03
Proteus只是做51程序仿真的,在做模拟仿真是不理想的,根本达不到预期效果,最好还动手实际操作!

因为在外面实习,身边没实物,也没开发板
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表