用单片机管脚输出PWM波,请问我这个程序对吗?输出的高电平时间误差会大吗?,用定时器0,任选一管脚P21,使其输出频率50HZ,周期20ms,输出1500us的高电平时间
具体程序如下:
#include <stc12c5a.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P2^1;//P21输出PWM波
uchar time; //占空比
/**单片机晶振11.0592MHZ,时钟周期为1/12us,8位定时器最大定时时间256us**/
/** 输出PWM频率为50HZ,周期为0.02s即20ms,定时0.1ms,即100us,中断200次**/
/** 定时器初值:65535-100+1=FF9A **/
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void time0init()//定时器0初始化
{
TMOD=0X01;//定时器0,工作方式1,16位定时器
TH0=0XFF;
TL0=0X9A;//定时0.1ms
ET0=1;
EA=1;
TR0=1;//开启定时器
}
void timer0() interrupt 1
{
TR0=0;//赋初值时关闭定时器
TH0=0Xff; //定时器赋初值
TL0=0X9A; //定时器赋初值
TR0=1;
time++;
if(time>=200)//PWM周期为0.1ms*200=20ms
time=0;
if(time<=15)//占空比为15%,高电平时间为1500us
{
PWM=1;
}
else
PWM=0;
}
void main()
{
delay(5000);
time0init();
while(1)
{
}
}