找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2459|回复: 0
收起左侧

单片机PWM波控制LED呼吸灯源程序

[复制链接]
ID:530391 发表于 2019-9-10 14:18 | 显示全部楼层 |阅读模式
程序

  1. // 利用定时器控制产生占空比可变的 PWM 波
  2. // 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
  3. // 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
  4. // 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。


  5. #include < reg51.h >
  6. #include < intrins.h >

  7. sbit  K1 =P3^2 ;                    //增加键
  8. sbit  K2 =P3^3 ;                    //减少键
  9. sbit  BEEP =P3^6 ;                //蜂鸣器
  10. unsigned char PWM=0x7f ;   //赋初值
  11. void Beep();
  12. void delayms(unsigned char ms);
  13. void delay(unsigned char t);

  14. /*********************************************************/
  15. void main()
  16. {  

  17.      P0=0xff;
  18.     TMOD=0x21 ;
  19.     TH0=0xfc ;             //1ms延时常数 12M
  20.     TL0=0x18 ;            //频率调节

  21.     TH1=PWM ;            //脉宽调节
  22.     TL1=0 ;

  23.      EA=1;
  24.      ET0=1;
  25.      ET1=1;
  26.    
  27.      TR0=1 ;

  28.    while(1)
  29.    {
  30.      do{
  31.             if(PWM!=0xff)
  32.            {PWM++ ;delayms(10);}
  33.            else Beep() ;
  34.          }
  35.      while(K1==0);

  36.      do{
  37.            if(PWM!=0x02)
  38.           {PWM-- ;delayms(10);}
  39.            else Beep() ;
  40.           }
  41.      while(K2==0);
  42.    }
  43. }

  44. /*********************************************************/
  45. // 定时器0中断服务程序.
  46. /*********************************************************/
  47. void timer0() interrupt 1
  48. {  
  49.     TR1=0 ;
  50.     TH0=0xfc ;
  51.     TL0=0x18 ;
  52.     TH1=PWM ;
  53.     TR1=1 ;
  54.     P0=0x00 ;      //启动输出
  55. }

  56. /*********************************************************/
  57. // 定时器1中断服务程序
  58. /*********************************************************/
  59. void timer1() interrupt 3
  60. {
  61.     TR1=0 ;
  62.     P0=0xff ;     //结束输出
  63. }

  64. /*********************************************************/
  65. //蜂鸣器子程序
  66. /*********************************************************/

  67. void Beep()     
  68.   {
  69.       unsigned char i  ;
  70.       for (i=0  ;i<100  ;i++)
  71.         {
  72.           delay(100)  ;
  73.           BEEP=!BEEP  ;                //Beep取反
  74.         }
  75.      BEEP=1  ;                            //关闭蜂鸣器
  76.      delayms(100);
  77.   }

  78. /*********************************************************/
  79. // 延时子程序
  80. /*********************************************************/  
  81. void delay(unsigned char t)
  82. {
  83.     while(t--)   ;
  84. }

  85. /*********************************************************/
  86. // 延时子程序
  87. /*********************************************************/
  88. void delayms(unsigned char ms)

  89. {
  90.     unsigned char i ;
  91.     while(ms--)
  92.      {
  93.         for(i = 0 ; i < 120 ; i++) ;
  94.      }
  95. }


复制代码

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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