找回密码
 立即注册

QQ登录

只需一步,快速开始

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

让没有PWM功能的单片机实现PWM功能

[复制链接]
跳转到指定楼层
楼主
ID:73526 发表于 2015-2-11 01:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1.         AT89S51本身没有PWM接口,程序采用软件模拟PWM,P1口控制LED亮度,模拟PWM输出控制灯的10个亮度级。
  2. #include <reg51.h>
  3. #define uInt unsigned int
  4. #define uchar unsigned char
  5. uchar PWM_T = 0;   //占空比控制变量  
  6. //////////////////主程序入口//////////////////////
  7. void main(void)        
  8. {  
  9.       bit flag = 1; //控制灯渐亮渐熄方式
  10.       uInt n;
  11.       TMOD=0x02;   //定时器0,工作模式2,8位定时模式  
  12.       TH0=241;     //写入预置初值241到定时器0,使15微秒溢出一次(11.0592MHz)  
  13.       TL0=241;     //写入预置值  
  14.       TR0=1;       //启动定时器  
  15.       ET0=1;       //允许定时器0中断   
  16.       EA=1;        //允许总中断
  17.       P1=0xff; //初始化P1  
  18.       while(1)      
  19.       {      
  20.              for(n=0;n<300;n++);  //延时,将响应定时器中断,灯会自动加/减一个档次的亮度  
  21.              if(flag==1)       //灯渐亮
  22.              PWM_T++;
  23.              else          //灯渐熄
  24.              PWM_T--;
  25.              if(PWM_T>=10) //设置灯亮度级别为10
  26.              flag=0;
  27.              if(PWM_T==0)   //限定最低亮度级别为0
  28.              flag = 1;
  29.       }         
  30. }  
  31. ///////////////////定时器0中断模拟PWM////////////////////
  32. timer0() interrupt 1 using 2   
  33. {  
  34.       static  uchar   t ;   //t用来保存当前时间在一秒中的比例位置  
  35.        t++;    //每15微秒增加1  
  36.        if(t==10)   //1.5毫秒的时钟周期  
  37.       {  
  38.              t=0;  //使t=0,开始新的PWM周期  
  39.              P1=0x00;  //使LED灯亮               
  40.       }
  41.      if(PWM_T==t)  //按照当前占空比切换输出为高电平  
  42.      P1=0xff;        //使LED灯灭           
  43. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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