单片机中,如何使用计时器1来产生PWM波形。主要是和计时器0的区别。谢谢喽。

mcs-51单片机,主要是用计时器1和计时器0产生pwm波形的区别。

//如果是用51单片机
//头文件
#include<reg51.h>

typedef unsigned char uint8;
typedef unsigned int uint16;
typedef long unsigned int uint32;

uint16 time0;
uint16 PULSE_WIDTH = 0x300; //脉冲宽
uint8 DUTY_CYCLE = PULSE_WIDTH*(1/5);//占空比
///////////////////////////////////////////////延时子程序
void delay(uint8 ms)
{
uint8 i;
while(ms--)
{
for(i=0;i<120;i++);
}
}

///////////////////////////////////////////定时器0,控制低电平
void Timer0() interrupt 1
{
TR1 = 0; //关闭定时器1
time0 = 0xFFFF - PULSE_WIDTH; //定时器0初始值
TL0 = (uint8)time0;
TH0 = time0 >> 8;
TH1 = DUTY_CYCLE;
TR1 = 1;
P0 = 0x00; //打开定时器1
}

//////////////////////////////////////////////定时器1.控制高电平
void Timer1() interrupt 3
{
TR1 = 0; //关闭定时器1
P0 = 0xFF;
}

//////////////////////////////////主函数
int main(void)
{
TMOD = 0x21; //定时器1:工作方式1,定时器0:工作方式2
time0 = 0xFFFF - PULSE_WIDTH; //定时器0初始值
TL0 = (uint8)time0;
TH0 = time0 >> 8;
TL1 = DUTY_CYCLE;
TH1 = DUTY_CYCLE;
EA = 1; //允许全局中断
ET0 = 1; //允许定时器0中断
ET1 = 1; //允许定时器1中断
TR0 = 1;

////////////////// //主循环
while(1)
{

do{
if(DUTY_CYCLE != PULSE_WIDTH*(1/4))
{
DUTY_CYCLE++;
delay(5);
}
else break;
}while(1);

do{
if(DUTY_CYCLE != 0x01)
{
DUTY_CYCLE--;
delay(5);
}
else break;
}while(1);

}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-21
楼主,用什么单片机呀,人一些带PWM功能的,你直接给初值就可以了,没有PWM的,你就一个固定时间分成多少等分来实现PWM功能
第2个回答  2010-12-21
你说的什么单片机?如果是51的话,定时器0和1在模拟PWM时貌似没有区别
区别全在于你如何编程