STC单片机实现可调PWM输出的C51程序

电子常识

2621人已加入

描述

  PWM介绍

  脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出。

  工作过程

  PWM

  PWM

  CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。

  CCMR1: OC1M[2:0]位:

  对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

  CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。

  CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

  STC单片机实现可调PWM输出的C51程序

  //以下是源程序,只需修改定义IO口就可以使用,#include 《 reg52.h 》

  #include 《 intrins.h 》

  sbit K1 =P3^2 ; //增加键

  sbit K2 =P3^3 ; //减少键

  sbit BEEP =P3^1 ; //蜂鸣器

  sbit pp =P3^7 ;

  unsigned char PWM=0x7f ; //赋初值

  void Beep();

  void delayms(unsigned char ms);

  void delay(unsigned char t);

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

  void main()

  {

  pp=1;

  TMOD=0x21 ;

  TH0=0xfc ; //1ms延时常数

  TL0=0x66 ; //频率调节

  TH1=PWM ; //脉宽调节

  TL1=0 ;

  EA=1;

  ET0=1;

  ET1=1;

  TR0=1 ;

  while(1)

  {

  do{

  if(PWM!=0xff)

  {PWM++ ;delayms(10);}

  else Beep() ;

  }

  while(K1==0);

  do{

  if(PWM!=0x02)

  {PWM-- ;delayms(10);}

  else Beep() ;

  }

  while(K2==0);

  }

  }

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

  // 定时器0中断服务程序。

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

  void timer0() interrupt 1

  {

  TR1=0 ;

  TH0=0xfc ;

  TL0=0x66 ;

  TH1=PWM ;

  TR1=1 ;

  pp=0 ; //启动输出

  }

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

  // 定时器1中断服务程序

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

  void timer1() interrupt 3

  {

  TR1=0 ;

  pp=1 ; //结束输出

  }

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

  //蜂鸣器子程序

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

  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++) ;

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分