PWM,脉冲宽度调制,简称脉冲调制,是一种最初用于无线电通信的信号调制技术,后来在控制领域中也得到了很好的应用,于是形成了独特的PWM控制技术。在很多单片机测控系统中,需要PWM控制信号,用于大功率直流控制,信号传输等场合。
但是51单片机没有PWM功能,解决这个问题可以采用软件模拟的办法实现PWM输出。
51单片机普通I/O端口产生PWM脉冲的工作量主要集中在软件设计上,因而电路设计很简单,如下图
程序流程图
程序
****************************************************************************
主程序功能为输出一个高电平宽度逐渐增加的PWM脉冲信号
****************************************************************************
#include <reg51.h> // 引用标准库的头文件
#define uchar unsigned char
#define uint unsigned int
uchar cnt1,cnt2,cnt3 cnt4,cnt5
sbit PWM=P1^0 PWM脉冲输出端
sbit RED=P1^1 红色发光管控制端
uchar flag
Void main(void)
{
TMOD=0x02; //定时器T0处于8位重装工作方式
TH0=0x00;
TL0=0x00; // T0 定时256us
EA=1; //开CPU中断
ET0=1; //开定时器0中断
PULSE=0;
RED=0; //点亮红色发光管
FLAG=0x00; //标志清零
TR0=1 //启动定时器T0
cnt1=0x00;
cnt2=0xff;
cnt3=0xff;
cnt4=0x00;
while(1)
{
If(flag=0) //PWM脉冲输出控制标志判断
{;}
else
{
ET0=0; //关闭定时器T0
RED=1; //熄灭红色发光管
}
}
}
/* 定时器0中断服务子程序 */
void timer0_int() interrupt 1 using 1
{
TR0 = 0; // 关闭T0
cnt1++;
if(cnt1>=cnt3) //判断65ms定时到否
{
PULSE=1; //PWM端开始输出高电平
cnt4++ //高电平维持时间片断数增加1
if(cnt4>=(0xff-cnt3)+1) 判断PWM脉冲是否需要跳变,即高电平时间到否
{
PULSE=0; //PWM脉冲输出为低
cnt3--; //低电平维持时间片断数减1
cnt2++; //PWM脉冲高电平维持时间控制参数加1
cnt1=0x00; //恢复65ms定时参数
}
else{;}
}
else
{
cnt1=0x00; //恢复65ms定时参数
}
if(cnt2>=0xff) //判断PWM脉冲高电平维持时间最大否
{
ET0=0; //高电平维持时间到最大,关闭定时器T0
}
TR0 = 1; // 启动T0
} |