找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4792|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机定时产生pwm波程序

[复制链接]
跳转到指定楼层
楼主
ID:161768 发表于 2017-3-13 02:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PWM(脉宽调制)在很多场合都用得上,例如LED亮度控制,开关电源输出电圧控制等。
这里采用简单的定时器实现PWM波输出,通过更改定时器定时参数,控制IO口输出
波形高低电平持续时间,实现PWM波。

代码如下:
  1. #include<reg52.h>

  2. #define T0_INTERRUPT 1  //T0中断向量号
  3. #define PWMH_L 0x9C
  4. #define PWMH_H 0xFF   //PWM低电平时间0.1ms

  5. #define PWML_L 0xCE
  6. #define PWML_H 0xFF    //PWM高电平时间0.05ms

  7. sbit LED1 = P1^0;   //常亮LED,作为对比,仿真看不出效果
  8. sbit LED2 = P1^1;    //PWM驱动LED



  9. typedef unsigned char uchar;
  10. typedef unsigned int uint;

  11. void Init_T0();

  12. void main()
  13. {
  14.     LED1 = 0;      //点亮LED1
  15.     LED2 = 1;      //熄灭LED2
  16.     Init_T0();    //初始化定时器0
  17.     while(1)
  18.     {
  19.         PCON |= 0x01; //单片机进入休眠模式,节省功耗
  20.     }
  21. }

  22. void Init_T0()
  23. {
  24.     TMOD &= 0xF0;
  25.     TMOD |= 0x01;  //16位定时器模式
  26.    
  27.     TH0 = PWML_H;
  28.     TL0 = PWML_L;
  29.    
  30.     EA = 1;       //开全局中断
  31.     ET0 = 1;      //允许T0中断
  32.     TR0 = 1;      //启动定时器
  33. }

  34. void T0_Interrupt() interrupt T0_INTERRUPT
  35. {
  36.     TF0 = 0;
  37.     if(LED2 == 1)
  38.     {
  39.         LED2 = 0;        //设置低电平持续时间,LED2亮
  40.         TH0 = PWMH_H;
  41.         TL0 = PWMH_L;
  42.     }
  43.     else
  44.     {
  45.         LED2 = 1;        //设置高电平持续时间,LED2灭        
  46.         TH0 = PWML_H;
  47.         TL0 = PWML_L;
  48.     }
  49. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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