单片机
返回首页

单片机产生占空比可调方波(PWM)

2015-04-30 来源:51hei

/****************************************************************                                                       

            程序名称:   发光二极管D1进行亮度控制
            版本:      VER1.0
            适用板本:  51hei学习板      
利用定时器控制产生占空比可变的PWM波对发光二极管D1进行亮度控制
按S2,PWM值增加,则占空比减小,D1灯变亮。
按S3,PWM值减小,则占空比增加,D1灯变暗。
当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。
*****************************************************************/

#include
#include
sbit  S2 =P3^4 ;        //PWM值减少键
sbit  S3 =P3^5 ;       //PWM值增加键
sbit  BEEP =P2^3 ;         //蜂鸣器
unsigned char PWM=0x03 ;   //赋初值

///////////////////////////////////////
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{   
    P1=0xff;
    TMOD=0x00 ;
  TH0=0x00 ;           //延时常数
    TL0=0x00 ;           //频率调节
    TH1=PWM ;            //脉宽调节
    TL1=0xff ;
EA=1;
ET0=1;
ET1=1;
    TR0=1 ;


   while(1)
   {
 do{
     if(PWM!=0xff)
    {PWM++ ;delayms(10);}
        else Beep() ; 
   }
    while(S3==0);

 do{
      if(PWM!=0x02)
     {PWM-- ;delayms(10);}
      else Beep() ; 
   }
    while(S2==0);
  }
}

/*********************************************************/
// 定时器0中断服务程序  (频率)
/*********************************************************/
void timer0() interrupt 1 
{  
    TR1=0 ;
    TH0=0x00;
    TL0=0x00 ;
    TH1=PWM ;
    TR1=1 ;
    P1=0xfe ;      //启动输出
}

/*********************************************************/
// 定时器1中断服务程序 (脉宽)
/*********************************************************/
void timer1() interrupt 3 

    TR1=0 ;
    P1=0xff ;     //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()     
  {
    unsigned char i  ;
    for (i=0  ;i<100  ;i++)
      {
        delay(100)  ;
        BEEP=!BEEP  ;                //Beep取反
      } 
    BEEP=1  ;                        //关闭蜂鸣器
 delayms(100);
  }

/*********************************************************/
// 延时子程序
/*********************************************************/  
void delay(unsigned char t)
 { 
   while(t--)   ;
 }

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
   unsigned char i ;
   while(ms--)
    {
      for(i = 0 ; i < 120 ; i++) ;
    }
}

/*********************************************************/

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章