微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 2只按键控制亮度PWM实现-源码

2只按键控制亮度PWM实现-源码

时间:10-02 整理:3721RD 点击:
两键控制亮度
使用PWM方式调整LED的亮灭周期,达到亮度变化。

  1. #include <REG51.h> //51头文件
  2. /*********************************************************************************************/
  3. //《B_无级亮度变化》
  4. #define DY_PWM501 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
  5. #define DY_MAX500 //设置最大亮度(值域:小于明亮总级数)
  6. #define DY_MIN1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
  7. sbit DY_PORT = P3^2; //设置LED连接的I/O组
  8. sbit DY_KEY1 = P3 ^ 0; //亮度加
  9. sbit DY_KEY2 = P3 ^ 7; //亮度减
  10. sbit d1 = P1 ^7;  //指示灯
  11. /*********************************************************************************************
  12. //《A_8级亮度变化》
  13. #define DY_PORTP1 //设置LED连接的I/O组
  14. #define DY_SPEED100 //设置每一个明亮级的停留时间(值域:0~65535)
  15. #define DY_PWM500 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
  16. #define DY_MAX8 //设置最大明亮(值域:小于明亮总级数)
  17. /*********************************************************************************************
  18. bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED
  19. #define [代替名][原名]  //用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1
  20. sbit  [自定义名] = [系统位名] ; //自定义系统位名。例:sbit Add_Key = P3 ^ 1;
  21. unsigned char [自定义名] ; //定义一个0~255的整数变量.例:unsigned char a;
  22. unsigned int [自定义名] ; //定义一个0~65535的整数变量
  23. /*********************************************************************************************/
  24. void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
  25. unsigned char i;
  26. while( --a != 0){
  27. for(i = 0; i < 12; i++);
  28. }     
  29. }
  30. /*********************************************************************************************/
  31. void display (unsigned int a){ //显示程序(50ms的PWM宽度)
  32. DY_PORT = 0; //LED小灯亮
  33. delay (a); //延时a的长度
  34. DY_PORT = 1; //LED小灯灭
  35. delay (DY_PWM-a);//延时总PWM长度减a
  36. }
  37. /*********************************************************************************************/
  38. void main (void){ //主程序
  39. unsigned int k=5;
  40. while (1){
  41. while(1){         //循环判断按键1按下如果按下,跳出按键1检测循环(初始化LED不亮)
  42. DY_PORT = 0xff;
  43. if(DY_KEY1 == 0)
  44. break;
  45. }

  46. while(1){        
  47. display(k); //
  48. if(DY_KEY1 == 0){ //如果按键按下则继续
  49. delay(20); //延时20mS
  50. if(DY_KEY1 == 0){ //如果按键按下则继续
  51. k++;
  52. if(k>DY_MAX){
  53. k = DY_MAX;
  54. while(1){//最高亮度显示,打开最高亮度指示灯
  55. DY_PORT = 0;
  56. d1 = 0;
  57. delay (350); //延时a的长度
  58. d1 = 1;
  59. delay (DY_PWM-350);

  60. if(DY_KEY2 == 0)
  61. break;  
  62. }   
  63. }
  64. //while(DY_KEY1 == 0); //等待按键松开
  65. }
  66. }
  67. if(DY_KEY2 == 0){ //如果按键按下则继续
  68. delay(20); //延时20mS
  69. if(DY_KEY2 == 0){ //如果按键按下则继续
  70. k--;
  71. if(k<DY_MIN){
  72. k = DY_MIN;
  73. DY_PORT = 0xff;//P1口送高电平,关闭显示
  74. while(1){    //循环判断按键1按下如果按下,跳出按键1检测循环
  75. if(DY_KEY1 == 0)
  76. break;
  77.         }
  78. }
  79. //while(DY_KEY2 == 0); //等待按键松开
  80. }
  81. }
  82.     }
  83.    }
  84. }

复制代码





非常感谢 。
还有没有了?:lol

很好不错

没有了?

正在做类此的项目  ,参考一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top