找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于PWM控制LED灯的程序,有几个问题不懂

[复制链接]
跳转到指定楼层
楼主
ID:321712 发表于 2018-5-3 22:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机小白,网上找的程序,有几点问题不懂,希望大神解答:这段程序中a的值是多少,为什么最小亮度设置是1,最大是100,而总等级数是101,这应该怎么理解,不应该是100吗。万分感谢。
单片机源码:
  1. #include <REG51.h>//51头文件
  2. /****************************************************************/
  3. //定义亮度变化
  4. #define DY_PORT          P2    //设置LED连接的I/O组
  5. #define DY_PWM          101    //设置明亮的总级数(级数过大会出现闪烁)
  6. (值域:0~65535)
  7. #define DY_MAX          100    //设置最大亮度(值域:小于明亮总级数)
  8. #define DY_MIN      1     //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
  9. sbit DY_KEY1 = P1 ^ 0;             //亮度加
  10. sbit DY_KEY2 = P1 ^ 1;             //亮度减

  11. /****************************************************************/
  12. // 1ms延时程序(12MHz 10倍于51单片机速度时)
  13. void delay (unsigned inta){
  14.       unsigned char i;
  15.       while( --a != 0){
  16.              for(i = 0; i < 12; i++);
  17.       }                                 
  18. }
  19. /****************************************************************/
  20. //显示程序(50ms的PWM宽度)
  21. void display (unsignedint a){
  22.       DY_PORT = 0x00;                //LED小灯亮
  23.       delay (a);                                 //延时a的长度
  24.       DY_PORT = 0xff;                   //LED小灯灭
  25.       delay (DY_PWM-a);               //延时总PWM长度减a
  26. }

  27. /****************************************************************/
  28. //主程序
  29. void main (void){
  30.       unsigned int k=5;
  31.       while (1){
  32.              display(k); //
  33.              if(DY_KEY1 == 0){                            //如果按键按下则继续
  34.                     delay(20);                                       //消抖延时20mS
  35.                     if(DY_KEY1 == 0){                     //如果按键按下则继续
  36.                            k++;
  37.                            if(k>DY_MAX){
  38.                                   k = DY_MAX;
  39.                            }
  40.                            while(DY_KEY1 == 0);         //等待按键松开
  41.                     }
  42.              }
  43.              if(DY_KEY2 == 0){                            //如果按键按下则继续
  44.                     delay(20);                                        //消抖延时20mS
  45.                     if(DY_KEY2 == 0){                     //如果按键按下则继续
  46.                            k--;
  47.                            if(k<DY_MIN){
  48.                                   k = DY_MIN;
  49.                            }
  50.                            while(DY_KEY2 == 0);          //等待按键松开
  51.                     }
  52.              }
  53.     }
  54. }
复制代码


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

使用道具 举报

沙发
ID:228893 发表于 2018-5-4 08:59 | 只看该作者
这个和他的程序处理方式有关,      delay (DY_PWM-a); 是为了保证DY_PWM-a>0;你在仔细看看delay函数的写法,参数的如果等于0会有问题。
回复

使用道具 举报

板凳
ID:253758 发表于 2018-5-4 09:32 | 只看该作者
本帖最后由 余晖 于 2018-5-4 09:35 编辑

a为一个形参,你可以理解为一个参数,初始值由main中指令unsigned int k=5;得出k=5,由指令 display(k);将k传递给a;
回复

使用道具 举报

地板
ID:253758 发表于 2018-5-4 09:33 | 只看该作者
由这条指令 display(k);将k值传递给a
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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