5112|0

4008

帖子

0

TA的资源

版主

楼主
 

51定时器任意io输出pwm的呼吸灯 [复制链接]

/*定时器iopwm程序*/
typedef unsigned char uint8;
typedef unsigned int  uint16;
sfr AUXR        = 0x8E;     //0000,0000 辅助寄存器
//按键和led接口定义
sbit LED  =P3^4;
//定时器重装值
#define SYSTEM_CLOCK   11059200 //时钟频率
#define TIMER0_OVERFLOW_FREQ (25600)  //定时器溢出频率
//定时器重装值,指定类型避免浮点错误
#define TIMER0_RELOAD_VALUE  (65535-(uint16)((unsigned long)SYSTEM_CLOCK/(unsigned long)TIMER0_OVERFLOW_FREQ)+1)
#define PWM_DUTY_MASK   0x3f    //pwm控制深度级的掩位(1的个数)
#define PWM_OVERFLOW   (PWM_DUTY_MASK+1) //pwm溢出的位值
//#define PWM_CYCLE         //pwm周期
uint8 Time0_Counter=0;    //定时器0溢出计数
uint8 PWM_Value=0;     //PWM占空比值
uint16 Time_400HZ_Counter=0;  //高位计数,计数频率与PWM_DUTY_MASK定义相关
/****************400HZ,64级pwm(0x3F)******************************/
void Timer0_Service (void) interrupt 1 {//F0=1出错,中断服务函数保存了psw状态寄存器
Time0_Counter++;
if ((Time0_Counter&PWM_DUTY_MASK)==0) { //计数回0,置无效电平(led灭)
  LED=1;      //25600/64=400HZ
} else {
  //低六位有效(Time0_Counter&PWM_DUTY_MASK优化),比较符号和置位值决定输出
  if ((Time0_Counter&PWM_DUTY_MASK)>=(PWM_Value&PWM_DUTY_MASK))
   LED=0; //比较输出有效电平
}
}
/**********************主函数**************************************/
int main(void) {
//初始化T0为TIMER0_OVERFLOW_FREQ指定的溢出频率
AUXR |=0x80; //t0 1t
TMOD=0x00;  //选择定时器0,工作模式0(stc15:16位自动重装模式0)
TL0=(uint8)TIMER0_RELOAD_VALUE;
TH0=(uint8)(TIMER0_RELOAD_VALUE>>8);
TR0=1;    //开启控制端
ET0=1;     //开启定时器0中断允许,允许定时器0中断。
EA=1;   //总中断控制
while(1) {
  if ((Time0_Counter & PWM_OVERFLOW)) {
   Time0_Counter &= ~PWM_OVERFLOW;  //不重复
   Time_400HZ_Counter++;   //400HZ累加
   //使用计数变量改变占空比 //4分频的变化速率
   PWM_Value=(uint8)(Time_400HZ_Counter/4);   
   if (Time_400HZ_Counter&(4*PWM_OVERFLOW)) PWM_Value=~PWM_Value;
  }//end if (
}//end while(1)
}

此帖出自51单片机论坛
点赞 关注(2)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表