找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 73787|回复: 20
收起左侧

51单片机怎么模拟PWM波(详解!带程序)

  [复制链接]
ID:70941 发表于 2014-12-26 18:29 | 显示全部楼层 |阅读模式




51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。

一般可以使用两个定时器来实现,如果单片机是S51的话使用T0和T1,如果是S52的话建议使用T0和T2,因为定时器在工作方式2的八位重装模式下定时比较准确,这里我们使用T0和T1
用T0定时器完成PWM输出,脉宽固定,T1来决定高平的宽带来进行PWM调制
具体程序如下:

其中晶振12M,载波频率20KHZ,直接用P0.1来驱动直流电机,直流电机正极接电源正,单片机低平驱动,这样灌电流大。
  1. #include < reg51.h >
  2. #include < intrins.h >

  3. sbit  K1 =P1^4 ;                    //增加键
  4. sbit  K2 =P1^5 ;                    //减少键
  5. sbit  P00 =P0^1;
  6. sbit  BEEP =P3^7 ;                //蜂鸣器
  7. unsigned char PWM=0xe7;   //赋初值

  8. void Beep();
  9. void delayms(unsigned char ms);
  10. void delay(unsigned char t);

  11. /*********************************************************/
  12. void main()
  13. {

  14.      P1=0xff;
  15.     TMOD=0x21 ;
  16.     TH0=0xff ;             //50us延时常数
  17.     TL0=0xce ;            //频率调节

  18.     TH1=PWM ;            //脉宽调节
  19.     TL1=0 ;

  20.      EA=1;
  21.      ET0=1;
  22.      ET1=1;
  23.    
  24.      TR0=1 ;

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

  33.      do{
  34.            if(PWM!=0xce)
  35.           {PWM-- ;delayms(10);}
  36.            else Beep() ;
  37.           }
  38.      while(K2==0);
  39.    }
  40. }

  41. void timer0() interrupt 1
  42. {
  43.     TR1=0 ;
  44.     TH0=0xff ;
  45.     TL0=0xce ;
  46.     TH1=PWM ;
  47.     TR1=1 ;
  48.     P00=0 ;      //启动输出
  49. }


  50. void timer1() interrupt 3
  51. {
  52.     TR1=0 ;
  53.     P00=1 ;     //结束输出
  54. }

  55. /*********************************************************/
  56. //蜂鸣器子程序
  57. /*********************************************************/

  58. void Beep()   
  59.   {
  60.       unsigned char i  ;
  61.       for (i=0  ;i<100  ;i++)
  62.         {
  63.           delay(100)  ;
  64.           BEEP=!BEEP  ;                //Beep取反
  65.         }
  66.      BEEP=1  ;                            //关闭蜂鸣器
  67.      delayms(100);
  68.   }

  69. /*********************************************************/
  70. // 延时子程序
  71. /*********************************************************/
  72. void delay(unsigned char t)
  73. {
  74.     while(t--)   ;
  75. }

  76. /*********************************************************/
  77. // 延时子程序
  78. /*********************************************************/
  79. void delayms(unsigned char ms)

  80. {
  81.     unsigned char i ;
  82.     while(ms--)
  83.      {
  84.         for(i = 0 ; i < 120 ; i++) ;
  85.      }
  86. }

  87. /*********************************************************/
复制代码




评分

参与人数 2黑币 +17 收起 理由
莫德尔 + 9 很给力!
这货不是小武啊 + 8 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:75851 发表于 2015-4-1 00:49 | 显示全部楼层
看看学习一下
回复

使用道具 举报

ID:74143 发表于 2015-4-3 14:31 | 显示全部楼层
这款程序在学习板上试了一下,不是很理想。硬件是调节LED灯的亮度变化。
回复

使用道具 举报

ID:72611 发表于 2015-4-4 17:04 | 显示全部楼层
学习了,谢谢分享
回复

使用道具 举报

ID:76142 发表于 2015-4-4 23:22 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:80976 发表于 2015-6-21 10:24 | 显示全部楼层
看看效果如何,感谢分享
回复

使用道具 举报

ID:184049 发表于 2017-4-1 18:03 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:186002 发表于 2017-4-4 14:08 | 显示全部楼层
终于明白了点儿了,不错,赞一个
回复

使用道具 举报

ID:199329 发表于 2017-7-20 10:29 | 显示全部楼层
谢谢了
回复

使用道具 举报

ID:224984 发表于 2017-8-5 15:26 | 显示全部楼层
很好 但是P00是什么意思
回复

使用道具 举报

ID:248932 发表于 2017-12-4 21:30 | 显示全部楼层
不知道自己能不能学的会
回复

使用道具 举报

ID:139071 发表于 2018-1-19 16:08 | 显示全部楼层
楼主分享
回复

使用道具 举报

ID:272625 发表于 2018-2-17 16:36 | 显示全部楼层
我把程序改到自己的开发板上实验效果不好,调节范围太小了.
回复

使用道具 举报

ID:290932 发表于 2018-3-13 19:20 | 显示全部楼层
TR1为什么不赋1.
回复

使用道具 举报

ID:291446 发表于 2018-3-13 19:36 | 显示全部楼层
不错用定时器实现的
回复

使用道具 举报

ID:138443 发表于 2018-4-27 23:47 | 显示全部楼层
学习学习,谢谢
回复

使用道具 举报

ID:297166 发表于 2018-9-12 17:40 | 显示全部楼层
强烈建议加一个三极管驱动,8550之类的,这样很可能烧单片机,过几天可能的话我分享一下我的作品
回复

使用道具 举报

ID:272269 发表于 2018-10-8 13:36 | 显示全部楼层
超给力
回复

使用道具 举报

ID:398758 发表于 2018-10-8 16:48 | 显示全部楼层
请问这样做脉冲输出能占用单片机多少资源?比如我想做个30K的方波输出驱动,响应速度怎样
回复

使用道具 举报

ID:398758 发表于 2018-10-9 12:30 | 显示全部楼层
也可以用单片机直接驱动高速光耦再驱动其他器件,如三极管或mos管
回复

使用道具 举报

ID:475617 发表于 2019-2-26 15:42 | 显示全部楼层
学习学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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