1. #include <reg51.h>
    2. #define uint unsigned int
    3. #define uchar unsigned char
    4. uchar time;
    5. double count = 26; //定义占空比,并初始占空比为26%
    6. sbit PWM = P2 ^ 0; //P2^0口输出PWM
    7. sbit key_add = P3 ^ 4; //电机加速的按键 的I/O口
    8. sbit key_dec = P3 ^ 5; //电机减速的按键 的I/O口
    9. /************函数声明**************/
    10. void delayxms(uint z); //延时
    11. void Motor_add(); //电机加速,即增加占空比
    12. void Motor_dec(); //电机减速,即减少占空比
    13. void timer0_init(); //定时器0初始化
    14. /*********主函数********************/
    15. void main()
    16. {
    17. timer0_init();
    18. delayxms(5);
    19. while (1)
    20. {
    21. Motor_add();
    22. Motor_dec();
    23. }
    24. }
    25. /****************延时处理**********************/
    26. void delayxms(uint z) //延时xms程序
    27. {
    28. uint x, y;
    29. for (y = z; x > 0; x--)
    30. for (y = 110; y > 0; y--);
    31. }
    32. void Motor_add() //电机加速
    33. {
    34. if (key_add == 0)
    35. {
    36. delayxms(2); //此处时间不能太长,否者会的中断产生冲突
    37. if (key_add == 0)
    38. {
    39. count += 0.5; //每按一次加速按键占空比加0.5
    40. if (count >= 32) //限定占空比上限
    41. {
    42. count = 32;
    43. }
    44. }
    45. while (!key_add);
    46. }
    47. }
    48. void Motor_dec() //电机减速
    49. {
    50. if (key_dec == 0)
    51. {
    52. delayxms(2); //此处时间不能太长,否者会的中断产生冲突
    53. if (key_dec == 0)
    54. {
    55. count -= 0.5; //每按一次减速按键占空比减0.5
    56. if (count <= 25) //限定占空比下限
    57. {
    58. count = 25;
    59. }
    60. }
    61. while (!key_dec);
    62. }
    63. }
    64. /***********定时器0初始化***********/
    65. void timer0_init()
    66. {
    67. TMOD = 0x01; //定时器0工作于方式1
    68. TH0 = (65536 - 10) / 256;
    69. TL0 = (65536 - 10) % 256;
    70. TR0 = 1;
    71. ET0 = 1;
    72. EA = 1;
    73. }
    74. /**************定时0中断处理******************/
    75. void timer0_int() interrupt 1
    76. {
    77. TR0 = 0; //设置定时器初值期间,关闭定时器
    78. TH0 = (65536 - 10) / 256;
    79. TL0 = (65536 - 10) % 256;
    80. TR0 = 1;
    81. time++;
    82. if (time < count) //count为占空比
    83. {
    84. PWM = 1; //输出高电平
    85. }
    86. else
    87. PWM = 0;
    88. if (time >= 100)
    89. {
    90. time = 0;
    91. }
    92. }