如果你想要准确的PWM,最好的办法是用定时器来做。如果用延时来做的话,那你的单片机就不能能同时处理其它的事情了。
当然,如果单片机仅仅做这一个事情的话用延时也未必不可。不过时间的计算必须要考虑每条指令的执行周期。比如你说的12Mhz的单片机,是不是1T的(即每个指令周期等于1个时钟周期)?
下面的程序是精准延时1ms的C程序,你可以参考一下。
void delay1ms(void)
{
unsigned char a,b;
for(b=129;b>0;b--)
for(a=45;a>0;a--);
}
如果要准确计算时间的话,最好是用汇编来写。如下。
DELAY1MS:
MOV R6,#81H
DL0:
MOV R5,#2DH
DJNZ R5,$
DJNZ R6,DL0
RET