做逆变是不行的,我测了下同期160多ms ,频率6.8HZ,不知道要怎么改,请高手指正。。。(很多人说用PIC,或STC的MCU,可我手上只有AT89s52,再者我也只是拿来玩玩,,,学学单片机的)
贴代码:
#include "at89x52.h"
sbit led0=P0^0;
sbit led1=P0^1;//这里是spwm输出第一组
sbit led2=P0^2;//这里是spwm第二组
bit flag_out;//标志位用来切换是第一组输出还是第二组输出
unsigned char t_num=0;
unsigned char spwm_tab[16]={0,20,38,56,71,83,92,98,100,98,92,83,71,56,38,20};//用excel算的,只取这几个简单些
void delayus()
{
unsigned int tm;
for(tm=2000;tm>0;tm--)
{
{;}
}
}
void int_time0(void)
{
TMOD=0x02;//之前是TMOD=0x11,中断后还要加初值,现在改为自动重装。
EA=1;
ET0=1;
TH0=230/256;//
TL0=230%256;//理论上应该256-230=26us
}
void timer0(void) interrupt 1
{
static unsigned char c_time=0;
if(spwm_tab[t_num]>c_time)
{
if(flag_out)led1=1;
else led2=1;
}
else led1=0,led2=0;
c_time=c_time+1;
if(c_time>99)
{
c_time=0;
t_num=t_num+1;
if(t_num>15)t_num=0,flag_out=~flag_out;
}
// TH0=65530/256;
//TL0=65530%256;/*这个因为有重装就不用了,省了两条指令*/
}
void main (void)
{
P0=0xff;
int_time0();
TR0=1;
while(1)
{led0=~led0;
delayus();
}
}
今天改了代码,顺便拍了两张
周期40多ms,22.7HZ,比之前的代码要高了,但仍不能实用。。。继续ing。。。